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’.
res = GET("https://api.helium.io/v1/stats")
print(res)Response [https://api.helium.io/v1/stats]
Date: 2022-08-04 01:25
Status: 200
Content-Type: application/json; charset=utf-8
Size: 922 B10.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.
data = fromJSON(rawToChar(res$content))
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.
token_supply = data$token_supply
print(token_supply)[1] 12467582110.5 Adding Parameters to Requests
Add ‘min_time’ and ‘max_time’ as parameters on a different endpoint and print the resulting ‘fee’ data.
res = GET("https://api.helium.io/v1/dc_burns/sum",
query = list(min_time = "2020-07-27T00:00:00Z"
, max_time = "2021-07-27T00:00:00Z"))
data = fromJSON(rawToChar(res$content))
fee = data$data$fee
print(fee)[1] 1011275500010.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.
res = GET("https://api.helium.io/v1/dc_burns/sum",
query = list(min_time = "2020-07-27T00:00:00Z"
, max_time = "2021-07-27T00:00:00Z"),
add_headers(`Accept`='application/json', `Connection`='keep-live'))
data = fromJSON(rawToChar(res$content))
fee = data$data$fee
print(fee)[1] 1011275500010.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/