iracing-data-sdk
Version:
A comprehensive TypeScript SDK for the iRacing Data API with support for all documented endpoints
1 lines • 130 kB
Source Map (JSON)
{"version":3,"sources":["../src/types.ts","../src/endpoints.ts","../src/iracingApi.ts"],"sourcesContent":["import { z } from 'zod';\n\n// === Authentication ===\nexport const AuthRequestSchema = z.object({\n email: z.string().email(),\n password: z.string(),\n});\nexport type AuthRequest = z.infer<typeof AuthRequestSchema>;\n\nexport const AuthResponseSchema = z.object({\n authcode: z.string(),\n ssoCookieValue: z.string(),\n custId: z.number(),\n email: z.string().email(),\n});\nexport type AuthResponse = z.infer<typeof AuthResponseSchema>;\n\n// === Hosted ===\nexport const HostedCombinedSessionsParamsSchema = z.object({\n package_id: z.number().optional(),\n});\nexport type HostedCombinedSessionsParams = z.infer<typeof HostedCombinedSessionsParamsSchema>;\n\n// === League ===\nexport const LeagueCustLeagueSessionsParamsSchema = z.object({\n mine: z.boolean().optional(),\n package_id: z.number().optional(),\n});\nexport type LeagueCustLeagueSessionsParams = z.infer<typeof LeagueCustLeagueSessionsParamsSchema>;\n\nexport const LeagueDirectoryParamsSchema = z.object({\n search: z.string().optional(),\n tag: z.string().optional(),\n restrict_to_member: z.boolean().optional(),\n restrict_to_recruiting: z.boolean().optional(),\n restrict_to_friends: z.boolean().optional(),\n restrict_to_watched: z.boolean().optional(),\n minimum_roster_count: z.number().optional(),\n maximum_roster_count: z.number().optional(),\n lowerbound: z.number().optional(),\n upperbound: z.number().optional(),\n sort: z.string().optional(),\n order: z.string().optional(),\n});\nexport type LeagueDirectoryParams = z.infer<typeof LeagueDirectoryParamsSchema>;\n\nexport const LeagueGetParamsSchema = z.object({\n league_id: z.number(),\n include_licenses: z.boolean().optional(),\n});\nexport type LeagueGetParams = z.infer<typeof LeagueGetParamsSchema>;\n\nexport const LeaguePointsSystemsParamsSchema = z.object({\n league_id: z.number(),\n season_id: z.number().optional(),\n});\nexport type LeaguePointsSystemsParams = z.infer<typeof LeaguePointsSystemsParamsSchema>;\n\nexport const LeagueMembershipParamsSchema = z.object({\n cust_id: z.number().optional(),\n include_league: z.boolean().optional(),\n});\nexport type LeagueMembershipParams = z.infer<typeof LeagueMembershipParamsSchema>;\n\nexport const LeagueRosterParamsSchema = z.object({\n league_id: z.number(),\n include_licenses: z.boolean().optional(),\n});\nexport type LeagueRosterParams = z.infer<typeof LeagueRosterParamsSchema>;\n\nexport const LeagueSeasonsParamsSchema = z.object({\n league_id: z.number(),\n retired: z.boolean().optional(),\n});\nexport type LeagueSeasonsParams = z.infer<typeof LeagueSeasonsParamsSchema>;\n\nexport const LeagueSeasonStandingsParamsSchema = z.object({\n league_id: z.number(),\n season_id: z.number(),\n car_class_id: z.number().optional(),\n car_id: z.number().optional(),\n});\nexport type LeagueSeasonStandingsParams = z.infer<typeof LeagueSeasonStandingsParamsSchema>;\n\nexport const LeagueSeasonSessionsParamsSchema = z.object({\n league_id: z.number(),\n season_id: z.number(),\n results_only: z.boolean().optional(),\n});\nexport type LeagueSeasonSessionsParams = z.infer<typeof LeagueSeasonSessionsParamsSchema>;\n\n// === Lookup ===\nexport const LookupDriversParamsSchema = z.object({\n search_term: z.string(),\n league_id: z.number().optional(),\n});\nexport type LookupDriversParams = z.infer<typeof LookupDriversParamsSchema>;\n\n// === Member ===\nexport const MemberGetParamsSchema = z.object({\n cust_ids: z.array(z.number()).transform((arr) => arr.join(',')),\n include_licenses: z.boolean().optional(),\n});\n\n// Input type for getMembers method (before transformation)\nexport interface MemberGetParams {\n cust_ids: number[];\n include_licenses?: boolean;\n}\n\nexport const MemberAwardsParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type MemberAwardsParams = z.infer<typeof MemberAwardsParamsSchema>;\n\nexport const MemberAwardInstancesParamsSchema = z.object({\n cust_id: z.number().optional(),\n award_id: z.number(),\n});\nexport type MemberAwardInstancesParams = z.infer<typeof MemberAwardInstancesParamsSchema>;\n\nexport const MemberChartDataParamsSchema = z.object({\n cust_id: z.number().optional(),\n category_id: z.number(),\n chart_type: z.number(),\n});\nexport type MemberChartDataParams = z.infer<typeof MemberChartDataParamsSchema>;\n\nexport const MemberProfileParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type MemberProfileParams = z.infer<typeof MemberProfileParamsSchema>;\n\n// === Results ===\nexport const ResultsGetParamsSchema = z.object({\n subsession_id: z.number(),\n include_licenses: z.boolean().optional(),\n});\nexport type ResultsGetParams = z.infer<typeof ResultsGetParamsSchema>;\n\nexport const EventLogParamsSchema = z.object({\n subsession_id: z.number(),\n simsession_number: z.number(),\n});\nexport type EventLogParams = z.infer<typeof EventLogParamsSchema>;\n\nexport const LapChartDataParamsSchema = z.object({\n subsession_id: z.number(),\n simsession_number: z.number(),\n});\nexport type LapChartDataParams = z.infer<typeof LapChartDataParamsSchema>;\n\nexport const LapDataParamsSchema = z.object({\n subsession_id: z.number(),\n simsession_number: z.number(),\n cust_id: z.number().optional(),\n team_id: z.number().optional(),\n});\nexport type LapDataParams = z.infer<typeof LapDataParamsSchema>;\n\nexport const ResultsSearchHostedParamsSchema = z.object({\n start_range_begin: z.string().optional(),\n start_range_end: z.string().optional(),\n finish_range_begin: z.string().optional(),\n finish_range_end: z.string().optional(),\n cust_id: z.number().optional(),\n team_id: z.number().optional(),\n host_cust_id: z.number().optional(),\n session_name: z.string().optional(),\n league_id: z.number().optional(),\n league_season_id: z.number().optional(),\n car_id: z.number().optional(),\n track_id: z.number().optional(),\n category_ids: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n});\n// Input type for ResultsSearchHosted method (before transformation)\nexport interface ResultsSearchHostedParams {\n start_range_begin?: string;\n start_range_end?: string;\n finish_range_begin?: string;\n finish_range_end?: string;\n cust_id?: number;\n team_id?: number;\n host_cust_id?: number;\n session_name?: string;\n league_id?: number;\n league_season_id?: number;\n car_id?: number;\n track_id?: number;\n category_ids?: number[];\n}\n\nexport const ResultsSearchSeriesParamsSchema = z.object({\n season_year: z.number().optional(),\n season_quarter: z.number().optional(),\n start_range_begin: z.string().optional(),\n start_range_end: z.string().optional(),\n finish_range_begin: z.string().optional(),\n finish_range_end: z.string().optional(),\n cust_id: z.number().optional(),\n team_id: z.number().optional(),\n series_id: z.number().optional(),\n race_week_num: z.number().optional(),\n official_only: z.boolean().optional(),\n event_types: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n category_ids: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n});\n// Input type for ResultsSearchSeries method (before transformation)\nexport interface ResultsSearchSeriesParams {\n season_year?: number;\n season_quarter?: number;\n start_range_begin?: string;\n start_range_end?: string;\n finish_range_begin?: string;\n finish_range_end?: string;\n cust_id?: number;\n team_id?: number;\n series_id?: number;\n race_week_num?: number;\n official_only?: boolean;\n event_types?: number[];\n category_ids?: number[];\n}\n\nexport const SeasonResultsParamsSchema = z.object({\n season_id: z.number(),\n event_type: z.number().optional(),\n race_week_num: z.number().optional(),\n});\nexport type SeasonResultsParams = z.infer<typeof SeasonResultsParamsSchema>;\n\n// === Season ===\nexport const SeasonListParamsSchema = z.object({\n season_year: z.number(),\n season_quarter: z.number(),\n});\nexport type SeasonListParams = z.infer<typeof SeasonListParamsSchema>;\n\nexport const SeasonRaceGuideParamsSchema = z.object({\n from: z.string().optional(),\n include_end_after_from: z.boolean().optional(),\n});\nexport type SeasonRaceGuideParams = z.infer<typeof SeasonRaceGuideParamsSchema>;\n\nexport const SeasonSpectatorSubsessionIdsParamsSchema = z.object({\n event_types: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n});\n// Input type for SeasonSpectatorSubsessionIds method (before transformation)\nexport interface SeasonSpectatorSubsessionIdsParams {\n event_types?: number[];\n}\n\nexport const SeasonSpectatorSubsessionIdsDetailParamsSchema = z.object({\n event_types: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n season_ids: z.array(z.number()).transform((arr) => arr.join(',')).optional(),\n});\n// Input type for SeasonSpectatorSubsessionIdsDetail method (before transformation)\nexport interface SeasonSpectatorSubsessionIdsDetailParams {\n event_types?: number[];\n season_ids?: number[];\n}\n\n// === Series ===\nexport const SeriesPastSeasonsParamsSchema = z.object({\n series_id: z.number(),\n});\nexport type SeriesPastSeasonsParams = z.infer<typeof SeriesPastSeasonsParamsSchema>;\n\nexport const SeriesSeasonsParamsSchema = z.object({\n include_series: z.boolean().optional(),\n season_year: z.number().optional(),\n season_quarter: z.number().optional(),\n});\nexport type SeriesSeasonsParams = z.infer<typeof SeriesSeasonsParamsSchema>;\n\nexport const SeriesSeasonListParamsSchema = z.object({\n include_series: z.boolean().optional(),\n season_year: z.number().optional(),\n season_quarter: z.number().optional(),\n});\nexport type SeriesSeasonListParams = z.infer<typeof SeriesSeasonListParamsSchema>;\n\nexport const SeriesSeasonScheduleParamsSchema = z.object({\n season_id: z.number(),\n});\nexport type SeriesSeasonScheduleParams = z.infer<typeof SeriesSeasonScheduleParamsSchema>;\n\n// === Stats ===\nexport const StatsMemberBestsParamsSchema = z.object({\n cust_id: z.number().optional(),\n car_id: z.number().optional(),\n});\nexport type StatsMemberBestsParams = z.infer<typeof StatsMemberBestsParamsSchema>;\n\nexport const StatsMemberCareerParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type StatsMemberCareerParams = z.infer<typeof StatsMemberCareerParamsSchema>;\n\nexport const StatsMemberDivisionParamsSchema = z.object({\n season_id: z.number(),\n event_type: z.number(),\n});\nexport type StatsMemberDivisionParams = z.infer<typeof StatsMemberDivisionParamsSchema>;\n\nexport const StatsMemberRecapParamsSchema = z.object({\n cust_id: z.number().optional(),\n year: z.number().optional(),\n season: z.number().optional(),\n});\nexport type StatsMemberRecapParams = z.infer<typeof StatsMemberRecapParamsSchema>;\n\nexport const StatsMemberRecentRacesParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type StatsMemberRecentRacesParams = z.infer<typeof StatsMemberRecentRacesParamsSchema>;\n\nexport const StatsMemberSummaryParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type StatsMemberSummaryParams = z.infer<typeof StatsMemberSummaryParamsSchema>;\n\nexport const StatsMemberYearlyParamsSchema = z.object({\n cust_id: z.number().optional(),\n});\nexport type StatsMemberYearlyParams = z.infer<typeof StatsMemberYearlyParamsSchema>;\n\nexport const StatsSeasonDriverStandingsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n division: z.number().optional(),\n race_week_num: z.number().optional(),\n});\nexport type StatsSeasonDriverStandingsParams = z.infer<typeof StatsSeasonDriverStandingsParamsSchema>;\n\nexport const StatsSeasonSupersessionStandingsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n division: z.number().optional(),\n race_week_num: z.number().optional(),\n});\nexport type StatsSeasonSupersessionStandingsParams = z.infer<typeof StatsSeasonSupersessionStandingsParamsSchema>;\n\nexport const StatsSeasonTeamStandingsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n race_week_num: z.number().optional(),\n});\nexport type StatsSeasonTeamStandingsParams = z.infer<typeof StatsSeasonTeamStandingsParamsSchema>;\n\nexport const StatsSeasonTTStandingsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n division: z.number().optional(),\n race_week_num: z.number().optional(),\n});\nexport type StatsSeasonTTStandingsParams = z.infer<typeof StatsSeasonTTStandingsParamsSchema>;\n\nexport const StatsSeasonTTResultsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n race_week_num: z.number(),\n division: z.number().optional(),\n});\nexport type StatsSeasonTTResultsParams = z.infer<typeof StatsSeasonTTResultsParamsSchema>;\n\nexport const StatsSeasonQualifyResultsParamsSchema = z.object({\n season_id: z.number(),\n car_class_id: z.number(),\n race_week_num: z.number(),\n division: z.number().optional(),\n});\nexport type StatsSeasonQualifyResultsParams = z.infer<typeof StatsSeasonQualifyResultsParamsSchema>;\n\nexport const StatsWorldRecordsParamsSchema = z.object({\n car_id: z.number(),\n track_id: z.number(),\n season_year: z.number().optional(),\n season_quarter: z.number().optional(),\n});\nexport type StatsWorldRecordsParams = z.infer<typeof StatsWorldRecordsParamsSchema>;\n\n// === Team ===\nexport const TeamGetParamsSchema = z.object({\n team_id: z.number(),\n include_licenses: z.boolean().optional(),\n});\nexport type TeamGetParams = z.infer<typeof TeamGetParamsSchema>;\n\n// === Time Attack ===\nexport const TimeAttackMemberSeasonResultsParamsSchema = z.object({\n ta_comp_season_id: z.number(),\n});\nexport type TimeAttackMemberSeasonResultsParams = z.infer<typeof TimeAttackMemberSeasonResultsParamsSchema>;\n\n// === RESPONSE TYPES ===\n\n// === Base Types ===\n\n/**\n * License information structure used across multiple endpoints\n */\nexport interface License {\n category_id: number;\n category: string;\n license_level: number;\n safety_rating: number;\n cpi: number;\n irating: number;\n tt_rating: number;\n mpr_num_races: number;\n}\n\n/**\n * Track configuration information\n */\nexport interface TrackConfig {\n track_id: number;\n config_name: string;\n track_name: string;\n category_id: number;\n category: string;\n config_length_km: number;\n pkg_id: number;\n recently_added: boolean;\n}\n\n/**\n * Car information structure\n */\nexport interface Car {\n car_id: number;\n car_name: string;\n car_name_abbreviated: string;\n car_dirpath: string;\n car_rules_category: string;\n car_weight: number;\n car_power: number;\n car_max_fuel_pct: number;\n car_types: CarType[];\n pkg_id: number;\n sku: number;\n recently_added: boolean;\n car_make: string;\n car_model: string;\n hp: number;\n price: number;\n price_display: string;\n free_with_subscription: boolean;\n}\n\nexport interface CarType {\n car_type: string;\n}\n\n/**\n * Standard pagination response wrapper\n */\nexport interface PaginatedResponse<T> {\n data: T;\n success: boolean;\n chunk_info?: ChunkInfo;\n rate_limit_remaining?: number;\n rate_limit_reset?: number;\n}\n\nexport interface ChunkInfo {\n chunk_size: number;\n total_chunks: number;\n chunk_file_name: string;\n rows: number;\n base_download_url: string;\n chunk_file_names?: string[];\n}\n\n// === Car Data Response Types ===\n\n/**\n * Response containing car asset information including images and logos\n * Image paths are relative to https://images-static.iracing.com/\n */\nexport interface CarAssetsResponse {\n /** Car asset rules organized by category */\n car_rules: CarRule[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Car asset rule containing cars grouped by category\n */\nexport interface CarRule {\n /** Category identifier */\n category_id: number;\n /** Category name */\n category: string;\n /** Array of car assets in this category */\n cars: CarAsset[];\n}\n\n/**\n * Car asset containing image and logo information\n */\nexport interface CarAsset {\n /** Unique car identifier */\n car_id: number;\n /** Full car name */\n car_name: string;\n /** Abbreviated car name */\n car_name_abbreviated: string;\n /** Path to car logo image */\n logo: string;\n /** Path to small car image */\n small_image: string;\n /** Path to large car image */\n large_image: string;\n /** Car directory path */\n car_dirpath: string;\n}\n\n/**\n * Response containing all available cars\n */\nexport interface CarsResponse {\n /** Array of all cars */\n cars: Car[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Response containing all car classes\n */\nexport interface CarClassesResponse {\n /** Array of car classes */\n carclass: CarClass[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Car class containing multiple cars with similar performance\n */\nexport interface CarClass {\n /** Unique car class identifier */\n car_class_id: number;\n /** Array of cars in this class */\n cars_in_class: CarInClass[];\n /** Full car class name */\n name: string;\n /** Relative speed compared to other classes */\n relative_speed: number;\n /** Short car class name */\n short_name: string;\n}\n\n/**\n * Car reference within a car class\n */\nexport interface CarInClass {\n /** Car directory path */\n car_dirpath: string;\n /** Unique car identifier */\n car_id: number;\n}\n\n// === Constants Response Types ===\n\n/**\n * Response containing track categories (constant data)\n */\nexport interface CategoriesResponse {\n /** Array of track categories */\n categories: Category[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Track category definition\n */\nexport interface Category {\n /** Unique category identifier */\n category_id: number;\n /** Category name */\n category: string;\n}\n\n/**\n * Response containing license divisions (constant data)\n */\nexport interface DivisionsResponse {\n /** Array of license divisions */\n divisions: Division[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * License division definition\n */\nexport interface Division {\n /** Division number */\n division: number;\n /** Division name */\n division_name: string;\n}\n\n/**\n * Response containing event types (constant data)\n */\nexport interface EventTypesResponse {\n /** Array of event types */\n event_types: EventType[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Event type definition\n */\nexport interface EventType {\n /** Event type identifier */\n event_type: number;\n /** Event type name */\n event_type_name: string;\n}\n\n// === Driver Stats Response Types ===\n\n/**\n * Response containing driver statistics by category\n */\nexport interface DriverStatsResponse {\n /** Array of driver statistics */\n stats: DriverStats[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Driver statistics for a specific category\n */\nexport interface DriverStats {\n /** Customer ID */\n cust_id: number;\n /** Driver display name */\n display_name: string;\n /** Driver helmet configuration */\n helmet: Helmet;\n /** Last login timestamp */\n last_login: string;\n /** Member since timestamp */\n member_since: string;\n /** Club ID */\n club_id: number;\n /** Club name */\n club_name: string;\n /** Country code */\n country_code: string;\n /** Country name */\n country: string;\n /** Array of licenses */\n licenses: License[];\n}\n\n/**\n * Driver helmet configuration\n */\nexport interface Helmet {\n /** Helmet pattern ID */\n pattern: number;\n /** Primary color */\n color1: string;\n /** Secondary color */\n color2: string;\n /** Tertiary color */\n color3: string;\n /** Face type ID */\n face_type: number;\n /** Helmet type ID */\n helmet_type: number;\n}\n\n// === Hosted Sessions Response Types ===\n\n/**\n * Response containing hosted sessions that can be joined\n */\nexport interface HostedSessionsResponse {\n /** Array of hosted sessions */\n sessions: HostedSession[];\n /** Whether the request was successful */\n success: boolean;\n}\n\n/**\n * Hosted session information\n */\nexport interface HostedSession {\n /** Subsession ID */\n subsession_id: number;\n /** Session ID */\n session_id: number;\n /** Session name */\n session_name: string;\n /** Host customer ID */\n host_id: number;\n /** Host display name */\n host_name: string;\n /** Session creation timestamp */\n created_time: string;\n /** Session start time */\n start_time: string;\n /** Session end time */\n end_time: string;\n /** Launch timestamp */\n launch_at: string;\n /** Registration opens timestamp */\n registration_opens: string;\n /** Registration closes timestamp */\n registration_closes: string;\n /** Session status */\n status: number;\n /** Current number of drivers */\n num_drivers: number;\n /** Maximum number of drivers */\n max_drivers: number;\n /** Whether telemetry recording is enabled */\n telemetry_recording_enabled: boolean;\n /** Telemetry force to disk setting */\n telemetry_force_to_disk: number;\n /** Order ID */\n order_id: number;\n /** Session price */\n price: number;\n /** Whether to skip car painting */\n do_not_paint_cars: boolean;\n /** Whether session is private */\n private_session: boolean;\n /** Season ID */\n season_id: number;\n /** Series ID */\n series_id: number;\n /** Array of car class IDs */\n car_class_ids: number[];\n /** Array of car types */\n car_types: CarType[];\n /** Track configuration */\n track: TrackConfig;\n /** Weather settings */\n weather: Weather;\n /** Track state */\n track_state: TrackState;\n /** League ID (optional) */\n league_id?: number;\n /** League name (optional) */\n league_name?: string;\n /** League season ID (optional) */\n league_season_id?: number;\n /** Entry count */\n entry_count: number;\n /** Whether user can spot */\n can_spot: boolean;\n /** Whether user can watch */\n can_watch: boolean;\n /** Whether user can drive */\n can_drive: boolean;\n /** Team entry count */\n team_entry_count: number;\n}\n\nexport interface Weather {\n type: number;\n temp_units: number;\n temp_value: number;\n rel_humidity: number;\n fog: number;\n wind_dir: number;\n wind_units: number;\n wind_value: number;\n skies: number;\n weather_var_initial: number;\n weather_var_ongoing: number;\n time_of_day: number;\n simulated_start_time: string;\n simulated_time_multiplier: number;\n simulated_time_offsets: number[];\n}\n\nexport interface TrackState {\n leave_marbles: boolean;\n practice_rubber: number;\n qualify_rubber: number;\n warmup_rubber: number;\n race_rubber: number;\n practice_grip_compound: number;\n qualify_grip_compound: number;\n warmup_grip_compound: number;\n race_grip_compound: number;\n}\n\n// === League Response Types ===\n\n/**\n * Response containing league information\n */\nexport interface LeagueResponse {\n /** League data */\n league: League;\n /** Whether the request was successful */\n success: boolean;\n}\n\nexport interface League {\n league_id: number;\n league_name: string;\n owner_id: number;\n owner_display_name: string;\n created: string;\n url: string;\n club_id: number;\n club_name: string;\n about: string;\n logo: string;\n description: string;\n max_drivers: number;\n min_drivers: number;\n laps_for_solo_race: number;\n laps_for_team_race: number;\n max_team_drivers: number;\n min_team_drivers: number;\n max_weekly_race_entries: number;\n min_weekly_race_entries: number;\n fixed_setup: boolean;\n enable_passworded_sessions: boolean;\n private_wall_postings: boolean;\n private_roster: boolean;\n league_rules: string;\n roster_count: number;\n applicant_count: number;\n recruiting: boolean;\n is_admin: boolean;\n is_member: boolean;\n pending_application: boolean;\n pending_invitation: boolean;\n cancelled_application: boolean;\n rejected_application: boolean;\n seasons?: LeagueSeason[];\n roster?: LeagueMember[];\n}\n\nexport interface LeagueSeason {\n season_id: number;\n season_name: string;\n active: boolean;\n car_class_ids: number[];\n car_restrictions: CarRestriction[];\n complete: boolean;\n driver_changes: boolean;\n driver_change_rule: number;\n drops: number;\n green_flag_finish_rule: boolean;\n ignore_license_for_practice: boolean;\n invisible_reserved_setup: boolean;\n max_ai_drivers: number;\n max_team_drivers: number;\n min_team_drivers: number;\n multiclass: boolean;\n must_use_diff_tire_types_in_race: boolean;\n next_race_session: string;\n num_opt_laps: number;\n op_duration: number;\n open_practice: boolean;\n points_system_id: number;\n points_system_name: string;\n practice_length: number;\n private_qualifying: boolean;\n private_scoring: boolean;\n qualify_laps: number;\n race_laps: number;\n race_length: number;\n reg_user_count: number;\n restrict_results: boolean;\n restrict_viewing: boolean;\n schedule_description: string;\n send_to_open_practice: boolean;\n short_parade_lap: boolean;\n start_date: string;\n telemetry_force_to_disk: number;\n telemetry_recording_enabled: boolean;\n unsport_conduct_rule_mode: number;\n fixed_setup: boolean;\n hardcore_level: number;\n lucky_dog: boolean;\n max_weeks: number;\n season_quarter: number;\n season_year: number;\n series_id: number;\n track_types: TrackType[];\n}\n\nexport interface CarRestriction {\n car_id: number;\n}\n\nexport interface TrackType {\n track_type: string;\n}\n\nexport interface LeagueMember {\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n league_member_type: number;\n league_admin: boolean;\n league_owner: boolean;\n can_spot: boolean;\n can_chat: boolean;\n can_coach: boolean;\n owner: boolean;\n admin: boolean;\n licenses?: License[];\n}\n\nexport interface LeagueDirectoryResponse {\n leagues: LeagueDirectoryEntry[];\n success: boolean;\n}\n\nexport interface LeagueDirectoryEntry {\n league_id: number;\n league_name: string;\n owner_id: number;\n owner_display_name: string;\n created: string;\n url: string;\n club_id: number;\n club_name: string;\n description: string;\n max_drivers: number;\n min_drivers: number;\n private_roster: boolean;\n roster_count: number;\n recruiting: boolean;\n tags: string[];\n}\n\nexport interface LeaguePointsSystemsResponse {\n points_systems: PointsSystem[];\n success: boolean;\n}\n\nexport interface PointsSystem {\n points_system_id: number;\n points_system_name: string;\n formula: string;\n method: number;\n rounding: number;\n}\n\nexport interface LeagueMembershipResponse {\n memberships: LeagueMembership[];\n success: boolean;\n}\n\nexport interface LeagueMembership {\n league_id: number;\n league_name: string;\n owner_id: number;\n owner_display_name: string;\n roster_count: number;\n recruiting: boolean;\n league?: League;\n}\n\nexport interface LeagueRosterResponse {\n roster: LeagueMember[];\n success: boolean;\n}\n\nexport interface LeagueSeasonsResponse {\n seasons: LeagueSeason[];\n success: boolean;\n}\n\nexport interface LeagueSeasonStandingsResponse {\n standings: LeagueStanding[];\n success: boolean;\n chunk_info?: ChunkInfo;\n}\n\nexport interface LeagueStanding {\n cust_id: number;\n display_name: string;\n division: number;\n position: number;\n points: number;\n wins: number;\n week_dropped: boolean;\n starts: number;\n helmet: Helmet;\n car_class_id: number;\n club_id: number;\n club_name: string;\n club_shortname: string;\n country_code: string;\n country: string;\n license: License;\n}\n\nexport interface LeagueSeasonSessionsResponse {\n sessions: LeagueSeasonSession[];\n success: boolean;\n}\n\nexport interface LeagueSeasonSession {\n subsession_id: number;\n session_id: number;\n session_name: string;\n created_time: string;\n start_time: string;\n end_time: string;\n num_drivers: number;\n series_name: string;\n session_results: SessionResult[];\n}\n\nexport interface SessionResult {\n cust_id: number;\n display_name: string;\n finish_position: number;\n laps_complete: number;\n laps_lead: number;\n points: number;\n starting_position: number;\n car_class_id: number;\n car_class_name: string;\n division: number;\n}\n\n// === Lookup Response Types ===\n\nexport interface LookupCountriesResponse {\n countries: Country[];\n success: boolean;\n}\n\nexport interface Country {\n country_code: string;\n country_name: string;\n}\n\nexport interface LookupDriversResponse {\n drivers: LookupDriver[];\n success: boolean;\n}\n\nexport interface LookupDriver {\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n club_id: number;\n club_name: string;\n country_code: string;\n country: string;\n licenses: License[];\n}\n\nexport interface LookupFlairsResponse {\n flairs: Flair[];\n success: boolean;\n}\n\nexport interface Flair {\n flair_id: number;\n flair_name: string;\n image: string;\n}\n\nexport interface LookupGetResponse {\n lookup_groups: LookupGroup[];\n success: boolean;\n}\n\nexport interface LookupGroup {\n group_name: string;\n lookup_values: LookupValue[];\n}\n\nexport interface LookupValue {\n lookup_value: any;\n lookup_display: string;\n}\n\nexport interface LookupLicensesResponse {\n licenses: LicenseLevel[];\n success: boolean;\n}\n\nexport interface LicenseLevel {\n license_id: number;\n license_name: string;\n license_color: string;\n license_short_name: string;\n min_sr: number;\n min_races: number;\n participated_in_race: boolean;\n group: number;\n}\n\n// === Member Response Types ===\n\n/**\n * Response containing authenticated member information\n */\nexport interface MemberInfoResponse {\n cust_id: number;\n email: string;\n display_name: string;\n first_name: string;\n last_name: string;\n on_car_name: string;\n member_since: string;\n last_login: string;\n read_comp_rules: string;\n read_pp: string;\n read_tos: string;\n helmet: Helmet;\n club_id: number;\n club_name: string;\n country_code: string;\n country: string;\n ai_usage: boolean;\n max_ai_roster_count: number;\n flags: number;\n twenty_four_hours: boolean;\n account_credits: number;\n success: boolean;\n}\n\n/**\n * Response containing member information by customer IDs\n */\nexport interface MembersResponse {\n /** Array of member data */\n members: Member[];\n /** Whether the request was successful */\n success: boolean;\n}\n\nexport interface Member {\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n last_login: string;\n member_since: string;\n club_id: number;\n club_name: string;\n country_code: string;\n country: string;\n licenses?: License[];\n}\n\n/**\n * Response containing member awards\n */\nexport interface MemberAwardsResponse {\n /** Array of awards */\n awards: Award[];\n /** Whether the request was successful */\n success: boolean;\n}\n\nexport interface Award {\n award_id: number;\n award_name: string;\n award_desc: string;\n award_image: string;\n times_earned: number;\n}\n\nexport interface MemberAwardInstancesResponse {\n award_instances: AwardInstance[];\n success: boolean;\n}\n\nexport interface AwardInstance {\n award_id: number;\n award_name: string;\n award_desc: string;\n award_image: string;\n earned_date: string;\n context: string;\n}\n\nexport interface MemberChartDataResponse {\n category_id: number;\n chart_type: number;\n success: boolean;\n data: ChartDataPoint[];\n}\n\nexport interface ChartDataPoint {\n when: string;\n value: number;\n}\n\nexport interface MemberProfileResponse {\n cust_id: number;\n member_info: ProfileMemberInfo;\n member_stats_by_category: ProfileMemberStats[];\n recent_awards: ProfileAward[];\n favorite_car_class: string;\n favorite_track: string;\n success: boolean;\n}\n\nexport interface ProfileMemberInfo {\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n last_login: string;\n member_since: string;\n club_id: number;\n club_name: string;\n country_code: string;\n country: string;\n occupation: string;\n about: string;\n interests: string;\n connection_type: number;\n download_server: number;\n ai_usage: boolean;\n drivable_car_count: number;\n owned_car_count: number;\n flags: number;\n annual_auto_renew: boolean;\n auto_renew_date: string;\n credits: number;\n}\n\nexport interface ProfileMemberStats {\n category: string;\n category_id: number;\n starts: number;\n wins: number;\n top5: number;\n poles: number;\n avg_start_position: number;\n avg_finish_position: number;\n laps: number;\n laps_led: number;\n total_club_points: number;\n year_club_points: number;\n career_wins: number;\n career_poles: number;\n career_starts: number;\n career_laps: number;\n career_laps_led: number;\n}\n\nexport interface ProfileAward {\n award_id: number;\n award_name: string;\n award_desc: string;\n award_image: string;\n earned_date: string;\n context: string;\n}\n\nexport interface MemberParticipationCreditsResponse {\n participation_credits: ParticipationCredit[];\n success: boolean;\n}\n\nexport interface ParticipationCredit {\n season_id: number;\n series_name: string;\n credits: number;\n credits_remaining: number;\n}\n\n// === Results Response Types ===\n\nexport interface ResultsResponse {\n session_info: SessionInfo;\n session_results: SessionResult[];\n success: boolean;\n}\n\nexport interface SessionInfo {\n subsession_id: number;\n session_id: number;\n series_id: number;\n series_name: string;\n series_short_name: string;\n session_name: string;\n race_week_num: number;\n event_type: number;\n event_type_name: string;\n driver_changes: boolean;\n green_flag_finish_rule: boolean;\n private_session: boolean;\n start_date: string;\n end_date: string;\n num_drivers: number;\n num_cautions: number;\n num_caution_laps: number;\n num_lead_changes: number;\n time_of_day: number;\n damage_model: number;\n can_protest: boolean;\n cooldown_minutes: number;\n limit_minutes: number;\n track: TrackConfig;\n weather: Weather;\n track_state: TrackState;\n session_results_count: number;\n series_logo: string;\n event_strength_of_field: number;\n event_average_lap: number;\n event_laps_complete: number;\n num_opt_laps: number;\n has_opt_path: boolean;\n can_protest_after_end: boolean;\n special_event_type: number;\n special_event_type_text: string;\n season_id: number;\n season_name: string;\n season_short_name: string;\n season_year: number;\n season_quarter: number;\n license_category_id: number;\n license_category: string;\n car_class_ids: number[];\n}\n\nexport interface EventLogResponse {\n chunk_info: ChunkInfo;\n success: boolean;\n}\n\nexport interface LapChartDataResponse {\n chunk_info: ChunkInfo;\n success: boolean;\n}\n\nexport interface LapDataResponse {\n chunk_info: ChunkInfo;\n success: boolean;\n}\n\nexport interface ResultsSearchResponse {\n data: SearchResult[];\n success: boolean;\n chunk_info?: ChunkInfo;\n}\n\nexport interface SearchResult {\n subsession_id: number;\n session_id: number;\n series_id: number;\n series_name: string;\n session_name: string;\n start_time: string;\n end_time: string;\n num_drivers: number;\n track: TrackConfig;\n winner_group_id: number;\n winner_name: string;\n winner_helmet: Helmet;\n event_type: number;\n event_type_name: string;\n license_category: string;\n license_category_id: number;\n race_week_num: number;\n season_id: number;\n season_name: string;\n season_short_name: string;\n season_quarter: number;\n season_year: number;\n event_strength_of_field: number;\n event_average_lap: number;\n event_laps_complete: number;\n caution_type: number;\n corners_per_lap: number;\n damage_model: number;\n driver_change_rule: number;\n driver_changes: boolean;\n lucky_dog: boolean;\n max_weeks: number;\n num_cautions: number;\n num_caution_laps: number;\n num_lead_changes: number;\n official_session: boolean;\n points_type: string;\n private_session: boolean;\n qual_attached: boolean;\n race_summary: RaceSummary;\n results_restricted: boolean;\n special_event_type_text: string;\n special_event_type: number;\n time_of_day: number;\n weather: Weather;\n}\n\nexport interface RaceSummary {\n subsession_id: number;\n average_lap: number;\n laps_complete: number;\n num_cautions: number;\n num_caution_laps: number;\n num_lead_changes: number;\n field_strength: number;\n num_drivers: number;\n}\n\n// === Season Response Types ===\n\nexport interface SeasonListResponse {\n seasons: Season[];\n success: boolean;\n}\n\nexport interface Season {\n season_id: number;\n season_name: string;\n series_id: number;\n series_name: string;\n official: boolean;\n season_year: number;\n season_quarter: number;\n license_category: string;\n license_category_id: number;\n rookie_season: string;\n driver_changes: boolean;\n min_license_level: number;\n max_license_level: number;\n active: boolean;\n complete: boolean;\n car_class_ids: number[];\n car_types: CarType[];\n schedule: SeasonSchedule[];\n track_types: TrackType[];\n}\n\nexport interface SeasonSchedule {\n race_week_num: number;\n session_id: number;\n series_id: number;\n season_id: number;\n race_week_name: string;\n track: TrackConfig;\n session_times: string[];\n special_event_type: number;\n start_date: string;\n end_date: string;\n race_lap_limit: number;\n race_time_limit: number;\n time_of_day: number;\n simsession_types: SimSessionType[];\n}\n\nexport interface SimSessionType {\n simsession_type: number;\n simsession_type_name: string;\n}\n\nexport interface SeasonRaceGuideResponse {\n races: RaceGuideEntry[];\n success: boolean;\n}\n\nexport interface RaceGuideEntry {\n series_id: number;\n series_name: string;\n race_week_num: number;\n session_id: number;\n season_id: number;\n license_category: string;\n license_category_id: number;\n start_time: string;\n registration_opens: string;\n registration_closes: string;\n track: TrackConfig;\n weather: Weather;\n track_state: TrackState;\n max_drivers: number;\n reg_count: number;\n entries: RaceGuideEntryDetail[];\n}\n\nexport interface RaceGuideEntryDetail {\n car_id: number;\n car_name: string;\n reg_count: number;\n}\n\nexport interface SeasonSpectatorSubsessionIdsResponse {\n subsession_ids: number[];\n success: boolean;\n}\n\nexport interface SeasonSpectatorSubsessionIdsDetailResponse {\n subsessions: SpectatorSubsession[];\n success: boolean;\n}\n\nexport interface SpectatorSubsession {\n subsession_id: number;\n session_id: number;\n series_id: number;\n series_name: string;\n season_id: number;\n season_name: string;\n license_category: string;\n license_category_id: number;\n race_week_num: number;\n session_name: string;\n start_time: string;\n track: TrackConfig;\n num_drivers: number;\n event_type: number;\n event_type_name: string;\n}\n\n// === Series Response Types ===\n\nexport interface SeriesAssetsResponse {\n series_assets: SeriesAsset[];\n success: boolean;\n}\n\nexport interface SeriesAsset {\n series_id: number;\n series_name: string;\n logo: string;\n small_image: string;\n large_image: string;\n}\n\nexport interface SeriesResponse {\n series: Series[];\n success: boolean;\n}\n\nexport interface Series {\n series_id: number;\n series_name: string;\n series_short_name: string;\n publisher: string;\n publisher_id: number;\n category: string;\n category_id: number;\n max_starters: number;\n min_starters: number;\n oval_caution_type: number;\n road_caution_type: number;\n short_parade_lap: number;\n start_on_qual_tire: boolean;\n enable_pitlane_collisions: boolean;\n open_reg_expires: number;\n min_pre_qual_minutes: number;\n cars_left_right: boolean;\n max_ai_drivers: number;\n ignore_license_for_practice: boolean;\n start_zone: boolean;\n enable_driver_swaps: boolean;\n driver_swap_rule: number;\n max_drivers: number;\n pace_car_class_id: number;\n allowed_licenses: License[];\n car_class_ids: number[];\n car_types: CarType[];\n track_types: TrackType[];\n}\n\nexport interface SeriesPastSeasonsResponse {\n seasons: PastSeason[];\n success: boolean;\n}\n\nexport interface PastSeason {\n season_id: number;\n season_name: string;\n series_id: number;\n official: boolean;\n season_year: number;\n season_quarter: number;\n license_category: string;\n license_category_id: number;\n rookie_season: string;\n driver_changes: boolean;\n min_license_level: number;\n max_license_level: number;\n active: boolean;\n complete: boolean;\n fixed_setup: boolean;\n car_class_ids: number[];\n car_types: CarType[];\n schedule_name: string;\n series_name: string;\n start_date: string;\n end_date: string;\n}\n\nexport interface SeriesSeasonsResponse {\n seasons: Season[];\n success: boolean;\n}\n\nexport interface SeriesSeasonListResponse {\n season_list: SeasonListEntry[];\n success: boolean;\n}\n\nexport interface SeasonListEntry {\n season_id: number;\n season_name: string;\n series_id: number;\n series_name: string;\n official: boolean;\n season_year: number;\n season_quarter: number;\n license_category: string;\n license_category_id: number;\n active: boolean;\n complete: boolean;\n car_class_ids: number[];\n}\n\nexport interface SeriesSeasonScheduleResponse {\n season_id: number;\n series_id: number;\n season_name: string;\n series_name: string;\n official: boolean;\n race_weeks: RaceWeek[];\n success: boolean;\n}\n\nexport interface RaceWeek {\n race_week_num: number;\n session_id: number;\n series_id: number;\n season_id: number;\n race_week_name: string;\n track: TrackConfig;\n layout: string;\n start_date: string;\n end_date: string;\n qual_attached: boolean;\n race_lap_limit: number;\n race_time_limit: number;\n restart_type: number;\n zone_flag: boolean;\n time_of_day: number;\n green_flag_finish_rule: boolean;\n unofficial: boolean;\n heat_info: HeatInfo;\n practice_length: number;\n qualify_length: number;\n warmup_length: number;\n lone_qualify: boolean;\n start_on_qual_tire: boolean;\n car_class_ids: number[];\n car_types: CarType[];\n simsession_types: SimSessionType[];\n}\n\nexport interface HeatInfo {\n heat_info_id: number;\n heat_info_name: string;\n max_entrants: number;\n race_style: number;\n open_practice: number;\n pre_qual_practice_length_minutes: number;\n pre_qual_num_to_transfer: number;\n qual_style: number;\n qual_length_minutes: number;\n qual_num_to_transfer: number;\n heat_length_minutes: number;\n heat_laps: number;\n heat_max_field_size: number;\n heat_num_position_to_invert: number;\n heat_caution_type: number;\n heat_num_from_each_to_transfer: number;\n heat_scores_champ_points: boolean;\n consolation_num_to_transfer: number;\n consolation_laps: number;\n consolation_length_minutes: number;\n consolation_first_max_field_size: number;\n consolation_first_session_winner_goes_to_rear: boolean;\n consolation_num_position_to_invert: number;\n consolation_scores_champ_points: boolean;\n consolation_run_always: boolean;\n pre_main_practice_length_minutes: number;\n main_length_minutes: number;\n main_laps: number;\n main_max_field_size: number;\n main_num_position_to_invert: number;\n main_caution_type: number;\n heat_session_minutes_estimate: number;\n}\n\nexport interface SeriesStatsResponse {\n stats: SeriesStats[];\n success: boolean;\n}\n\nexport interface SeriesStats {\n series_id: number;\n series_name: string;\n series_short_name: string;\n publisher: string;\n publisher_id: number;\n category: string;\n category_id: number;\n max_starters: number;\n min_starters: number;\n official: boolean;\n fixed_setup: boolean;\n rookie_season: string;\n min_license_level: number;\n max_license_level: number;\n allowed_licenses: License[];\n car_class_ids: number[];\n car_types: CarType[];\n seasons: SeriesStatsSeason[];\n}\n\nexport interface SeriesStatsSeason {\n season_id: number;\n season_name: string;\n series_id: number;\n official: boolean;\n season_year: number;\n season_quarter: number;\n license_category: string;\n license_category_id: number;\n active: boolean;\n complete: boolean;\n car_class_ids: number[];\n}\n\n// === Statistics Response Types ===\n\nexport interface StatsMemberBestsResponse {\n cust_id: number;\n cars_driven: CarDriven[];\n success: boolean;\n}\n\nexport interface CarDriven {\n car_id: number;\n car_name: string;\n category: string;\n category_id: number;\n best_qual_time: number;\n best_race_time: number;\n tracks_driven: TrackDriven[];\n}\n\nexport interface TrackDriven {\n track_id: number;\n track_name: string;\n config_name: string;\n category: string;\n category_id: number;\n best_qual_time: number;\n best_race_time: number;\n best_qual_time_formatted: string;\n best_race_time_formatted: string;\n}\n\nexport interface StatsMemberCareerResponse {\n stats: MemberCareerStats[];\n success: boolean;\n}\n\nexport interface MemberCareerStats {\n category: string;\n category_id: number;\n starts: number;\n wins: number;\n top5: number;\n poles: number;\n avg_start_position: number;\n avg_finish_position: number;\n laps: number;\n laps_led: number;\n total_club_points: number;\n year_club_points: number;\n}\n\nexport interface StatsMemberDivisionResponse {\n division: number;\n event_type: number;\n season_id: number;\n success: boolean;\n}\n\nexport interface StatsMemberRecapResponse {\n year: number;\n season: number;\n race_weeks: RaceWeekRecap[];\n success: boolean;\n}\n\nexport interface RaceWeekRecap {\n series_name: string;\n series_id: number;\n season_name: string;\n season_id: number;\n car_class_name: string;\n car_class_id: number;\n race_week_num: number;\n start_date: string;\n end_date: string;\n track: TrackConfig;\n num_entries: number;\n points: number;\n club_points: number;\n max_club_points: number;\n dropped: boolean;\n}\n\nexport interface StatsMemberRecentRacesResponse {\n races: RecentRace[];\n success: boolean;\n}\n\nexport interface RecentRace {\n subsession_id: number;\n series_name: string;\n series_id: number;\n season_name: string;\n season_id: number;\n license_category: string;\n license_category_id: number;\n session_name: string;\n start_time: string;\n track: TrackConfig;\n car_class_name: string;\n car_class_id: number;\n car_id: number;\n aggregate_champ_points: number;\n base_champ_points: number;\n champ_points: number;\n club_points: number;\n division: number;\n finish_position: number;\n finish_position_in_class: number;\n laps_complete: number;\n laps_lead: number;\n new_i_rating: number;\n new_license_level: number;\n new_safety_rating: number;\n new_sub_level: number;\n new_tt_rating: number;\n old_i_rating: number;\n old_license_level: number;\n old_safety_rating: number;\n old_sub_level: number;\n old_tt_rating: number;\n starting_position: number;\n starting_position_in_class: number;\n weight_penalty_kg: number;\n event_type: number;\n event_type_name: string;\n driver_results: DriverResult[];\n}\n\nexport interface DriverResult {\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n finish_position: number;\n finish_position_in_class: number;\n laps_complete: number;\n laps_lead: number;\n car_class_id: number;\n car_class_name: string;\n car_id: number;\n aggregate_champ_points: number;\n champ_points: number;\n club_points: number;\n division: number;\n new_i_rating: number;\n new_license_level: number;\n new_safety_rating: number;\n new_sub_level: number;\n new_tt_rating: number;\n old_i_rating: number;\n old_license_level: number;\n old_safety_rating: number;\n old_sub_level: number;\n old_tt_rating: number;\n starting_position: number;\n starting_position_in_class: number;\n}\n\nexport interface StatsMemberSummaryResponse {\n cust_id: number;\n stats: MemberSummaryStats[];\n success: boolean;\n}\n\nexport interface MemberSummaryStats {\n category: string;\n category_id: number;\n starts: number;\n wins: number;\n top5: number;\n poles: number;\n avg_start_position: number;\n avg_finish_position: number;\n laps: number;\n laps_led: number;\n total_club_points: number;\n year_club_points: number;\n}\n\nexport interface StatsMemberYearlyResponse {\n stats: MemberYearlyStats[];\n success: boolean;\n}\n\nexport interface MemberYearlyStats {\n year: number;\n category: string;\n category_id: number;\n starts: number;\n wins: number;\n top5: number;\n poles: number;\n avg_start_position: number;\n avg_finish_position: number;\n laps: number;\n laps_led: number;\n total_club_points: number;\n year_club_points: number;\n}\n\nexport interface StatsSeasonStandingsResponse {\n season_id: number;\n car_class_id: number;\n chunk_info?: ChunkInfo;\n standings: SeasonStanding[];\n success: boolean;\n}\n\nexport interface SeasonStanding {\n rank: number;\n cust_id: number;\n display_name: string;\n helmet: Helmet;\n club_id: number;\n club_name: string;\n club_shortname: string;\n division: number;\n old_license_level: number;\n old_safety_rating: number;\n old_cpi: number;\n license: License;\n weeks_counted: number;\n starts: number;\n wins: number;\n top5: number;\n top10: number;\n