Skip to main content

PLG — P. LEAGUE+ site (pleagueofficial.com, Taiwan)

sportsdataverse.basketball.plg — 11 endpoints.

Note: Unofficial use of a public source: these wrappers read pleagueofficial.com (P. LEAGUE+, Taiwan's men's league), keyless, behind Cloudflare (the runtime needs curl_cffi: pip install curl_cffi). Release flag: the data release needs owner sign-off. The site's /user-policy (members' terms, section 11) reserves all content on the site to the service and its rights holders and forbids use, copying, adaptation or distribution without authorisation (it says nothing about automated access); robots.txt holds only Cloudflare content-signal comment lines with no Allow, Disallow or Crawl-delay rule. Use for reference only; payloads are not redistributed as release assets. The runtime waits at least 1 s before every request, retries included.

Note: Coverage: schedules, standings and player tables from 2020-21 (season=2021); box scores for every finished game from 2020-21; play-by-play (with shot x / y) from 2022-23 (gid 191 on). 2020-21 and 2021-22 pages embed an empty game uuid, so they have no play-by-play and no Preciser data. A game is keyed by gid: ONE global integer sequence over every stage and season. Only finished games are served (status 已完賽): an unplayed game, or a box or play-by-play that does not match its game page (the routes echo no id, so the runtime checks scores, quarters and points), raises AssetFetchError.

Note: Seasons are END years (2025 = the slug '2024-25'). Translation: 客隊 / 主隊 = away / home, 已完賽 = finished, 熱身賽 / 例行賽 / 季後賽 / 總冠軍賽 = pre-season / regular season / playoffs / finals, 主裁判 = referee, 第一檢查員 / 第二檢查員 = first / second umpire, 洋將 = import, 本土 = local, 勝 / 敗 = win / loss. Names stay as printed. Ids: team_id (1-8) is stable across renames; box player_id is the player-team membership; the box random_id is unreliable before 2022-23 (join on player_id, and box to Preciser shots on person_id). The date of birth is dropped from the player frame; officials appear by name only.

pleague_schedule​

Schedule and results of one season and stage (pre-season, regular season, playoffs or finals): one row per game, away team first.

Endpoint URL: GET https://pleagueofficial.com/schedule/{season}

