AltSportsLeagues
SDKs

Python SDK

Official Python client for AltSportsLeagues API

Python SDK

The official Python SDK provides a Pythonic interface to the AltSportsLeagues API with full async support.

Installation

pip install altsportsleagues
# or
poetry add altsportsleagues
# or
pipenv install altsportsleagues

Requirements: Python 3.8+

Quick Start

from altsportsleagues import AltSportsLeagues
import os

client = AltSportsLeagues(
    api_key=os.getenv('ASL_API_KEY'),
    timeout=30  # optional, in seconds
)

# List leagues
leagues = client.leagues.list(
    tier='tier-2',
    sport='Soccer',
    limit=10
)

for league in leagues.data:
    print(f"{league.name} ({league.country})")

Configuration

Client Options

from altsportsleagues import AltSportsLeagues

client = AltSportsLeagues(
    api_key='your_api_key',      # Required
    base_url=None,               # Optional: API base URL
    timeout=30,                  # Optional: Request timeout (seconds)
    retries=3,                   # Optional: Max retry attempts
    retry_delay=1.0,             # Optional: Delay between retries (seconds)
    headers=None,                # Optional: Custom headers dict
)

API Reference

Leagues

List Leagues

leagues = client.leagues.list(
    sport_type='Soccer',         # optional
    archetype='major_league',    # optional
    tier='tier-2',               # optional: tier-1, tier-2, tier-3, tier-4
    country='United States',     # optional
    limit=100,                   # optional, default: 100
    offset=0                     # optional, default: 0
)

# Access response
print(f"Total: {leagues.meta.total}")
print(f"Results: {len(leagues.data)}")
for league in leagues.data:
    print(league.name)

Get League Details

league = client.leagues.get('league_001')

print(f"Name: {league.data.name}")
print(f"Sport: {league.data.sport}")
print(f"Tier: {league.data.tier}")
print(f"Data Readiness: {league.data.data_readiness}%")

Get League Stats

stats = client.leagues.stats()

print(f"Total Leagues: {stats['total_leagues']}")
print(f"Tier Breakdown: {stats['tier_breakdown']}")
print(f"Average Readiness: {stats['average_data_readiness']}%")

Discovery

Search Leagues

results = client.discovery.search(
    query='professional pickleball leagues in North America',
    min_confidence=0.7,  # optional, 0-1
    limit=10             # optional
)

for result in results.data:
    print(f"{result.name} - Confidence: {result.confidence_score}")

Find Similar Leagues

similar = client.discovery.similar(
    league_id='league_001',
    limit=10  # optional
)

for league in similar.data:
    print(f"{league.name} - Similarity: {league.similarity_score}")

Valuation

Evaluate League Quality

valuation = client.valuation.evaluate(
    league_id='league_001',
    include_api_assessment=True,   # optional
    include_data_quality=True      # optional
)

print(f"Composite Score: {valuation.data.composite_score}/100")
print(f"Tier: {valuation.data.tier}")
print(f"Annual Value: ${valuation.data.estimated_annual_value:,.0f}")

# Dimensional breakdown
for dimension, score in valuation.data.dimensions.items():
    print(f"  {dimension}: {score}/100")

Qualification

Score Qualification

score = client.qualification.score(
    league_id='league_001',
    mappings=[
        {
            'source': 'match_id',
            'target': 'event.id',
            'confirmed': True
        }
    ],
    quality_metrics={
        'overallScore': 85,
        'mappedPercentage': 90,
        'confirmedPercentage': 80,
        'recommendation': 'accept'
    }
)

print(f"Qualified: {score.data.qualified}")
print(f"Score: {score.data.qualification_score}/100")
print(f"Tier: {score.data.estimated_tier}")
print(f"Effort: {score.data.engineering_effort}")

Async Support

The SDK supports async/await for non-blocking operations:

import asyncio
from altsportsleagues import AsyncAltSportsLeagues

async def main():
    client = AsyncAltSportsLeagues(api_key='your_api_key')
    
    # Concurrent requests
    leagues, stats = await asyncio.gather(
        client.leagues.list(tier='tier-2'),
        client.leagues.stats()
    )
    
    print(f"Found {len(leagues.data)} tier-2 leagues")
    print(f"Total leagues: {stats['total_leagues']}")
    
    await client.close()  # Clean up

asyncio.run(main())

Error Handling

from altsportsleagues import (
    AltSportsLeagues,
    APIError,
    AuthenticationError,
    RateLimitError,
    ValidationError
)

client = AltSportsLeagues(api_key='demo-0001')

try:
    league = client.leagues.get('invalid_id')
except AuthenticationError as e:
    print(f"Auth failed: {e.message}")
except RateLimitError as e:
    print(f"Rate limited, retry after {e.retry_after} seconds")
except ValidationError as e:
    print(f"Validation error: {e.fields}")
except APIError as e:
    print(f"API Error [{e.code}]: {e.message}")
    print(f"Status: {e.status}")
except Exception as e:
    print(f"Unexpected error: {e}")

Pagination

Helper for iterating through large result sets:

def paginate_leagues(client, **kwargs):
    """Generator that yields all leagues matching filters."""
    offset = 0
    limit = kwargs.get('limit', 100)
    
    while True:
        response = client.leagues.list(
            **{**kwargs, 'limit': limit, 'offset': offset}
        )
        
        yield from response.data
        
        if not response.meta.has_more:
            break
        
        offset += limit

# Usage
for league in paginate_leagues(client, tier='tier-2', sport='Soccer'):
    print(league.name)

Type Hints

The SDK includes complete type hints for IDE support:

from altsportsleagues import AltSportsLeagues
from altsportsleagues.types import (
    LeagueBasic,
    LeagueDetailed,
    LeagueListResponse,
    SearchResult,
    ValuationResult
)

client: AltSportsLeagues = AltSportsLeagues(api_key='demo-0001')
leagues: LeagueListResponse = client.leagues.list()
league: LeagueDetailed = leagues.data[0]

Context Manager

Use the client as a context manager for automatic cleanup:

from altsportsleagues import AltSportsLeagues

with AltSportsLeagues(api_key='your_api_key') as client:
    leagues = client.leagues.list(tier='tier-2')
    for league in leagues.data:
        print(league.name)

# Client automatically closed

Examples

Batch Evaluation

league_ids = ['league_001', 'league_002', 'league_003']

for league_id in league_ids:
    valuation = client.valuation.evaluate(league_id=league_id)
    print(f"{league_id}: {valuation.data.tier} (score: {valuation.data.composite_score})")

Search and Compare

# Search for leagues
results = client.discovery.search(
    query='professional ultimate frisbee',
    min_confidence=0.7
)

# Get details for top 3 results
for result in results.data[:3]:
    league = client.leagues.get(result.id)
    valuation = client.valuation.evaluate(league_id=result.id)
    
    print(f"\n{league.data.name}:")
    print(f"  Country: {league.data.country}")
    print(f"  Tier: {valuation.data.tier}")
    print(f"  Score: {valuation.data.composite_score}/100")
    print(f"  Value: ${valuation.data.estimated_annual_value:,.0f}")

Filter and Export

import json

# Get all tier-1 leagues
tier1 = client.leagues.list(tier='tier-1', limit=500)

# Export to JSON
with open('tier1_leagues.json', 'w') as f:
    data = [league.dict() for league in tier1.data]
    json.dump(data, f, indent=2, default=str)

print(f"Exported {len(tier1.data)} tier-1 leagues")

Resources

On this page