Sleeper: Get Endpoint
Tan Ho
2024-05-29
Source:vignettes/sleeper_getendpoint.Rmd
sleeper_getendpoint.Rmd
Creating custom Sleeper API calls
The Sleeper API is pretty
extensive. If there is something you’d like to access that’s beyond
the current scope of ffscrapr, you can use the lower-level
“sleeper_getendpoint
” function to create a GET request and
access the data, while still using the authentication and rate-limiting
features I’ve already created.
Here is an example of how you can call one of the endpoints - in this case, let’s pull Sleeper’s trending players data!
We’ll start by opening up this page, https://docs.sleeper.com/#trending-players, which is the documentation page for this particular endpoint. From here, we can see that Sleeper’s documentation says the endpoint is:
https://api.sleeper.app/v1/players/<sport>/trending/<type>?lookback_hours=<hours>&limit=<int>
On first glance, you can see that it takes two parameters within the
endpoint call itself (sport
and type
) and we
can further adjust the query with HTTP parameters
lookback_hours
and limit
. The
sleeper_getendpoint function already has the
https://api.sleeper.app/v1/
part encoded, so all we’ll need
to do is pass in the remaining part of the URL as the endpoint, and pass
the HTTP parameters in as arguments to the function (these are case
sensitive!)
We can use the glue
package to parameterise this,
although you can also use base R’s paste function just as easily.
type <- "add"
query <- glue::glue('players/nfl/trending/{type}')
query
#> players/nfl/trending/add
response_trending <- sleeper_getendpoint(query,lookback_hours = 48, limit = 10)
#> Using request.R from "ffscrapr"
str(response_trending, max.level = 1)
#> List of 3
#> $ content :List of 10
#> $ query : chr "https://api.sleeper.app/v1/players/nfl/trending/add?lookback_hours=48&limit=10"
#> $ response:List of 9
#> ..- attr(*, "class")= chr "response"
#> - attr(*, "class")= chr "sleeper_api"
Along with the parsed content, the function also returns the query and the response that was sent by the server. These are helpful for debugging, but we can turn the content into a dataframe with some careful application of the tidyverse.
df_trending <- response_trending %>%
purrr::pluck("content") %>%
dplyr::bind_rows()
head(df_trending)
#> # A tibble: 6 × 2
#> player_id count
#> <chr> <int>
#> 1 6820 521768
#> 2 2161 374758
#> 3 7045 235794
#> 4 3164 205688
#> 5 GB 203645
#> 6 HOU 154698
This isn’t very helpful without knowing who these players are, so let’s pull the players endpoint in as well - this one has a convenient function!
players <- sleeper_players() %>%
select(player_id, player_name, pos, team, age)
trending <- df_trending %>%
left_join(players, by = "player_id")
trending
#> # A tibble: 10 × 6
#> player_id count player_name pos team age
#> <chr> <int> <chr> <chr> <chr> <dbl>
#> 1 6820 521768 Clyde Edwards-Helaire RB KC 25.1
#> 2 2161 374758 Jerick McKinnon RB KC 32.1
#> 3 7045 235794 Joshua Kelley RB LAC 26.5
#> 4 3164 205688 Ezekiel Elliott RB NE 28.9
#> 5 GB 203645 NA DEF GB NA
#> 6 HOU 154698 NA DEF HOU NA
#> 7 10235 140729 Roschon Johnson RB CHI 23.3
#> 8 9487 137447 Parker Washington WR JAX 22.2
#> 9 NO 132410 NA DEF NO NA
#> 10 4089 108768 Gerald Everett TE LAC 29.9
There - this means something to us now! As of this writing (2020-11-10), Kalen Ballage was the most added player. Haven’t we been bitten by this before?