Notte + Steel: Bring Your Own Browser Infrastructure

Sam's profile picture
Sam
February 17, 2026
Share

Notte agents now support Steel as an optional browser runtime. If you prefer to run your automations on external infrastructure, or want to leverage Steel's specific capabilities for certain workflows, you can point your Notte agent at Steel's CDP endpoint without changing your code.

How It Works

The integration is straightforward: Steel provisions a cloud browser, Notte controls it via CDP.

main.js
import os
from notte_sdk import NotteClient
from steel import Steel

# Initialize clients
steel_client = Steel(api_key=os.getenv("STEEL_API_KEY"))
notte_client = NotteClient()

# Create a browser session on Steel
steel_session = steel_client.sessions.create()

# Connect Notte to Steel's browser via CDP
with notte_client.Session(cdp_url=steel_session.websocket_url) as session:
    # Create an agent with a task
    agent = notte_client.Agent(session=session, max_steps=10)

    # Run your automation task
    result = agent.run(
        task="extract pricing plans from https://www.notte.cc"
    )

For production workflows that need persistent sessions across multiple tasks:

main.js
import os
from notte_sdk import NotteClient
from steel import Steel
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

def main():
    # Initialize clients
    steel_api_key = os.getenv("STEEL_API_KEY")
    notte_api_key = os.getenv("NOTTE_API_KEY")
    
    if not steel_api_key:
        raise ValueError("STEEL_API_KEY not found in environment variables")
    if not notte_api_key:
        raise ValueError("NOTTE_API_KEY not found in environment variables")

    steel_client = Steel(api_key=steel_api_key)
    notte_client = NotteClient(api_key=notte_api_key)

    # Create a browser session on Steel
    print("Creating browser session on Steel...")
    steel_session = steel_client.sessions.create()

    try:
        # Connect Notte to Steel's browser via CDP
        print("Connecting Notte to Steel browser...")
        with notte_client.Session(cdp_url=steel_session.websocket_url) as session:
            # Create an agent with a task
            agent = notte_client.Agent(session=session, max_steps=10)

            # Run your automation task
            result = agent.run(
                task="extract pricing plans from https://www.notte.cc"
            )

            print(f"Task completed: {result.answer}")

    except Exception as e:
        print(f"Error during automation: {e}")

    finally:
        # Always clean up the browser session
        steel_client.sessions.delete(steel_session.id)
        print("Browser session cleaned up")

if __name__ == "__main__":
    main()

Why This Matters

Notte provides intelligent browser automation, such as task planning, navigation, form filling, anti-detection, and session management, out of the box. For teams that want to bring their own browser infrastructure or prefer Steel's approach to browser provisioning, the integration is seamless.

Different teams have different infrastructure requirements. Some prefer Notte's native browser runtime. Others want to use Steel for specific scaling or persistence needs. Now you can choose what works best for your workflow, all from within Notte.

It's all about giving teams more room to experiment with production-grade environments and optimise without friction.

The Bottom Line

Notte gives you the framework to build intelligent browser agents. Now you can run those agents on the infrastructure that makes sense for your stack, whether that's Notte's built-in options or Steel's browsers.

Learn more: https://docs.notte.cc/integrations/steel

Steel: Browser Infrastructure for AI Agents