SDK
Python SDK
Quickstart

Python SDK Quickstart

Prerequisites

  • Python 3.11+
  • SnipeRoute account and API key
  • SDK installed (pip install sniperoute)

Step 1: Set Up Environment

Create a .env file:

SNIPEROUTE_API_KEY=sk_live_your_api_key_here
SNIPEROUTE_API_URL=https://api.sniperoute.io

Step 2: Initialize Client

from sniperoute import SnipeRouteClient
 
# Automatically loads from environment variables
client = SnipeRouteClient()

The client automatically loads SNIPEROUTE_API_KEY and SNIPEROUTE_API_URL from your .env file.

Step 3: Create Your First Trade Intent

import asyncio
from sniperoute import SnipeRouteClient
from sniperoute.models import TradeIntentRequest, OrderSide, OrderType
from decimal import Decimal
 
async def main():
    # Initialize client with async context manager
    async with SnipeRouteClient() as client:
        # Create Trade Intent
        intent = TradeIntentRequest(
            intent_id="my_first_trade",
            symbol="AAPL",
            side=OrderSide.BUY,
            quantity=Decimal("10"),
            order_type=OrderType.MARKET,
            broker_id="mock"  # Use "mock" for testing
        )
 
        # Submit to SnipeRoute
        response = await client.create_intent(intent)
 
        print(f"Intent created!")
        print(f"   Intent ID: {response.intent_id}")
        print(f"   Status: {response.status}")
        print(f"   Internal ID: {response.id}")
 
asyncio.run(main())

Expected Output

Intent created!
   Intent ID: my_first_trade
   Status: pending
   Internal ID: 550e8400-e29b-41d4-a716-446655440000

Step 4: Check Intent Status

async def check_status():
    async with SnipeRouteClient() as client:
        # Get intent by your external ID
        intent = await client.get_intent_by_external_id("my_first_trade")
 
        print(f"Status: {intent.status}")
        print(f"Symbol: {intent.symbol}")
        print(f"Orders: {len(intent.orders)}")
 
        # Check fills
        for order in intent.orders:
            print(f"\nOrder {order.broker_order_id}:")
            print(f"  Status: {order.status}")
 
            for fill in order.fills:
                print(f"  Fill: {fill.quantity} @ ${fill.price}")
 
asyncio.run(check_status())

Complete Example with Error Handling

import asyncio
from sniperoute import SnipeRouteClient
from sniperoute.models import (
    TradeIntentRequest,
    OrderSide,
    OrderType,
    TimeInForce
)
from sniperoute.exceptions import (
    SnipeRouteAPIError,
    ValidationError,
    ConflictError
)
from decimal import Decimal
 
async def create_limit_order():
    try:
        # Initialize client with async context manager
        async with SnipeRouteClient() as client:
            # Create limit order
            intent = TradeIntentRequest(
                intent_id="limit_order_001",
                symbol="TSLA",
                side=OrderSide.BUY,
                quantity=Decimal("5"),
                order_type=OrderType.LIMIT,
                limit_price=Decimal("250.00"),
                time_in_force=TimeInForce.GTC,
                broker_id="mock"
            )
 
            # Submit intent
            print("Submitting Trade Intent...")
            response = await client.create_intent(intent)
 
            print(f"Intent submitted successfully!")
            print(f"   Intent ID: {response.intent_id}")
            print(f"   Symbol: {response.symbol}")
            print(f"   Limit Price: ${response.limit_price}")
            print(f"   Status: {response.status}")
 
            # Check status
            print("\nChecking status...")
            status = await client.get_intent_by_external_id("limit_order_001")
 
            if status.status == "filled":
                print("Order fully filled!")
                for order in status.orders:
                    for fill in order.fills:
                        print(f"   {fill.quantity} shares @ ${fill.price}")
            elif status.status == "pending":
                print("⏳ Order pending execution...")
 
    except ValidationError as e:
        print(f"Validation error: {e.message}")
    except ConflictError as e:
        print(f"Duplicate intent_id: {e.message}")
    except SnipeRouteAPIError as e:
        print(f"API error: {e.message}")
 
if __name__ == "__main__":
    asyncio.run(create_limit_order())

Common Order Types

Market Order

intent = TradeIntentRequest(
    intent_id="market_001",
    symbol="AAPL",
    side=OrderSide.BUY,
    quantity=Decimal("10"),
    order_type=OrderType.MARKET,
    broker_id="my_broker"
)

Limit Order

intent = TradeIntentRequest(
    intent_id="limit_001",
    symbol="AAPL",
    side=OrderSide.BUY,
    quantity=Decimal("10"),
    order_type=OrderType.LIMIT,
    limit_price=Decimal("175.00"),
    time_in_force=TimeInForce.GTC,
    broker_id="my_broker"
)

Stop-Loss Order

intent = TradeIntentRequest(
    intent_id="stop_001",
    symbol="AAPL",
    side=OrderSide.SELL,
    quantity=Decimal("10"),
    order_type=OrderType.STOP,
    stop_price=Decimal("170.00"),
    broker_id="my_broker"
)

Stop-Limit Order

intent = TradeIntentRequest(
    intent_id="stop_limit_001",
    symbol="AAPL",
    side=OrderSide.SELL,
    quantity=Decimal("10"),
    order_type=OrderType.STOP_LIMIT,
    stop_price=Decimal("170.00"),
    limit_price=Decimal("168.00"),
    broker_id="my_broker"
)

Using Different Brokers

Replace "mock" with your connected broker:

# Alpaca
broker_id="alpaca_abc123"
 
# Interactive Brokers
broker_id="ibkr_xyz789"
 
# Charles Schwab
broker_id="schwab_def456"
Connect Broker

Learn how to connect your broker account

Environment Configuration

Direct Configuration

client = SnipeRouteClient(
    base_url="https://api.sniperoute.io",
    api_key="sk_live_your_api_key_here"
)

Environment Variables (Recommended)

import os
from sniperoute import SnipeRouteClient
 
# Option 1: Automatic (reads .env)
client = SnipeRouteClient()
 
# Option 2: Explicit
client = SnipeRouteClient(
    api_key=os.getenv("SNIPEROUTE_API_KEY"),
    base_url=os.getenv("SNIPEROUTE_API_URL")
)

Next Steps