Skip to main content

Rulebook Python SDK

The official Python client for the Rulebook Company API — access exchange fee schedule and rebate data across US trading venues.

Python 3.11+ License: MIT

Installation

pip install rulebook-python

Usage

from rulebook import Rulebook

client = Rulebook(api_key="your-api-key")

# List all exchanges
exchanges = client.exchanges.list()
for exchange in exchanges:
    print(f"{exchange.name}: {exchange.display_name} ({exchange.record_count} records)")

# Get details for a specific exchange
detail = client.exchanges.retrieve("NYSE")
print(f"Date range: {detail.date_range.earliest} to {detail.date_range.latest}")
print(f"Fee types: {detail.fee_types}")
print(f"Actions: {detail.actions}")

# List fee schedule results (with filtering)
results = client.fee_schedule_results.list(
    exchange_name=["fee_cboe_us_options"],
    fee_type=["Option"],
    latest_only=True,
    page_size=10,
)
for item in results.data:
    print(f"{item.exchange_name} | {item.fee_type} | {item.fee_amount}")

# Get a single fee schedule result
result = client.fee_schedule_results.retrieve("some-uuid")

# Get available filter values
filters = client.fee_schedule_results.get_filters()
print(f"Exchanges: {filters.exchange_names}")
print(f"Fee types: {filters.fee_types}")

# Get results by extraction version
version_results = client.fee_schedule_results.get_results_by_version("version-uuid")

client.close()

Authentication

Pass your API key directly or set the RULEBOOK_API_KEY environment variable:

# Option 1: Pass directly
client = Rulebook(api_key="...")

# Option 2: Environment variable
# export RULEBOOK_API_KEY=...
client = Rulebook()

Async support

Every method has an async counterpart via AsyncRulebook:

import asyncio
from rulebook import AsyncRulebook

async def main():
    async with AsyncRulebook(api_key="your-api-key") as client:
        exchanges = await client.exchanges.list()
        detail = await client.exchanges.retrieve("NYSE")

asyncio.run(main())

Error handling

The SDK raises typed exceptions for all API errors:

from rulebook import Rulebook, NotFoundError, AuthenticationError, RateLimitError

client = Rulebook()

try:
    detail = client.exchanges.retrieve("UNKNOWN")
except NotFoundError:
    print("Exchange not found")
except AuthenticationError:
    print("Invalid API key")
except RateLimitError as e:
    print(f"Rate limited — retry after: {e.response.headers.get('retry-after')}")

Exception hierarchy:

Exception Status Code Description
BadRequestError 400 Invalid request parameters
AuthenticationError 401 Missing or invalid API key
PermissionDeniedError 403 Insufficient access for this resource
NotFoundError 404 Resource does not exist
UnprocessableEntityError 422 Request validation failed
RateLimitError 429 Too many requests
InternalServerError 5xx Server-side error
APIConnectionError — Network failure
APITimeoutError — Request timed out

Raw response access

Access HTTP status codes, headers, and the raw response via with_raw_response:

raw = client.exchanges.with_raw_response.retrieve("NYSE")
print(raw.status_code)                      # 200
print(raw.headers.get("content-type"))      # application/json

detail = raw.parse()                        # ExchangeDetail

Client configuration

client = Rulebook(
    api_key="...",
    base_url="https://api.rulebookcompany.com/api/v1",  # default
    timeout=30.0,         # seconds (default: 30)
    max_retries=2,        # retry transient failures (default: 2)
    default_headers={},   # headers sent on every request
)

Per-request overrides

Override timeout or add headers for a single request without modifying the client:

exchanges = client.exchanges.list(
    extra_headers={"X-Request-Id": "abc-123"},
    timeout=60.0,
)

Immutable client copies

Create a new client with different settings using with_options():

slow_client = client.with_options(timeout=120.0)

Retries

The SDK automatically retries transient errors (408, 409, 429, 500, 502, 503, 504) with exponential backoff and jitter. Configure with max_retries:

client = Rulebook(max_retries=5)  # default is 2

Response types

All responses are strongly typed with Pydantic models:

from rulebook.types import (
    Exchange,
    ExchangeDetail,
    DateRange,
    FeeScheduleResult,
    FeeScheduleResultFilters,
    PaginatedResponse,
)

Exchange — returned by list()

Field Type Description
name str Exchange identifier (e.g., "NYSE")
display_name str Full name (e.g., "New York Stock Exchange")
fee_types List[str] Available fee types (e.g., ["Equity", "Option"])
record_count int Total fee schedule records

ExchangeDetail — returned by retrieve()

Field Type Description
name str Exchange identifier
display_name str Full name
date_range DateRange Earliest and latest dates of available data
fee_types List[str] Available fee types
fee_categories List[str] Fee categories (e.g., ["Fee And Rebates"])
actions List[str] Trade actions (e.g., ["Make", "Take", "Open"])
participants List[str] Participant types (e.g., ["Market Maker", "Customer"])
symbol_classifications List[str] Symbol classifications (e.g., ["ETF", "Equity"])
symbol_types List[str] Symbol types (e.g., ["Penny", "Non Penny"])
trade_types List[str] Trade types (e.g., ["Simple Order"])
record_count int Total fee schedule records

Contributors

Requirements

  • Python 3.11+
  • Dependencies: httpx, pydantic, anyio

License

MIT — see LICENSE for details.

Metadata

Release files for rulebook-python 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rulebook-python 0.1.1
File Size Uploaded
rulebook_python-0.1.1.tar.gz 73.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rulebook-python 0.1.1
File Interpreter ABI Platform
rulebook_python-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 102.6 kB

Release files / rulebook_python-0.1.1.tar.gz

Download URL rulebook_python-0.1.1.tar.gz
Size 73.1 kB
Tags Source
SHA-256 checksum
How to use checksums
ef5155106e6c32edf852bd0eaa5061f3e2b0384a8f98e1100bb080e1193fa221
BLAKE2b-256 checksum
How to use checksums
03b9ac0114383498a094972007295659b924a93f72a4c2e676886e6769a1ceb6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.15

Release files / rulebook_python-0.1.1-py3-none-any.whl

Download URL rulebook_python-0.1.1-py3-none-any.whl
Size 29.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
580b849777074bfd85827490f7dfa794a88d714fb1dbdf58d4693648dcd07bc8
BLAKE2b-256 checksum
How to use checksums
17e790f2cb568b80110b4c07173076cf3572b5abcf472580c5e16c6377f22760
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.15

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page