# Notte
URL: /integrations/notte

---
title: Notte
sidebarTitle: Notte
description: Reliable Python web-agent framework focused on stable navigation and structured outputs.
llm: true
---

Notte is a Python framework for building reliable web agents with stable navigation and structured outputs. The Steel integration connects a Notte session to a Steel browser, so Notte handles the agent loop and Steel handles the cloud browser plumbing.

Use it for tasks where reliable navigation and typed outputs matter more than autonomy.

### Requirements

*   **Steel API Key**: Active Steel subscription
*   **Gemini API Key** (or another supported provider): Notte's default model is Gemini
*   **Python**: 3.11+

### Connect Steel to Notte

Pass Steel's CDP URL into a `notte.Session`:

```python Python -wc
import notte
from steel import Steel

client = Steel(steel_api_key=STEEL_API_KEY)
session = client.sessions.create()
cdp_url = f"{session.websocket_url}&apiKey={STEEL_API_KEY}"

with notte.Session(cdp_url=cdp_url) as notte_session:
    agent = notte.Agent(
        session=notte_session,
        reasoning_model="gemini/gemini-2.5-flash",
    )
    response = agent.run(task="Go to Wikipedia and search for machine learning")
```

Full runnable starter: [Steel + Notte recipe →](/cookbook/notte)

### FAQ

### Do I need to change my existing Notte code to use Steel?

No — pass `cdp_url` into `notte.Session` and Notte runs its agent loop against the Steel browser. Your `notte.Agent` setup and `agent.run(task=...)` calls stay the same.

### How do I connect Notte to a Steel browser session?

Create a session with `client.sessions.create()`, build `cdp_url = f"{session.websocket_url}&apiKey={STEEL_API_KEY}"`, and open `notte.Session(cdp_url=cdp_url)` as a context manager, passing it to `notte.Agent(session=notte_session)`.

### Does Notte work with Steel's proxies, stealth mode, and CAPTCHA solving?

Yes — enable them on `sessions.create()` (e.g. `use_proxy`, `solve_captcha`, `stealth_config`). Notte connects over the CDP URL and is unaware of how the session was provisioned.

### Which model does Notte use by default?

Gemini — the requirements call for a Gemini API key (or another supported provider), and the example sets `reasoning_model="gemini/gemini-2.5-flash"` on the agent. Python 3.11+ is required.


### Resources

*   [Notte documentation](https://docs.notte.cc) – Concepts, agent APIs, and examples
*   [Steel Sessions API reference](/api-reference) – Programmatic session control for Steel browsers
*   [Steel Discord](https://discord.gg/steel-dev) – Get help and share what you build
