Data Models

All data returned by vlrdevapi is structured using standard Python frozen dataclasses with full type hints.

Model Features

All models are:

  • Immutable: Models are frozen (frozen=True) and cannot be modified after creation

  • Type-safe: Full type hints for all fields (including str | None unions)

  • Serializable: Easily converted to dict/JSON using dataclasses.asdict

Common Patterns

Accessing Model Data

import vlrdevapi as vlr

# Get a model instance
profile = vlr.players.profile(player_id=4164)

# Access fields directly
print(profile.handle)
print(profile.real_name)
print(profile.country)

# Models are immutable
# profile.handle = "new_name"  # This will raise an error

Converting to Dictionary

import json
from dataclasses import asdict
import vlrdevapi as vlr

profile = vlr.players.profile(player_id=4164)

# Convert to dict
data = asdict(profile)
print(data)

# Convert to JSON
# Note: use default=str to serialize datetime/date objects
json_str = json.dumps(data, default=str)

Optional Fields

Many fields are optional and may be None:

import vlrdevapi as vlr

match = vlr.matches.upcoming()[0]

# Check if optional field exists
if match.date:
    print(f"Date: {match.date.isoformat()}")
else:
    print("Date not available")

Date fields on event info are also optional:

import vlrdevapi as vlr

# Get event info with parsed dates
event = vlr.events.info(event_id=2283)

if event.start_date and event.end_date:
    duration = (event.end_date - event.start_date).days
    print(f"Event duration: {duration} days")
    print(f"From {event.start_date} to {event.end_date}")

Lists and Nested Objects

Some fields contain lists or nested objects:

import vlrdevapi as vlr

# Team objects in matches
match = vlr.matches.upcoming()[0]
print(f"{match.team1.name} vs {match.team2.name}")
print(f"Countries: {match.team1.country} vs {match.team2.country}")

# List of variable length
profile = vlr.players.profile(player_id=4164)
for team in profile.current_teams:
    print(team.name)

Events Models

See Events API for detailed documentation of:

  • ListEvent

  • Info

  • MatchTeam

  • Match

  • StageMatches

  • MatchSummary

  • StandingEntry

  • Standings

  • Team

Matches Models

See Matches API for detailed documentation of:

  • Team (team information with name, country, score)

  • Match (match information with team1, team2, event details)

Players Models

See Players API for detailed documentation of:

  • SocialLink (social media links)

  • Team (team membership with role and dates)

  • Profile (player profile with teams and socials)

  • MatchTeam (team info in player matches)

  • Match (player match with stage, phase, result)

  • AgentStats (agent performance statistics)

Series Models

See Series API for detailed documentation of:

  • TeamInfo

  • MapAction

  • Info

  • PlayerStats

  • MapTeamScore

  • RoundResult

  • MapPlayers

Field Types

Common field types used across models:

Primitive Types

  • int: Integer values (IDs, scores, counts)

  • float: Decimal values (ratings, percentages)

  • str: Text values (names, URLs)

  • bool: Boolean flags (is_winner, etc.)

Date and Time

  • datetime.date: Date values (match dates, join dates)

  • datetime.time: Time values (match times)

Collections

  • List[T]: Variable-length lists

  • Tuple[T, T]: Fixed-length tuples (usually 2 teams)

  • Optional[T]: Values that may be None

Literals

  • Literal[“a”, “b”]: String values restricted to specific options

Example: status field can only be “upcoming”, “live”, or “completed”

Runtime Validation

Models are plain dataclasses and do not perform runtime validation. They rely on the library’s HTML parsing logic and Python type hints.

Tips:

# Prefer using type checkers (pyright/mypy) during development
# and validate inputs/outputs in your own code where necessary.

Best Practices

Type Hints

Use type hints when working with models:

import vlrdevapi as vlr
from vlrdevapi.players import Profile

def print_player_info(profile: Profile) -> None:
    print(f"{profile.handle} from {profile.country}")

profile = vlr.players.profile(player_id=4164)
print_player_info(profile)

None Checks

Always check optional fields before use:

import vlrdevapi as vlr

match = vlr.matches.upcoming()[0]

# Safe access
if match.date:
    print(f"Date: {match.date.isoformat()}")

# Or use default value
date_str = match.date.isoformat() if match.date else "TBD"

Iteration

Iterate over lists safely:

import vlrdevapi as vlr

profile = vlr.players.profile(player_id=4164)

# Check if list has items
if profile.current_teams:
    for team in profile.current_teams:
        print(team.name)
else:
    print("No current teams")