Official SDKs
Production-ready client libraries for Python and Node.js with full type support, automatic retries, and idiomatic APIs.
Best For
Teams building inside Python or Node who want typed clients instead of raw HTTP calls.
Read This If
You care about retries, async support, version pinning, and predictable integration behavior.
Go Next
Use quickstart for setup or examples if you want full scripts instead of reference-style snippets.
Installation
# Install with pip
pip install evsignals
# Or with poetry
poetry add evsignals
# Or with pipenv
pipenv install evsignals Configuration
import evsignals
# Basic initialization
client = evsignals.Client(
api_key="evs_live_your_api_key"
)
# With all configuration options
client = evsignals.Client(
api_key="evs_live_your_api_key",
base_url="https://api.evsignals.com", # Custom endpoint
timeout=30.0, # Request timeout (seconds)
max_retries=3, # Auto-retry on failure
api_version="2026-03-01" # Pin to specific version
)
# Using environment variable (recommended)
# Set EVSIGNALS_API_KEY in your environment
client = evsignals.Client() # Auto-loads from env EVSIGNALS_API_KEY environment variable. The SDK will automatically use it.
Async Support
Both SDKs support async/await for non-blocking I/O. Use concurrent requests to improve performance.
import asyncio
import evsignals
async def main():
# Use async context manager
async with evsignals.AsyncClient() as client:
# Make concurrent requests
signals, account = await asyncio.gather(
client.signals.live(min_ev=2.0),
client.account.get()
)
print(f"Found {len(signals)} signals")
print(f"Account: {account.email}")
asyncio.run(main()) Type Safety
Get full IDE autocomplete and type checking. The Python SDK includes comprehensive type hints, and the Node.js SDK is written in TypeScript.
from evsignals import Client
from evsignals.types import Signal, Quote, Account
def process_signal(signal: Signal) -> None:
"""Process a single signal with full type safety."""
print(f"Event: {signal.event}")
print(f"EV: {signal.ev_percentage}%")
print(f"Odds: {signal.best_odds}")
# IDE autocomplete works on all SDK objects
client = Client()
signals: list[Signal] = client.signals.live()
for signal in signals:
process_signal(signal) Error Handling
Both SDKs provide typed exception classes for different error scenarios. Handle each error type appropriately.
from evsignals import Client
from evsignals.exceptions import (
EVSignalsError, # Base exception
AuthenticationError, # 401 errors
RateLimitError, # 429 errors
NotFoundError, # 404 errors
ValidationError, # 400 errors
APIError # All other API errors
)
client = Client()
try:
signals = client.signals.live(min_ev=2.0)
except AuthenticationError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after}s")
except ValidationError as e:
print(f"Invalid parameter: {e.param}")
except EVSignalsError as e:
print(f"API error: {e.message}") Features
| Feature | Python | Node.js |
|---|---|---|
| Async Support | AsyncClient | Native async/await |
| Type System | Type hints (PEP 484) | TypeScript (.d.ts) |
| Module Format | PyPI package | ESM + CommonJS |
| Min Runtime | Python 3.8+ | Node.js 16+ |
| Automatic Retries | ||
| Rate Limit Handling | ||
| Webhook Verification | ||
| Custom HTTP Client |