install.packages(c('httr', 'jsonlite'))
10 Working with APIs
API stands for Application Programming Interface. These sorts of tools are commonly used to programmatically pull data from a third party resource. This chapter demonstrates how one can begin to leverage these tools in their own workflows.
The following example uses the Helium API to return data about its blockchain network.
10.1 Install Packages
10.2 Load packages from the library
library('httr')
library('jsonlite')
10.3 Make Request
Pass a URL into the ‘GET’ function and store the response in a variable called ‘res’.
= GET("https://api.helium.io/v1/stats")
res print(res)
[https://api.helium.io/v1/stats]
Response
Date: 2022-08-04 01:25
Status: 200
Content-Type: application/json; charset=utf-8 Size: 922 B
10.4 Parse & Explore Data
Use the ‘fromJSON’ function from the ‘jsonlite’ package to parse the response data and then print out the names in the resulting data set.
= fromJSON(rawToChar(res$content))
data
names(data)
[1] "data"
Go one level deeper into the data set and print out the names again.
= data$data
data
names(data)
[1] "token_supply" "election_times" "counts" "challenge_counts" "block_times"
Alternatively, you can loop through the names as follows.
for (name in names(data)){print(name)}
[1] "token_supply"
[1] "election_times"
[1] "counts"
[1] "challenge_counts"
[1] "block_times"
Get the ‘token_supply’ field from the data.
= data$token_supply
token_supply
print(token_supply)
[1] 124675821
10.5 Adding Parameters to Requests
Add ‘min_time’ and ‘max_time’ as parameters on a different endpoint and print the resulting ‘fee’ data.
= GET("https://api.helium.io/v1/dc_burns/sum",
res query = list(min_time = "2020-07-27T00:00:00Z"
max_time = "2021-07-27T00:00:00Z"))
,
= fromJSON(rawToChar(res$content))
data = data$data$fee
fee print(fee)
[1] 10112755000
10.6 Adding Headers to Requests
Execute the same query as above except this time specify headers. This will likely be necessary when working with an API that requires an API Key.
= GET("https://api.helium.io/v1/dc_burns/sum",
res query = list(min_time = "2020-07-27T00:00:00Z"
max_time = "2021-07-27T00:00:00Z"),
, add_headers(`Accept`='application/json', `Connection`='keep-live'))
= fromJSON(rawToChar(res$content))
data = data$data$fee
fee print(fee)
[1] 10112755000
10.7 Resources
- Blog post by Trevor French: https://medium.com/trevor-french/api-calls-in-r-136290ead81d
10.7.1 Helpful APIs
- Meta Graph API: https://developers.facebook.com/docs/graph-api/
- Twitter API: https://developer.twitter.com/en/docs/twitter-api
- NASA APIs: https://api.nasa.gov/
- Etherscan API: https://etherscan.io/apis
- Covalent API: https://www.covalenthq.com/docs/api/#/0/0/USD/1
- EDGAR APIs from the SEC: https://www.sec.gov/edgar/sec-api-documentation
- Weather API: https://openweathermap.org/api
- Helium API: https://docs.helium.com/api/