Valid URL: https://pleagueofficial.com/schedule/2025?stage=regular-season

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYRequired. Season END year (2025 = the site's slug '2024-25'). pleague_runtime sends the slug f'{season - 1}-{season % 100:02d}'. The first season is 2020-21 (season=2021); earlier slugs redirect.
stagestageYStage: pre-season (熱身賽, exhibition games), regular-season (例行賽), playoffs (季後賽) or finals (總冠軍賽). A stage a season does not have (2025-26 pre-season) answers NoDataError.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
seasonintegerSeason END year (2025 = the site's slug '2024-25'): the first year of the slug plus one.
season_slugcharacterThe site's season slug as printed: the START year, then the END year's last two digits ('2024-25').
stagecharacterStage slug: pre-season (熱身賽, exhibition games before the season), regular-season (例行賽), playoffs (季後賽) or finals (總冠軍賽, the championship series).
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}. Cross-checked with the page's trackGame() call.
datecharacterGame date, Asia/Taipei (UTC+8) local time.
weekday_zhcharacterWeekday as one Chinese character: 日 Sun, 一 Mon, 二 Tue, 三 Wed, 四 Thu, 五 Fri, 六 Sat.
timecharacterScheduled tip-off 'HH:MM', Asia/Taipei (UTC+8) local time.
starredlogicalTrue when the date cell carries the site's star icon (a highlighted game).
game_labelcharacterGame label as printed: 'G01' = game 1 of the stage, 'PLAYOFFS Game1' / 'PLAYOFFS A G1' = playoff game (series A / B), 'FINALS G1' / 'Final Game1' = finals game, '第一站G1' = game 1 of the first 'stop' (站, a round-robin hub weekend; 2020-21).
venue_zhcharacterVenue (arena) name in Traditional Chinese.
attendanceintegerSpectators: the first number of the page's 'N / M' seat cell; 0 on future games.
capacityintegerSeats: the second number of the 'N / M' seat cell (the venue capacity as the site records it); 0 on future games.
phasecharacterRow state from the page's CSS class: before_today = the date is past (the score is the result), is_future = not yet played (both scores 0), is_today. A past game printing 0-0 may be a series game that was never played: check the game page's status.
away_team_idintegerP. LEAGUE+ club id on the site (stable across seasons AND renames): 1 = Taipei Fubon Braves, 2 = Taoyuan Pauian Pilots, 3 = Hsinchu Jko / Toplus Lioneers, 4 = Formosa Taishin Dreamers, 5 = Kaohsiung 17LIVE Steelers, 6 = New Taipei Kings, 7 = TSG Ghosthawks, 8 = Yankey Ark. NOT a Preciser team uuid (that joins through the standings team_uuid).
away_name_zhcharacterAway team's name on that date in Traditional Chinese (short or long form; 勇士 = Braves, 領航猿 = Pilots, 攻城獅 = Lioneers, 夢想家 = Dreamers, 鋼鐵人 = Steelers, 國王 = Kings, 獵鷹 = Ghosthawks, 洋基工程 = Yankey Ark). Printed names change by season (short and long forms, renames): key on the id, not the name.
away_name_encharacterAway team's English name on that date; renames change it. Null on 2020-21 game pages (no English name is printed).
away_logocharacterAway team logo url as printed by the page: protocol-relative ('//d36fypkbmmogz6.cloudfront.net/upload/p_team/logo_{team}_{epoch}.png'); some game pages print a malformed 'https:////d36...'. The trailing number is the upload time.
away_scoreintegerAway team's final points (0 on a future game).
home_team_idintegerP. LEAGUE+ club id on the site (stable across seasons AND renames): 1 = Taipei Fubon Braves, 2 = Taoyuan Pauian Pilots, 3 = Hsinchu Jko / Toplus Lioneers, 4 = Formosa Taishin Dreamers, 5 = Kaohsiung 17LIVE Steelers, 6 = New Taipei Kings, 7 = TSG Ghosthawks, 8 = Yankey Ark. NOT a Preciser team uuid (that joins through the standings team_uuid).
home_name_zhcharacterHome team's name on that date in Traditional Chinese (short or long form). Printed names change by season (short and long forms, renames): key on the id, not the name.
home_name_encharacterHome team's English name on that date; renames change it. Null on 2020-21 game pages (no English name is printed).
home_logocharacterHome team logo url as printed by the page: protocol-relative ('//d36fypkbmmogz6.cloudfront.net/upload/p_team/logo_{team}_{epoch}.png'); some game pages print a malformed 'https:////d36...'. The trailing number is the upload time.
home_scoreintegerHome team's final points (0 on a future game).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_schedule(season=2025)

Last validated n/a.

pleague_game​

Header of one finished game: date, venue, both clubs with their score and the Preciser game uuid.

Endpoint URL: GET https://pleagueofficial.com/game/{gid}

Valid URL: https://pleagueofficial.com/game/197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
uuidcharacterPreciser game uuid (key space: the analytics vendor's games, a version-1 uuid), embedded in the game page as getPlayByPlay('uuid'); keys the play-by-play and every pleague_preciser wrapper. Null before 2022-23 (the page embeds an empty string: no play-by-play or vendor data).
status_zhcharacterStatus badge: 已完賽 = finished. The only value the wrappers serve (anything else raises AssetFetchError).
finishedlogicalTrue when the status badge is 已完賽 (finished); always true for a served game.
datecharacterGame date from the header, Asia/Taipei (UTC+8) local time.
timecharacterTip-off 'HH:MM' from the header, Asia/Taipei (UTC+8) local time.
venue_zhcharacterVenue (arena) name in Traditional Chinese.
game_label_zhcharacterStage and game number as printed in the header: '例行賽G1' = regular season game 1 ('例行賽G01' on 2020-21 pages); 季後賽 = playoffs, 總冠軍賽 = finals.
away_name_zhcharacterAway team's name on that date in Traditional Chinese (short or long form; 勇士 = Braves, 領航猿 = Pilots, 攻城獅 = Lioneers, 夢想家 = Dreamers, 鋼鐵人 = Steelers, 國王 = Kings, 獵鷹 = Ghosthawks, 洋基工程 = Yankey Ark). Printed names change by season (short and long forms, renames): key on the id, not the name.
away_name_encharacterAway team's English name on that date; renames change it. Null on 2020-21 game pages (no English name is printed).
away_logocharacterAway team logo url as printed by the page: protocol-relative ('//d36fypkbmmogz6.cloudfront.net/upload/p_team/logo_{team}_{epoch}.png'); some game pages print a malformed 'https:////d36...'. The trailing number is the upload time.
away_scoreintegerAway team's final points (0 on a future game).
home_name_zhcharacterHome team's name on that date in Traditional Chinese (short or long form). Printed names change by season (short and long forms, renames): key on the id, not the name.
home_name_encharacterHome team's English name on that date; renames change it. Null on 2020-21 game pages (no English name is printed).
home_logocharacterHome team logo url as printed by the page: protocol-relative ('//d36fypkbmmogz6.cloudfront.net/upload/p_team/logo_{team}_{epoch}.png'); some game pages print a malformed 'https:////d36...'. The trailing number is the upload time.
home_scoreintegerHome team's final points (0 on a future game).
overtimesintegerNumber of overtime periods played (overtime cells with points on the page).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_game(gid=197)

Last validated n/a.

pleague_periods​

Points each team scored in each quarter and overtime of one finished game.

Endpoint URL: GET https://pleagueofficial.com/game/{gid}

Valid URL: https://pleagueofficial.com/game/197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
periodcharacterPeriod label: Q1-Q4, then OT1, OT2 for overtime.
period_nointeger1-based position of the period: 1-4 for Q1-Q4, then 5 for OT1, 6 for OT2.
home_pointsintegerHome points scored IN the period (not cumulative).
away_pointsintegerAway points scored IN the period (not cumulative).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_periods(gid=197)

Last validated n/a.

pleague_officials​

The referee and the two umpires printed under the header of one finished game (names only).

Endpoint URL: GET https://pleagueofficial.com/game/{gid}

Valid URL: https://pleagueofficial.com/game/197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
official_nointeger1-based position of the official in the printed line (referee first).
rolecharacterRole translated: referee (主裁判, the crew chief), first_umpire (第一檢查員, literally 'first inspector'), second_umpire (第二檢查員). Null for a role this table does not know.
role_zhcharacterOfficial's role as printed: 主裁判 = referee, 第一檢查員 = first umpire, 第二檢查員 = second umpire.
name_zhcharacterOfficial's name in Traditional Chinese. Names only: the page carries no ids or contact data.

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_officials(gid=197)

Last validated n/a.

pleague_box_players​

Player box score of one finished game: minutes, points, shooting splits, rebounds, assists, plus/minus, and the ratings from 2022-23; did-not-play rows included.

Endpoint URL: GET https://pleagueofficial.com/api/boxscore.preciser.php

Valid URL: https://pleagueofficial.com/api/boxscore.preciser.php?gid=197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
sidecharacterWhich team the row belongs to: home or away. The box lists home first, the play-by-play and the schedule list away first.
player_idintegerP. LEAGUE+ player-team membership id on the site (key space: the member id the player page passes to trackPlayer(), e.g. 40 = Lai Ting-En), cast to an integer. NOT the 8-character page id. Join box rows on it, never on the printed name.
person_idcharacterPreciser person uuid (key space: the analytics vendor's persons): the join between a box row and a pleague_preciser_shots row. Present on played rows from 2022-23; null on 2020-21 and 2021-22 rows and did-not-play rows (the refs notes report some 2025-26 finals boxes without it; gid 716 has it).
random_idcharacterThe 8-character page id of /player/{id} (same space as player_page_id). Reliable from 2022-23 only: on 2020-21 and 2021-22 rows it is wrong for most players (gid 13 gives Lai Ting-En the page of Kao Kuo-Hao), so never join across eras on it.
name_zhcharacterPlayer name as printed (Traditional Chinese, or a transliteration for foreign players).
jerseycharacterShirt number as printed, a string ('0', '00' and '10' differ).
starterlogicalTrue for a starter (the site's '〇' marker). Null on did-not-play rows.
playedlogicalTrue when the player has court time; false on a 'DNP' (did not play) row, whose statistics are null.
minutescharacterMinutes played 'mm:ss'. Null on did-not-play rows.
secondsintegerPlaying time in whole seconds: the site's seconds column in 2020-21 and 2021-22, derived from minutes from 2022-23. Null on did-not-play rows.
pointsintegerPoints scored. Null on did-not-play rows.
reb_offintegerOffensive rebounds. Null on did-not-play rows.
reb_defintegerDefensive rebounds. Null on did-not-play rows.
rebintegerTotal rebounds (offensive plus defensive). Null on did-not-play rows.
astintegerAssists. Null on did-not-play rows.
stlintegerSteals. Null on did-not-play rows.
blkintegerBlocks made. Null on did-not-play rows.
tovintegerTurnovers committed. Null on did-not-play rows.
pfintegerPersonal fouls committed. Null on did-not-play rows.
plus_minusintegerPlus/minus: the team's points minus the opponent's while the player was on court (signed). Null on did-not-play rows.
effintegerEfficiency: points + rebounds + assists + steals + blocks - missed field goals - missed free throws - turnovers (verified on every 2020-21 and 2021-22 row). Null on did-not-play rows.
fg2_madeinteger2-point field goals made, from the site's 'made-attempted' string. Null on did-not-play rows.
fg2_attinteger2-point field goals attempted, from the site's 'made-attempted' string. Null on did-not-play rows.
fg2_pctnumeric2-point field-goal percentage, 0-100 (the site sends a number or a string). Null on did-not-play rows.
fg3_madeinteger3-point field goals made, from the site's 'made-attempted' string. Null on did-not-play rows.
fg3_attinteger3-point field goals attempted, from the site's 'made-attempted' string. Null on did-not-play rows.
fg3_pctnumeric3-point field-goal percentage, 0-100. Null on did-not-play rows.
ft_madeintegerFree throws made, from the site's 'made-attempted' string. Null on did-not-play rows.
ft_attintegerFree throws attempted, from the site's 'made-attempted' string. Null on did-not-play rows.
ft_pctnumericFree-throw percentage, 0-100. Null on did-not-play rows.
efg_pctnumericEffective field-goal percentage 0-100, (FGM + 0.5 x 3PM) / FGA x 100 (verified). 2020-21 and 2021-22 rows only; null from 2022-23.
ts_pctnumericTrue-shooting percentage 0-100, PTS / (2 x (FGA + 0.44 x FTA)) x 100 (verified). 2020-21 and 2021-22 rows only; null from 2022-23.
usage_pctnumericUsage percentage as the site prints it, 0-100; the standard usage formula reproduces it on only 685 of 3,932 rows, so the formula is unverified. 2020-21 and 2021-22 rows only.
positioncharacterPosition code on some 2020-21 and 2021-22 rows ('G' guard, 'F' forward, 'C' centre); null on the rest and from 2022-23.
ortgnumericOffensive rating: the team's points scored per 100 offensive possessions while the player was on court (2022-23 on; null before). Null on did-not-play rows.
drtgnumericDefensive rating: the opponent's points per 100 of its possessions while the player was on court, lower is better (2022-23 on). Null on did-not-play rows.
netrtgnumericNet rating, ortg minus drtg (exact on every checked row; 2022-23 on). Null on did-not-play rows.
pacenumericPace: 48 x the team's offensive possessions / minutes on court, the team's possessions per 48 minutes with this player on court (verified on 1,124 of 1,149 rows; 2022-23 on). Null on did-not-play rows.
ast_rationumericAssist ratio 0-100: assists per 100 of the player's own plays. The common formula AST / (FGA + 0.5 x FTA + AST + TOV) reproduces it on 919 of 1,174 rows, so the exact formula is unverified (2022-23 on).
to_rationumericTurnover ratio 0-100: turnovers per 100 of the player's own plays; same unverified formula family as ast_ratio (917 of 1,174 rows; 2022-23 on).
off_possessionsintegerThe team's offensive possessions while the player was on court (the base of ortg; 2022-23 on). Null on did-not-play rows.
opp_off_possessionsintegerThe opponent's offensive possessions while the player was on court (the base of drtg; 2022-23 on). Null on did-not-play rows.
opp_pts_second_chanceintegerOpponent second-chance points while the player was on court (2022-23 on). Null on did-not-play rows.
opp_pts_fast_breakintegerOpponent fast-break points while the player was on court (2022-23 on). Null on did-not-play rows.
opp_pts_off_turnoverintegerOpponent points off turnovers while the player was on court (2022-23 on). Null on did-not-play rows.
opp_pts_paintintegerOpponent points in the paint while the player was on court (2022-23 on). Null on did-not-play rows.

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_box_players(gid=197)

Last validated n/a.

pleague_box_teams​

Team totals of one finished game: the box score's total row, home then away.

Endpoint URL: GET https://pleagueofficial.com/api/boxscore.preciser.php

Valid URL: https://pleagueofficial.com/api/boxscore.preciser.php?gid=197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
sidecharacterWhich team the row belongs to: home or away. The box lists home first, the play-by-play and the schedule list away first.
minutescharacterTeam minutes 'mm:ss' ('240:00' = 5 players x 48 min; more with overtime).
secondsintegerTeam seconds on court (14400 = 240 minutes): the site's value in 2020-21 and 2021-22, derived from minutes from 2022-23.
pointsintegerTeam points; equals the final score (the runtime checks it).
fg2_madeintegerTeam 2-point field goals made.
fg2_attintegerTeam 2-point field goals attempted.
fg2_pctnumericTeam 2-point percentage, 0-100.
fg3_madeintegerTeam 3-point field goals made.
fg3_attintegerTeam 3-point field goals attempted.
fg3_pctnumericTeam 3-point percentage, 0-100.
ft_madeintegerTeam free throws made.
ft_attintegerTeam free throws attempted.
ft_pctnumericTeam free-throw percentage, 0-100.
rebintegerTeam total rebounds, including team rebounds that no player row carries (so it can exceed the sum of the player rows).
reb_offintegerTeam offensive rebounds.
reb_defintegerTeam defensive rebounds.
astintegerTeam assists in the game (the total row).
stlintegerTeam steals in the game.
blkintegerTeam blocks made in the game.
tovintegerTeam turnovers.
pfintegerTeam personal fouls.
plus_minusintegerSum of the players' plus/minus (2020-21 and 2021-22 only; null from 2022-23).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_box_teams(gid=197)

Last validated n/a.

pleague_pbp​

Play-by-play of one finished game (2022-23 on) in game order, with shot x / y and the clip references.

Endpoint URL: GET https://pleagueofficial.com/api/playbyplay.php

Valid URL: https://pleagueofficial.com/api/playbyplay.php?gid=197

API ParameterPythonPatternRequiredNullableDescription
gidgidYRequired. P. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (197 = the 2022-23 opener, 662 = the 2025-26 opener), e.g. 197; gid in pleague_schedule. Only finished games are served.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
gidintegerP. LEAGUE+ game id on the site: ONE global integer sequence over every stage and season (1-12 = 2020-21 pre-season, 13 = the 2020-21 opener, 197 = the 2022-23 opener, 662 = the 2025-26 opener), with gaps; a row id, not a count. The {gid} of /game/{gid}.
seqintegerPosition of the play in game order, 1-based (the fragment lists plays oldest first within the fragment).
periodcharacterPeriod label: Q1-Q4, then OT1, OT2 for overtime.
period_nointeger1-based position of the period: 1-4 for Q1-Q4, then 5 for OT1, 6 for OT2.
clockcharacterGame clock REMAINING in the period 'mm:ss' (counts down; Q1 opens at 12:00, OT at 05:00).
seconds_leftintegerThe clock as whole seconds remaining in the period (08:34 = 514), derived by the parser.
sidecharacterSide of the acting team: away or home (the fragment places the play in the away or home column).
jerseycharacterShirt number of the acting player as printed; null on team rows and where the name is printed without a number.
player_zhcharacterActing player's name as printed; null on team rows (a team rebound, timeout or shot-clock violation). The page prints no player ids: join to the box on side, jersey and name_zh.
actioncharacterAction code from the vocabulary observed on 258,183 plays of 404 finished 2022-23..2025-26 games (82 phrases plus the blank row; an unseen phrase is refused as layout drift). The code = meaning [Traditional Chinese phrase, events]: ast = assist [助攻, 17,020]; blk = block [阻攻, 3,181]; fg2_alley_oop_made = 2-point alley-oop, made [alleyOop得分, 205]; fg2_alley_oop_missed = 2-point alley-oop, missed [alleyOop不進, 81]; fg2_driving_layup_made = 2-point driving layup, made [突破上籃得分, 4,281]; fg2_driving_layup_missed = 2-point driving layup, missed [突破上籃不進, 3,961]; fg2_dunk_made = 2-point dunk, made [灌籃得分, 1,316]; fg2_dunk_missed = 2-point dunk, missed [灌籃不進, 162]; fg2_fadeaway_jumper_made = 2-point fadeaway jumper, made [後仰跳投得分, 583]; fg2_fadeaway_jumper_missed = 2-point fadeaway jumper, missed [後仰跳投不進, 1,121]; fg2_floater_made = 2-point floater, made [拋投得分, 1,920]; fg2_floater_missed = 2-point floater, missed [拋投不進, 3,052]; fg2_hook_shot_made = 2-point hook shot, made [勾射得分, 610]; fg2_hook_shot_missed = 2-point hook shot, missed [勾射不進, 773]; fg2_jump_shot_made = 2-point jump shot, made [跳投得分, 1,657]; fg2_jump_shot_missed = 2-point jump shot, missed [跳投不進, 3,606]; fg2_layup_made = 2-point layup, made [上籃得分, 4,428]; fg2_layup_missed = 2-point layup, missed [上籃不進, 3,403]; fg2_pull_up_jumper_made = 2-point pull-up jumper, made [急停跳投得分, 1,004]; fg2_pull_up_jumper_missed = 2-point pull-up jumper, missed [急停跳投不進, 1,564]; fg2_putback_made = 2-point putback / tip-in, made [補籃得分, 2,138]; fg2_putback_missed = 2-point putback / tip-in, missed [補籃不進, 1,539]; fg2_step_back_shot_made = 2-point step-back shot, made [後撤步投籃得分, 243]; fg2_step_back_shot_missed = 2-point step-back shot, missed [後撤步投籃不進, 410]; fg2_turnaround_jumper_made = 2-point turnaround jumper, made [轉身跳投得分, 672]; fg2_turnaround_jumper_missed = 2-point turnaround jumper, missed [轉身跳投不進, 1,158]; fg3_fadeaway_jumper_made = 3-point fadeaway jumper, made [三分外線後仰跳投得分, 48]; fg3_fadeaway_jumper_missed = 3-point fadeaway jumper, missed [三分外線後仰跳投不進, 92]; fg3_made = 3-point shot, style not recorded, made [三分球得分, 7,817]; fg3_missed = 3-point shot, style not recorded, missed [三分球不進, 17,046]; fg3_pull_up_jumper_made = 3-point pull-up jumper, made [三分外線急停跳投得分, 480]; fg3_pull_up_jumper_missed = 3-point pull-up jumper, missed [三分外線急停跳投不進, 922]; fg3_step_back_shot_made = 3-point step-back shot, made [三分外線後撤步投籃得分, 245]; fg3_step_back_shot_missed = 3-point step-back shot, missed [三分外線後撤步投籃不進, 559]; fg3_turnaround_jumper_made = 3-point turnaround jumper, made [三分外線轉身跳投得分, 10]; fg3_turnaround_jumper_missed = 3-point turnaround jumper, missed [三分外線轉身跳投不進, 23]; fg_made = field goal made, shot type and distance not recorded [得分, 158]; fg_missed = field goal missed, shot type and distance not recorded [不進, 168]; foul = foul, kind not recorded (team row) [犯規, 18]; foul_bench_technical = technical foul on the bench [犯規benchTechnical, 35]; foul_coach_technical = technical foul on the coach [犯規coachTechnical, 75]; foul_disqualifying = disqualifying foul [犯規disqualifying, 2]; foul_drawn = foul drawn (the opponent's foul on this player) [造成對手犯規, 17,035]; foul_offensive = offensive foul committed [進攻犯規, 1,024]; foul_personal = personal foul committed [個人犯規, 15,745]; foul_technical = technical foul [技術犯規, 210]; foul_unsportsmanlike = unsportsmanlike foul [違反運動道德犯規, 261]; ft_made = free throw 1 of 1 awarded, made [得到一次罰球 第一罰 罰進, 1,326]; ft_made = free throw 1 of 3 awarded, made [得到三次罰球 第一罰 罰進, 128]; ft_made = free throw 1 of 2 awarded, made [得到兩次罰球 第一罰 罰進, 5,187]; ft_made = free throw 3, made [第三罰 罰進, 149]; ft_made = free throw 2, made [第二罰 罰進, 5,798]; ft_missed = free throw 1 of 1 awarded, missed [得到一次罰球 第一罰 不進, 669]; ft_missed = free throw 1 of 3 awarded, missed [得到三次罰球 第一罰 不進, 67]; ft_missed = free throw 1 of 2 awarded, missed [得到兩次罰球 第一罰 不進, 2,736]; ft_missed = free throw 3, missed [第三罰 不進, 46]; ft_missed = free throw 2, missed [第二罰 不進, 2,319]; jump_ball_lost = jump ball lost [跳球 輸, 404]; jump_ball_won = jump ball won [跳球 贏, 708]; reb_def = defensive rebound (a team rebound has no player) [搶到防守籃板, 29,537]; reb_off = offensive rebound (a team rebound has no player) [搶到進攻籃板, 12,379]; review_coach_challenge = video review: coach's challenge (2025-26 onward; the printed text ends with a bare comma) [videoReview, coachChallenge,, 82]; review_instant_replay = video review: instant-replay system, started by the officials (2025-26 onward) [videoReview, instantReplaySystem,, 67]; review_instant_replay_1 = video review: instant-replay system, variant printed with a trailing '1' (meaning unexplained; the row also prints the running score and the points tag '+videoReview') [videoReview, instantReplaySystem, 1, 6]; stl = steal [抄截, 7,361]; sub_in = substitution: enters the game [替換上場, 25,505]; sub_out = substitution: leaves the game [下場休息, 25,532]; timeout = timeout (a team row) [暫停, 2,854]; tov_3sec = turnover: 3-second violation [3Sec 失誤, 249]; tov_5sec = turnover: 5-second violation [5Sec 失誤, 40]; tov_8sec = turnover: 8-second violation [8Sec 失誤, 26]; tov_backcourt = turnover: backcourt violation [backCourt 失誤, 96]; tov_bad_pass = turnover: bad pass [傳球失誤, 6,325]; tov_ball_handling = turnover: ball-handling [控球失誤, 3,547]; tov_carrying = turnover: carrying the ball [carrying 失誤, 47]; tov_double_dribble = turnover: double dribble [doubleDribble 失誤, 53]; tov_offensive = turnover: offensive (kind not recorded) [進攻失誤, 1,007]; tov_offensive_goaltending = turnover: offensive goaltending [offensiveGoalTending 失誤, 4]; tov_other = turnover: other [其他失誤, 51]; tov_out_of_bounds = turnover: ball out of bounds [球出界, 441]; tov_shot_clock = turnover: shot-clock violation [shotClock 失誤, 489]; tov_travel = turnover: travelling [帶球走步, 718]; unlabelled = row has a player but no action text; in the corpus a shot with x/y followed by a rebound, i.e. a missed shot (inferred) [(blank), 169].
action_zhcharacterThe action phrase as printed, Traditional Chinese (灌籃得分 = dunk, made; '#35 辛巴 灌籃得分' = '#35 {player} dunk, made'); blank on an unlabelled row. The 82 observed phrases = action code (events): 搶到防守籃板 = reb_def (29,537); 下場休息 = sub_out (25,532); 替換上場 = sub_in (25,505); 三分球不進 = fg3_missed (17,046); 造成對手犯規 = foul_drawn (17,035); 助攻 = ast (17,020); 個人犯規 = foul_personal (15,745); 搶到進攻籃板 = reb_off (12,379); 三分球得分 = fg3_made (7,817); 抄截 = stl (7,361); 傳球失誤 = tov_bad_pass (6,325); 第二罰 罰進 = ft_made (5,798); 得到兩次罰球 第一罰 罰進 = ft_made (5,187); 上籃得分 = fg2_layup_made (4,428); 突破上籃得分 = fg2_driving_layup_made (4,281); 突破上籃不進 = fg2_driving_layup_missed (3,961); 跳投不進 = fg2_jump_shot_missed (3,606); 控球失誤 = tov_ball_handling (3,547); 上籃不進 = fg2_layup_missed (3,403); 阻攻 = blk (3,181); 拋投不進 = fg2_floater_missed (3,052); 暫停 = timeout (2,854); 得到兩次罰球 第一罰 不進 = ft_missed (2,736); 第二罰 不進 = ft_missed (2,319); 補籃得分 = fg2_putback_made (2,138); 拋投得分 = fg2_floater_made (1,920); 跳投得分 = fg2_jump_shot_made (1,657); 急停跳投不進 = fg2_pull_up_jumper_missed (1,564); 補籃不進 = fg2_putback_missed (1,539); 得到一次罰球 第一罰 罰進 = ft_made (1,326); 灌籃得分 = fg2_dunk_made (1,316); 轉身跳投不進 = fg2_turnaround_jumper_missed (1,158); 後仰跳投不進 = fg2_fadeaway_jumper_missed (1,121); 進攻犯規 = foul_offensive (1,024); 進攻失誤 = tov_offensive (1,007); 急停跳投得分 = fg2_pull_up_jumper_made (1,004); 三分外線急停跳投不進 = fg3_pull_up_jumper_missed (922); 勾射不進 = fg2_hook_shot_missed (773); 帶球走步 = tov_travel (718); 跳球 贏 = jump_ball_won (708); 轉身跳投得分 = fg2_turnaround_jumper_made (672); 得到一次罰球 第一罰 不進 = ft_missed (669); 勾射得分 = fg2_hook_shot_made (610); 後仰跳投得分 = fg2_fadeaway_jumper_made (583); 三分外線後撤步投籃不進 = fg3_step_back_shot_missed (559); shotClock 失誤 = tov_shot_clock (489); 三分外線急停跳投得分 = fg3_pull_up_jumper_made (480); 球出界 = tov_out_of_bounds (441); 後撤步投籃不進 = fg2_step_back_shot_missed (410); 跳球 輸 = jump_ball_lost (404); 違反運動道德犯規 = foul_unsportsmanlike (261); 3Sec 失誤 = tov_3sec (249); 三分外線後撤步投籃得分 = fg3_step_back_shot_made (245); 後撤步投籃得分 = fg2_step_back_shot_made (243); 技術犯規 = foul_technical (210); alleyOop得分 = fg2_alley_oop_made (205); (blank) = unlabelled (169); 不進 = fg_missed (168); 灌籃不進 = fg2_dunk_missed (162); 得分 = fg_made (158); 第三罰 罰進 = ft_made (149); 得到三次罰球 第一罰 罰進 = ft_made (128); backCourt 失誤 = tov_backcourt (96); 三分外線後仰跳投不進 = fg3_fadeaway_jumper_missed (92); videoReview, coachChallenge, = review_coach_challenge (82); alleyOop不進 = fg2_alley_oop_missed (81); 犯規coachTechnical = foul_coach_technical (75); 得到三次罰球 第一罰 不進 = ft_missed (67); videoReview, instantReplaySystem, = review_instant_replay (67); doubleDribble 失誤 = tov_double_dribble (53); 其他失誤 = tov_other (51); 三分外線後仰跳投得分 = fg3_fadeaway_jumper_made (48); carrying 失誤 = tov_carrying (47); 第三罰 不進 = ft_missed (46); 5Sec 失誤 = tov_5sec (40); 犯規benchTechnical = foul_bench_technical (35); 8Sec 失誤 = tov_8sec (26); 三分外線轉身跳投不進 = fg3_turnaround_jumper_missed (23); 犯規 = foul (18); 三分外線轉身跳投得分 = fg3_turnaround_jumper_made (10); videoReview, instantReplaySystem, 1 = review_instant_replay_1 (6); offensiveGoalTending 失誤 = tov_offensive_goaltending (4); 犯規disqualifying = foul_disqualifying (2).
action_encharacterEnglish meaning of the action code (see action); null for a code outside the observed table.
text_zhcharacterThe whole printed text of the play, e.g. '#35 辛巴 灌籃得分' = '#35 {player} dunk, made'.
ft_numberintegerWhich free throw of the trip this is (1, 2 or 3), from 第一罰 / 第二罰 / 第三罰; null on every other play.
ft_awardedintegerFree throws awarded in the trip (1, 2 or 3) from 得到一次罰球 / 得到兩次罰球 / 得到三次罰球; set only on the FIRST free throw's row, null otherwise.
pointsintegerPoints scored by the play from the '+2' / '+3' / '+1' tag; null when the tag is a bare '+'.
score_awayintegerAway score after the play, from the 'A - H' cell (AWAY first, unlike the box); null on plays that print no score (substitutions, rebounds, jump balls).
score_homeintegerHome score after the play, from the 'A - H' cell; null when the play prints no score.
xnumericShot / play x: PERCENT (0-100) of the court LENGTH in the PHYSICAL court frame (not normalised per team): baskets near x = 5 and x = 95, teams swap ends at half-time. The Preciser shot list uses a home-attacks-95 frame: x_vendor = 100 - x in the halves where the home team attacks x < 50. Null on plays without a location. Court 28.75 m long.
ynumericShot / play y: PERCENT (0-100) of the court WIDTH in the physical frame (baskets at y = 50); y_vendor = 100 - y in the halves where the home team attacks x < 50. Which sideline is y = 0 is unverified. Court 15.25 m wide.
nice_playlogicalTrue when the site stars the play (a nice_play row class and a starred clip).
video_uuidcharacterClip uuid (key space: the clip vendor tryspot); null on plays without a clip (about 3 in 4). The clip urls are never kept: they carry a vendor access key.
synergy_play_idcharacterSynergy Sports play uuid of the clip (the site links Synergy); a string on every one of the 50,862 clips in the corpus.
video_stat_categorycharacterThe clip's own stat label (ast, blk, ft_made, ft_miss, pfoul, reb_d, reb_o, stl, three_made, three_miss, timeout, turnover, two_made, two_miss): it names the PLAY the clip shows, not always this row's action (a rebound row carries the missed shot's clip).
tryspot_player_idintegerPlayer id in the clip vendor's key space (an integer such as 59476); NOT the box player_id.
video_created_atcharacterWhen the clip was created, UTC ISO 8601 with milliseconds.

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_pbp(gid=197)

Last validated n/a.

pleague_standings​

Regular-season standings of one season: record, scoring averages, home / away and recent form.

Endpoint URL: GET https://pleagueofficial.com/standings/{season}

Valid URL: https://pleagueofficial.com/standings/2025

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYRequired. Season END year (2025 = the site's slug '2024-25'). pleague_runtime sends the slug f'{season - 1}-{season % 100:02d}'. The first season is 2020-21 (season=2021); earlier slugs redirect.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
seasonintegerSeason END year (2025 = the site's slug '2024-25'): the first year of the slug plus one.
season_slugcharacterThe site's season slug as printed: the START year, then the END year's last two digits ('2024-25').
rankintegerRank on the page (1 = best); ties are not shared.
team_idintegerP. LEAGUE+ club id on the site (stable across seasons AND renames): 1 = Taipei Fubon Braves, 2 = Taoyuan Pauian Pilots, 3 = Hsinchu Jko / Toplus Lioneers, 4 = Formosa Taishin Dreamers, 5 = Kaohsiung 17LIVE Steelers, 6 = New Taipei Kings, 7 = TSG Ghosthawks, 8 = Yankey Ark. NOT a Preciser team uuid (that joins through the standings team_uuid).
team_zhcharacterTeam short name in Traditional Chinese.
team_uuidcharacterPreciser team uuid cut from the logo url (photonew.preciser.io/plg/teams/{uuid}.png): the join between the site team_id and the vendor's home_id / away_id / team_id. Clubs: 1 = e86394aa-3d88-11ed-8ba8-7f44ba46b0b1 (勇士, Taipei Fubon Braves); 2 = e865bb20-3d88-11ed-a956-7f44ba46b0b1 (領航猿, Taoyuan Pauian Pilots (Taoyuan Pilots from 2024-25)); 3 = e8674343-3d88-11ed-98b4-7f44ba46b0b1 (攻城獅, Hsinchu Jko Lioneers (Toplus Lioneers from 2023-24)); 4 = e869743f-3d88-11ed-925e-7f44ba46b0b1 (夢想家, Formosa Taishin Dreamers (Formosa Dreamers from 2022-23)); 5 = e86cac11-3d88-11ed-8637-7f44ba46b0b1 (鋼鐵人, Kaohsiung 17LIVE Steelers); 6 = e86b0ecc-3d88-11ed-bed5-7f44ba46b0b1 (國王, New Taipei Kings); 7 = 3c3a601a-358a-11ed-ab92-711c34ed1298 (獵鷹, TSG Ghosthawks); 8 = bf957f5a-9389-11f0-812c-a38482ec4d30 (洋基工程, Yankey Ark).
team_logocharacterTeam logo url (photonew.preciser.io/plg/teams/{team uuid}.png).
games_playedintegerGames played (已賽 GP).
winsintegerGames won so far this season (勝 W).
lossesintegerGames lost so far this season (敗 L).
win_pctnumericWin percentage 0-100 as a whole percent ('68%' -> 68.0; 勝率 PCT).
games_behindnumericGames behind the leader (勝差).
points_for_avgnumericPoints scored per game (平均得分).
points_against_avgnumericPoints allowed per game (平均失分).
point_diff_avgnumericAverage point margin (平均分差).
home_recordcharacterHome record 'W-L' (主場).
away_recordcharacterAway record 'W-L' (客場).
streakcharacterCurrent streak: W{n} wins or L{n} losses (連勝連敗).
last_nintegerGames in the 'last games' column (近10場比賽 = the last 10), read from the header.
last_n_recordcharacterRecord 'W-L' over the last last_n games (近N場比賽).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_standings(season=2025)

Last validated n/a.

pleague_stat_player​

Player season averages and totals of one season and stage: shooting, rebounds, assists and fouls.

Endpoint URL: GET https://pleagueofficial.com/stat-player/{season}/{stage_sn}

Valid URL: https://pleagueofficial.com/stat-player/2025/2

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYRequired. Season END year (2025 = the site's slug '2024-25'). pleague_runtime sends the slug f'{season - 1}-{season % 100:02d}'. The first season is 2020-21 (season=2021); earlier slugs redirect.
stage_snstage_snYRequired. Stage select value of the player table: 2 = regular season, 3 = playoffs, 4 = finals.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
seasonintegerSeason END year (2025 = the site's slug '2024-25'): the first year of the slug plus one.
season_slugcharacterThe site's season slug as printed: the START year, then the END year's last two digits ('2024-25').
stage_snintegerStage select value: 2 = regular season, 3 = playoffs, 4 = finals (echo of the request, checked against the page's selected option).
stagecharacterStage slug: pre-season (熱身賽, exhibition games before the season), regular-season (例行賽), playoffs (季後賽) or finals (總冠軍賽, the championship series).
player_page_idcharacterThe 8-character page id of /player/{id} (e.g. '1JbPozLB'). The box random_id on 2022-23+ rows; NOT the box player_id.
name_zhcharacterPlayer name as printed (Traditional Chinese, or a transliteration for foreign players).
jerseycharacterShirt number as a string (the player's number in the latest game).
team_zhcharacterTeam name in Traditional Chinese as the page prints it (a traded player shows the current team).
gamesintegerGames played (出賽).
minutes_avgcharacterMinutes per game 'mm:ss' (上場時間).
minutes_totalcharacterTotal minutes 'mmm:ss' (上場時間).
fg2_made_avgnumericPer-game average of 2-point makes (兩分命中).
fg2_made_totalintegerSeason total of 2-point makes (兩分命中).
fg2_att_avgnumericPer-game average of 2-point attempts (兩分出手).
fg2_att_totalintegerSeason total of 2-point attempts (兩分出手).
fg3_made_avgnumericPer-game average of 3-point makes (三分命中).
fg3_made_totalintegerSeason total of 3-point makes (三分命中).
fg3_att_avgnumericPer-game average of 3-point attempts (三分出手).
fg3_att_totalintegerSeason total of 3-point attempts (三分出手).
ft_made_avgnumericPer-game average of free-throw makes (罰球命中).
ft_made_totalintegerSeason total of free-throw makes (罰球命中).
ft_att_avgnumericPer-game average of free-throw attempts (罰球出手).
ft_att_totalintegerSeason total of free-throw attempts (罰球出手).
points_avgnumericPer-game average of points (得分).
points_totalintegerSeason total of points (得分).
reb_off_avgnumericPer-game average of offensive rebounds (攻板).
reb_off_totalintegerSeason total of offensive rebounds (攻板).
reb_def_avgnumericPer-game average of defensive rebounds (防板).
reb_def_totalintegerSeason total of defensive rebounds (防板).
reb_avgnumericPer-game average of total rebounds (籃板).
reb_totalintegerSeason total of total rebounds (籃板).
ast_avgnumericPer-game average of assists (助攻).
ast_totalintegerSeason total of assists (助攻).
stl_avgnumericPer-game average of steals (抄截).
stl_totalintegerSeason total of steals (抄截).
blk_avgnumericPer-game average of blocks (阻攻).
blk_totalintegerSeason total of blocks (阻攻).
tov_avgnumericPer-game average of turnovers (失誤).
tov_totalintegerSeason total of turnovers (失誤).
pf_avgnumericPer-game average of personal fouls (犯規).
pf_totalintegerSeason total of personal fouls (犯規).
fg2_pctnumeric2-point percentage 0-100 (兩分命中率; the cell holds the same value as average and total).
fg3_pctnumeric3-point percentage 0-100 (三分命中率; same value as average and total).
ft_pctnumericFree-throw percentage 0-100 (罰球命中率; same value as average and total).

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_stat_player(season=2025, stage_sn=2)

Last validated n/a.

pleague_player​

One player's profile: names, club, jersey, position, height, weight and birthplace.

Endpoint URL: GET https://pleagueofficial.com/player/{player_page_id}

Valid URL: https://pleagueofficial.com/player/1JbPozLB

API ParameterPythonPatternRequiredNullableDescription
player_page_idplayer_page_idYRequired. The 8-character page id of /player/{id} (e.g. '1JbPozLB' = Lai Ting-En); player_page_id in pleague_stat_player, random_id in pleague_box_players from 2022-23 (unreliable before).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
player_page_idcharacterThe 8-character page id of /player/{id} (e.g. '1JbPozLB'). The box random_id on 2022-23+ rows; NOT the box player_id.
player_idintegerP. LEAGUE+ player-team membership id (the box player_id), read from the page's trackPlayer() call, e.g. 40 = Lai Ting-En. NOT the 8-character page id.
name_zhcharacterPlayer name as printed (Traditional Chinese, or a transliteration for foreign players).
name_encharacterPlayer name in Latin letters.
team_zhcharacterCurrent team's short name in Traditional Chinese.
team_encharacterCurrent team's English name.
jerseycharacterShirt number as printed, a string ('0', '00' and '10' differ).
positioncharacterPosition letter: G guard, F forward, C centre.
nicknamecharacterNickname (綽號); null when blank.
tenurecharacterYears of service (年資) as the page prints it, with a prime character ('0‘').
height_cmnumericHeight in centimetres (身高).
weight_kgnumericWeight in kilograms (體重).
birthplace_zhcharacterBirthplace in Traditional Chinese (出生地; a country for foreign players). The date of birth is dropped on purpose.
status_zhcharacterPlayer status (身份): 洋將 = import (foreign player), 本土 = local (Taiwanese) player.
educationcharacterEducation lines (學歷) as printed, joined with '; '.

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_player(player_page_id='1JbPozLB')

Last validated n/a.

pleague_player_seasons​

One player's season totals and per-game averages, league and East Asia Super League, with a career row.

Endpoint URL: GET https://pleagueofficial.com/player/{player_page_id}

Valid URL: https://pleagueofficial.com/player/1JbPozLB

API ParameterPythonPatternRequiredNullableDescription
player_page_idplayer_page_idYRequired. The 8-character page id of /player/{id} (e.g. '1JbPozLB' = Lai Ting-En); player_page_id in pleague_stat_player, random_id in pleague_box_players from 2022-23 (unreliable before).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
player_page_idcharacterThe 8-character page id of /player/{id} (e.g. '1JbPozLB'). The box random_id on 2022-23+ rows; NOT the box player_id.
competitioncharacterTable block: plg (the league's tables) or easl (the East Asia Super League block, present only for players with games there).
tablecharactertotals (the 累計 table: season totals) or averages (the 平均 table: per game).
seasonintegerSeason END year of the slug; null on the career row.
season_slugcharacterSeason slug as printed ('2025-26'), or 'career' for the final totals / averages row.
gamesintegerGames played (出賽).
minutescharacterMinutes 'mm:ss' (a season total in the totals table, a per-game average in the averages table).
pointsnumericPoints (total in the totals table, per game in the averages table; 得分).
rebnumericRebounds (total / per game; 籃板).
astnumericAssists (total / per game; 助攻).
stlnumericSteals (total / per game; 抄截).
blknumericBlocks (total / per game; 阻攻).
tovnumericTurnovers (total / per game; 失誤).
pfnumericPersonal fouls (total / per game; 犯規).
fg2_madenumeric2-point makes: the first number of the page's '56 - 103' cell (total / per game).
fg2_attnumeric2-point attempts: the second number of the cell.
fg2_pctnumeric2-point percentage 0-100 ('54.4%' -> 54.4).
fg3_madenumeric3-point makes (total / per game).
fg3_attnumeric3-point attempts (total / per game).
fg3_pctnumeric3-point percentage 0-100.
ft_madenumericFree-throw makes (total / per game).
ft_attnumericFree-throw attempts (total / per game).
ft_pctnumericFree-throw percentage 0-100.

return_parsed=False — the raw record (dict): the page record (the refs capture shape), the box body as the site sends it, or the parsed play-by-play record, plus _request (kind and the season, stage, game or player asked for).

Example​

pleague_player_seasons(player_page_id='1JbPozLB')

Last validated n/a.