This article demonstrates how you can use the Python client for Glassnode API for on-chain data analytics.
You will see how to call various Glassnode API endpoints to retrieve useful blockchain metrics, e.g., market insights, blockchain information, fees, supply, transaction insights, etc.
You will create Python scripts that fetch Glassnode API data using glassnode-api-python-client and the Python request method.
What Is Glassnode?
Glassnode is an on-chain data analytics platform founded by Rafael Schultze Kraft in 2007 to provide insights into complex crypto data. Glassnode ingests blockchain data and employs AI techniques to provide insights into the various networks.
How Do You Use Glassnode Data?
Glassnode insights can help you make crucial investment decisions. For example, Glassnode can help you identify cryptocurrencies with the highest trading volumes. You may want to invest in such cryptocurrencies instead of dormant currencies.
How do I Download Data from Glassnode?
Two main ways to download data from Glassnode:
- Glassnode Studio
- Glassnode REST API (which you will see in this tutorial)
Is Glassnode Free?
Glassnode offers four pricing plans:
- Standard: Free
- Advanced: $29
- Professional: $799
- Institutional: Tailored plan, price varies.
Glassnode API metrics are categorized into three tiers. Access to functionalities within a specific tier depends upon your subscription. You can only access tier 1 metrics with a standard (free) account.
Is Glassnode Reliable?
Glassnode doesn’t generate its data; it extracts information from mostly public blockchain data. Some users report that Glassnode insights are often not based on the latest data.
Why Should I Use Glassnode?
- Glassnode offers a free standard account.
- Glassnode Studio provides plenty of options to navigate intelligent on-chain data metrics.
- Glassnode Academy is an excellent resource learning resource for beginners.
Why Should I Not Use Glassnode?
- Some users complain that Glassnode insights are outdated
- Not very user-friendly for beginners. Though, you can get help from Glassnode Academy.
What Can You Do with the Glassnode API?
With Glassnode API, you can develop customized software applications that fetch intelligent data insights from Glassnode.
Glassnode API pricing
Glassnode doesn’t have a different pricing plan for its API. The access to Glassnode API depends upon your default Glassnode subscription plan.
Getting Started with Glassnode API in Python
Access to Glassnode API requires an API you can get by signing up with Glassnode.
Signing up for a Glassnode Account
Go to glassnode.com and click the “Sign Up” button at the top right corner of the page.
Fill out the signup form by entering your first name, last name, email, and password. Click the “Sign Up” button.
You will receive an email for account activation. Click the activation link in your email. Once your account is activated, you will see the following message.
Get your API key from Glassnode Studio
Go to the API settings page and click the “Generate Key” button to generate your Glassnode API Key.
You can view the API documentation by clicking the “View API Documentation” button.
Simple Example of Fetching Data from Glassnode API in Python
You can use the Glassnode API Python Client library or the Python request function to make calls to Glassnode API.
Glassnode API Python Client Library Example
The following command installs the glassnode-api-python-client library.
pip install glassnode
The first step is to Import the GlassnodeClient class from the glassnode module and pass your API key to the class constructor.
You can use the get() method from the GlassnodeClient class to make a Glassnode API call. You must pass the endpoint and API call names to the get() method. You also need to pass a Python dictionary containing the API call parameters.
For example, the script below makes the following API call.
https://api.glassnode.com/v1/metrics/addresses/active_count
Here, the endpoint name is highlighted in green, while the metric inside the endpoint is highlighted in yellow.
The call above returns the number of active bitcoin accounts on the blockchain, as we pass “BTC” as the symbol value to the parameter “a,” which corresponds to the asset symbol.
The response from the API call is a list of dictionaries. Each dictionary contains two items: t and v, where t corresponds to the period, and v corresponds to the active account values.
from glassnode import GlassnodeClient
import os
import pandas as pd
api_key = os.environ['GN-Key']
## behind the scene API call
## https://api.glassnode.com/v1/metrics/addresses/active_count
client = GlassnodeClient(api_key)
data = client.get("addresses", "active_count", {"a": "BTC"})
print(type(data))
print(data[0].keys())
Output:
<class 'list'>
dict_keys(['t', 'v'])
For a better view, you can convert the list of dictionaries into a Pandas dataframe using the following script.
## create a pandas dataframe using the list of dictionaries
df = pd.DataFrame.from_dict(data)
print(df.shape)
df.tail()
Output:
By default, the time values are in UNIX format. The following script can convert the time values to ISO date format.
import datetime
def convert_date(unix_date):
return datetime.datetime.fromtimestamp(int(unix_date)).strftime('%Y-%m-%d')
df["t"] = df["t"].apply(convert_date)
df.tail()
Output:
from glassnode import GlassnodeClient
import os
import pandas as pd
api_key = os.environ['GN-Key']
## behind the scene API call
## https://api.glassnode.com/v1/metrics/addresses/active_count
client = GlassnodeClient(api_key)
since = 1232668800 # 2009-01-23
until = 1233532800 # 2009-02-03
resolution = "24h"
params = {"a": "BTC", "s": since, "u": until, "i": resolution}
data = client.get("addresses", "active_count", params)
df = pd.DataFrame.from_dict(data)
df["t"] = df["t"].apply(convert_date)
print(df.shape)
df.tail(20)
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
# make API request
res = requests.get('https://api.glassnode.com/v1/metrics/addresses/active_count',
params={'a': 'BTC', 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
df.head()
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
since = 1232668800 # 2009-01-23
until = 1233532800 # 2009-02-03
resolution = "24h"
# make API request
res = requests.get('https://api.glassnode.com/v1/metrics/addresses/active_count',
params={"a": "BTC", "s": since, "u": until, "i": resolution, 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
df.tail(20
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
# make API request
res = requests.get('https://api.glassnode.com/v2/metrics/endpoints',
params={'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
df.head()
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
# make API request
res = requests.get('https://api.glassnode.com/v1/metrics/assets',
params={'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
df.head()
Output:
What are Glassnode API Endpoints?
Glassnode API offers 17 endpoints listed below:
- Addresses
- Blockchain
- DeFi
- Derivates
- Distribution
- Entities
- ETH 2.0
- Fees
- Indicators
- Institutions
- Lightening
- Market
- Mempool
- Mining
- Protocols
- Supply
- Transactions
Out of these endpoints, metrics from Lightning, DeFi, Derivates, Distribution, Entities, and Mempool endpoints are not available with the standard subscription.
The following sections will show you how to call the metrics available with the standard subscriptions. All of these metrics belong to the tier 1 metrics category.
Addresses Endpoint
The addresses API endpoint returns information related to the addresses involved in a blockchain transaction.
The following address metrics are available with the standard subscription.
Description | Path | |
Active Addresses | The number of unique addresses active in a successful transaction | https://api.glassnode.com/v1/metrics/addresses/active_count |
Sending Addresses | The number of unique sending addresses active in a successful transaction | https://api.glassnode.com/v1/metrics/addresses/sending_count |
Receiving Addresses | The number of unique receiving addresses active in a successful transaction | https://api.glassnode.com/v1/metrics/addresses/receiving_count |
New Addresses | The number of unique addresses appearing for the first time in a successful transaction | https://api.glassnode.com/v1/metrics/addresses/new_non_zero_count |
Total Addresses | The number of all unique addresses involved in a transaction of the native coin in a network | https://api.glassnode.com/v1/metrics/addresses/count |
Refer to the complete list of addressee metrics to know more about other metrics.
The following script demonstrates how to call the metrics mentioned above.
We iterate through the list of API calls using a for loop. In each iteration, we convert the response from the API call to a Pandas dataframe, which we append to a Python list. Finally, we concatenate the list of Pandas dataframe.
The dataframe columns in the output dataset correspond to metric names appearing in API calls.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/addresses/active_count", # Active Addresses
"https://api.glassnode.com/v1/metrics/addresses/sending_count", # Sending Addresses
"https://api.glassnode.com/v1/metrics/addresses/receiving_count", # Receiving Addresses
"https://api.glassnode.com/v1/metrics/addresses/new_non_zero_count", # New Addresses
"https://api.glassnode.com/v1/metrics/addresses/count" # Total Addresses
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# set Time as the index column
df.set_index("Time", inplace = True)
# adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
Metric | Description | Path |
Block Height | The sum of blocks created in the main blockchain | https://api.glassnode.com/v1/metrics/blockchain/block_height |
Blocks Mined | The total number of blocks created in the main blockchain in a specific period. | https://api.glassnode.com/v1/metrics/blockchain/block_count |
Block Interval (Mean) | The average time between mined blocks (in seconds) | https://api.glassnode.com/v1/metrics/blockchain/block_interval_mean |
Block Interval (Median) | The median time between mined blocks (in seconds) | https://api.glassnode.com/v1/metrics/blockchain/block_interval_median |
Block Size (Total) | The total size (in bytes) of all blocks mined in a specific period. | https://api.glassnode.com/v1/metrics/blockchain/block_size_sum |
Block Size (Mean) | The average size (in bytes) of all blocks mined in a specific period. | https://api.glassnode.com/v1/metrics/blockchain/block_size_mean |
UTXOs Created | The number of UTXOs created in a specific period | https://api.glassnode.com/v1/metrics/blockchain/utxo_created_count |
UTXOs Spent | The number of spent UTXOs | https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_count |
UTXOs (Total) | The total number of UTXOs in the network. | https://api.glassnode.com/v1/metrics/blockchain/utxo_count |
UTXO Value Created (Total) | The total amount of coins in a newly created UTXO | https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_sum |
UTXO Value Created (Mean) | The mean amount of coins in a newly created UTXO | https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_mean |
UTXO Value Created (Median) | The median of coins in a newly created UTXO | https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_median |
UTXO Value Spent (Total) | The total amount of coins in spent UTXOs | https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_sum |
UTXO Value Spent (Mean) | The mean amount of coins in spent UTXOs | https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_mean |
UTXO Value Spent (Median) | The median amount of coins in spent UTXOs | https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_median |
The following code shows an example of how you can call some of the standard metrics from the blockchain endpoint.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/blockchain/block_height", # Block Height
"https://api.glassnode.com/v1/metrics/blockchain/block_count", # Blocks Mined
"https://api.glassnode.com/v1/metrics/blockchain/block_interval_mean", # Block Interval (Mean)
"https://api.glassnode.com/v1/metrics/blockchain/block_interval_median", # Block Interval (Median)
"https://api.glassnode.com/v1/metrics/blockchain/block_size_sum", # Block Size (Total)
"https://api.glassnode.com/v1/metrics/blockchain/block_size_mean" # Block Size (Mean)
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# set Time as the index column
df.set_index("Time", inplace = True)
# adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/blockchain/utxo_created_count", # UTXOs Created
"https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_count", # UTXOs Spent
#"https://api.glassnode.com/v1/metrics/blockchain/utxo_count", # UTXOs (Total)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_sum", # UTXO Value Created (Total)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_mean", # UTXO Value Created (Mean)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_created_value_median", # UTXO Value Created (Median)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_sum", # UTXO Value Spent (Total)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_mean", # UTXO Value Spent (Mean)
"https://api.glassnode.com/v1/metrics/blockchain/utxo_spent_value_median", # UTXO Value Spent (Median)
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# set Time as the index column
df.set_index("Time", inplace = True)
# adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
You can find the list of all blockchain metrics at the official documentation link.
ETH 2.0 Endpoint
ETH 2.0 endpoint metrics return information about ETH 2.0, e.g., transactions and transfers involving ETH 2.0, total ETH 2.0 volume, etc.
The following table contains the ETH 2.0 endpoint metrics accessible from the standard account.
Metric | Description | Path |
ETH 2.0 New Deposits | The number of transactions depositing 32 ETH to ETH 2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_deposits_count |
ETH 2.0 New Value Staked | The total amount of ETH deposited to the ETH2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_volume_sum |
ETH 2.0 New Validators | The number of new unique addresses depositing ETH to the ETH2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_validators_count |
ETH 2.0 Total Number of Deposits | The total number of transactions in the ETH2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_total_deposits_count |
ETH 2.0 Total Value Staked | The total amount of ETH deposited to the ETH2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_total_volume_sum |
ETH 2.0 Total Number of Validators | The number of unique addresses depositing ETH to the ETH2 deposit contract | https://api.glassnode.com/v1/metrics/eth2/staking_total_validators_count |
ETH 2.0 Phase 0 Staking Goal | The ETH volume divided by 524,288. | https://api.glassnode.com/v1/metrics/eth2/staking_phase_0_goal_percent |
The code below shows how to access the ETH 2.0 endpoint in Python.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/eth2/staking_deposits_count",
"https://api.glassnode.com/v1/metrics/eth2/staking_volume_sum",
"https://api.glassnode.com/v1/metrics/eth2/staking_validators_count",
"https://api.glassnode.com/v1/metrics/eth2/staking_total_deposits_count",
"https://api.glassnode.com/v1/metrics/eth2/staking_total_volume_sum",
"https://api.glassnode.com/v1/metrics/eth2/staking_total_validators_count",
"https://api.glassnode.com/v1/metrics/eth2/staking_phase_0_goal_percent"
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "ETH", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# set Time as the index column
df.set_index("Time", inplace = True)
# adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
Check the official documentation to see the complete list of ETH 2.0 endpoint metrics.
Fees Endpoint
The fees API endpoint provides metrics that return the fee information for various cryptocurrency assets. The table below summarizes the fees metrics available with the standard account.
Metric | Description | Path |
Fees (Total) | The total fee paid to miners | https://api.glassnode.com/v1/metrics/fees/volume_sum |
Fees (Mean) | The average fee per transaction | https://api.glassnode.com/v1/metrics/fees/volume_mean |
Fees (Median) | The median fee per transaction | https://api.glassnode.com/v1/metrics/fees/volume_median |
Transaction Gas Limit (Mean) | The average gas limit per transaction | https://api.glassnode.com/v1/metrics/fees/gas_limit_tx_mean |
Transaction Gas Limit (Median) | The median gas limit per transaction | https://api.glassnode.com/v1/metrics/fees/gas_limit_tx_median |
Gas Price (Mean) | The average gas price per transaction | https://api.glassnode.com/v1/metrics/fees/gas_price_mean |
Gas Price (Median) | The median gas price per transaction | https://api.glassnode.com/v1/metrics/fees/gas_price_median |
Gas Used (Mean) | The average gas used per transaction | https://api.glassnode.com/v1/metrics/fees/gas_used_mean |
Gas Used (Median) | The median amount of gas used per transaction | https://api.glassnode.com/v1/metrics/fees/gas_used_median |
Gas Used (Total) | The total gas used per transaction | https://api.glassnode.com/v1/metrics/fees/gas_used_sum |
The following script demonstrates how to call some of the aforementioned fees metrics.
Note: I have commented some of the API calls since not all API calls return an equal number of rows which results in an error while concentrating pandas dataframes. You can make API calls individually to see the results.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/fees/volume_sum", # Fees (Total)
"https://api.glassnode.com/v1/metrics/fees/volume_mean",# Fees (Mean)
"https://api.glassnode.com/v1/metrics/fees/volume_median", # Fees (Median)
# "https://api.glassnode.com/v1/metrics/fees/gas_limit_tx_mean", # Transaction Gas Limit (Mean)
# "https://api.glassnode.com/v1/metrics/fees/gas_limit_tx_median", # Transaction Gas Limit (Median)
# "https://api.glassnode.com/v1/metrics/fees/gas_price_mean", # Gas Price (Mean)
# "https://api.glassnode.com/v1/metrics/fees/gas_price_median", # Gas Price (Median)
# "https://api.glassnode.com/v1/metrics/fees/gas_used_mean", # Gas Used (Mean)
# "https://api.glassnode.com/v1/metrics/fees/gas_used_median", # Gas Used (Median)
# "https://api.glassnode.com/v1/metrics/fees/gas_used_sum" # Gas Used (Total)
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# # set Time as the index column
# df.set_index("Time", inplace = True)
# # adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
Check out the official documentation to see the complete list of fees endpoint metrics.
Indicators Endpoint
The indicators endpoint metrics provide information about various blockchain indicators, e.g., the extent of bitcoin mining difficulty, spent output profit ratio, stock-to-flow ratio, etc.
The following indicators metrics are accessible with the standard account.
Metric | Description | Path |
Pi Cycle Top Indicator | Indicates 111-day moving average and 2x multiple of the 350-day moving average of Bitcoin’s price | https://api.glassnode.com/v1/metrics/indicators/pi_cycle_top |
Difficulty Ribbon | Indicates the extent of bitcoin mining difficulty. | https://api.glassnode.com/v1/metrics/indicators/difficulty_ribbon |
SOPR | Indicates the spent output profit ratio | https://api.glassnode.com/v1/metrics/indicators/sopr |
Stock-to-Flow Ratio | Indicates the stock-to-flow-ratio | https://api.glassnode.com/v1/metrics/indicators/stock_to_flow_ratio |
The following code shows how to call the indicators endpoint metrics in a Python script.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/indicators/pi_cycle_top", # Pi Cycle Top Indicator
# "https://api.glassnode.com/v1/metrics/indicators/difficulty_ribbon", # Difficulty Ribbon - value too big for pandas dataframe
"https://api.glassnode.com/v1/metrics/indicators/sopr", # SOPR
"https://api.glassnode.com/v1/metrics/indicators/stock_to_flow_ratio" # Stock-to-Flow Ratio
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# # set Time as the index column
# df.set_index("Time", inplace = True)
# # adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.head()
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/institutions/purpose_etf_flows_sum", # Purpose Bitcoin ETF Flows
"https://api.glassnode.com/v1/metrics/institutions/purpose_etf_holdings_sum" # Purpose Bitcoin ETF Holdings
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# # set Time as the index column
# df.set_index("Time", inplace = True)
# # adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
Check out the official documentation to see the complete list of institutions endpoint metrics.
Market Endpoint
Market endpoint contains metrics that return market information, e.g., the market cap, the opening, high, low, and closing values of an asset in USD, etc.
The following four market endpoints are available with the standard account.
Metric | Description | Path |
Market Cap | The product of the current USD price by the current supply of an asset | https://api.glassnode.com/v1/metrics/market/marketcap_usd |
Price | The closing price of an asset in USD | https://api.glassnode.com/v1/metrics/market/price_usd_close |
Price OHLC | Candlestick chart values for open, high, low, and close values of an asset in USD | https://api.glassnode.com/v1/metrics/market/price_usd_ohlc |
Price Drawdown from ATH | The percent decrease of an asset price from the previous all-time high | https://api.glassnode.com/v1/metrics/market/price_drawdown_relative |
The following example shows how to access the Glassnode Market endpoint in Python.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/market/marketcap_usd", # Market Cap
"https://api.glassnode.com/v1/metrics/market/price_usd_close", # Price
"https://api.glassnode.com/v1/metrics/market/price_usd_ohlc", # Price OHLC
"https://api.glassnode.com/v1/metrics/market/price_drawdown_relative" # Price Drawdown from ATH
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# # set Time as the index column
# df.set_index("Time", inplace = True)
# # adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
Refer to the official documentation to see the complete list of market endpoint metrics.
Mining Endpoint
This endpoint provides information on blockchain mining statistics, e.g., the number of hashes required to mine a block for an asset.
The following two metrics are accessible with the standard account.
Metric | Description | Path |
Difficulty | The estimated number of hashes required to mine a block for an asset | https://api.glassnode.com/v1/metrics/mining/difficulty_latest |
Hashrate | The estimated mean value for hashes produced by miners in the network | https://api.glassnode.com/v1/metrics/mining/hash_rate_mean |
The script below demonstrates how to call these two mining metrics in Python.
In this case, the output is not in the form of a Pandas dataframe because, sometimes, the values returned by Glassnode API metrics are too big to be stored in a Pandas dataframe.
Therefore, the output displays a plain text string you can parse to extract relevant information.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/mining/difficulty_latest" # Difficulty
#"https://api.glassnode.com/v1/metrics/mining/hash_rate_mean"] # Hashrate
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
results.append(res.text)
print(results[0][:225])
Output:
[{"t":1231459200,"v":4294967296},{"t":1231545600,"v":4294967296},{"t":1231632000,"v":4294967296},{"t":1231718400,"v":4294967296},{"t":1231804800,"v":4294967296},{"t":1231891200,"v":4294967296},{"t":1231977600,"v":4294967296},
Check out the official documentation to see the complete list of mining endpoint metrics.
Protocols Endpoint
The protocols endpoint provides metrics that fetch asset information from Uniswap cryptocurrency exchange. It has three metrics that you can access through a standard subscription.
Metric | Description | Path |
Uniswap Liquidity | The latest liquidity of an asset on Uniswap | https://api.glassnode.com/v1/metrics/protocols/uniswap_liquidity_latest |
Uniswap Transactions | The total number of assets involved in Uniswap contracts | https://api.glassnode.com/v1/metrics/protocols/uniswap_transaction_count |
Uniswap Volume | The total volume of an asset traded on Uniswap | https://api.glassnode.com/v1/metrics/protocols/uniswap_volume_sum |
The following code shows an example of how you can call the metrics from the protocol endpoint:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/protocols/uniswap_liquidity_latest", # Uniswap Liquidity
"https://api.glassnode.com/v1/metrics/protocols/uniswap_transaction_count", # Uniswap Transactions
"https://api.glassnode.com/v1/metrics/protocols/uniswap_volume_sum", # Uniswap Volume
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "ETH", 'api_key': api_key})
results.append(res.text)
print(results[0][:210])
Output:
[{"t":1588636800,"v":0.00490852351350741},{"t":1588723200,"v":0.0159213628437584},{"t":1588809600,"v":0.0159213628437726},{"t":1588896000,"v":0.0887127385961924},{"t":1588982400,"v":0.0887127385961924},{"t":158
You can find the list of all protocols endpoint metrics at the official documentation link.
Supply Endpoint
The supply endpoint metrics provide information on asset supply. You can only access one metric from this endpoint with the standard account.
Metric | Description | Path |
Supply Last Active 1+ Years Ago | The percentage value of immobile asset supply in at least a year | https://api.glassnode.com/v1/metrics/supply/active_more_1y_percent |
The following code shows how to call the Supply Last Active 1+ Years Ago metric from the supply endpoint.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/supply/active_more_1y_percent",
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# # set Time as the index column
# df.set_index("Time", inplace = True)
# # adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.ta
Output:
Metric | Description | Path |
Transaction Count | The total amount of successful transactions for an asset | https://api.glassnode.com/v1/metrics/transactions/count |
Transaction Rate | The number of successful transactions per second | https://api.glassnode.com/v1/metrics/transactions/rate |
Transaction Size (Total) | The total size of all transactions within a specific period | https://api.glassnode.com/v1/metrics/transactions/size_sum |
Transaction Size (Mean) | The average size of all transactions within a specific period | https://api.glassnode.com/v1/metrics/transactions/size_mean |
Transfer Volume (Total) | The total amount of coins transferred in successful transfers | https://api.glassnode.com/v1/metrics/transactions/transfers_volume_sum |
Transfer Volume (Mean) | The average amount of coins transferred in successful transfers | https://api.glassnode.com/v1/metrics/transactions/transfers_volume_mean |
Transfer Volume (Median) | The median amount of coins transferred in successful transfers | https://api.glassnode.com/v1/metrics/transactions/transfers_volume_median |
Check the official documentation to see the complete list of transactions metrics.
The script below demonstrates how to call the above API metric and store the response in a Pandas dataframe.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/transactions/count", # Transaction Count
"https://api.glassnode.com/v1/metrics/transactions/rate", # Transaction Rate
"https://api.glassnode.com/v1/metrics/transactions/size_sum", # Transaction Size (Total)
"https://api.glassnode.com/v1/metrics/transactions/size_mean", # Transaction Size (Mean)
"https://api.glassnode.com/v1/metrics/transactions/transfers_volume_sum", # Transfer Volumne (Total)
"https://api.glassnode.com/v1/metrics/transactions/transfers_volume_mean", # Transfer Volume (Mean)
"https://api.glassnode.com/v1/metrics/transactions/transfers_volume_median" # Transfer Volume (Median)
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
# rename dataframe column names
df.columns = ["Time", endpoint_name]
# set Time as the index column
df.set_index("Time", inplace = True)
# adding the result to a list of pandas dataframe
results.append(df)
# concatenating all dataframes horizontally
results_df = pd.concat(results, axis=1)
results_df.tail()
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = ["https://api.glassnode.com/v1/metrics/transactions/transfers_count", # Transfer Count
"https://api.glassnode.com/v1/metrics/transactions/transfers_rate" # Transfer Rate
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "ETH", 'api_key': api_key})
results.append(res.text)
print(results[1][:200])
Output:
[{"t":1438905600,"v":0.022928240740740742},{"t":1438992000,"v":0.017974537037037035},{"t":1439078400,"v":0.014398148148148148},{"t":1439164800,"v":0.01765046296296296},{"t":1439251200,"v":0.0380324074
Common Errors and Issues Accessing Glassnode API
Depending on the metric tier and the way you want to store information from the Glassnode API, you may face some issues.
In some instances, the values returned by the Glassnode APIs are too big to be stored in Pandas dataframes. In such cases, you should consider other data structures for storing the response.
For instance, the following script returns a “Value is too Big” error.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = [#"https://api.glassnode.com/v1/metrics/mining/difficulty_latest"
"https://api.glassnode.com/v1/metrics/mining/hash_rate_mean"
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
df = pd.read_json(res.text, convert_dates=['t'])
results.append(res.text)
Output:
Another common issue you will likely face is the inability to access some metrics. For instance, the following script returns an error while accessing the difficulty metric from the mining endpoint, although the metric falls in the category of tier 1 metrics.
#"https://api.glassnode.com/v1/metrics/blockchain/utxo_count", # UTXOs (Total)
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
api_calls = [#"https://api.glassnode.com/v1/metrics/mining/difficulty_latest"
"https://api.glassnode.com/v1/metrics/blockchain/utxo_count"
]
results = []
for call in api_calls:
endpoint_name = call.split("/")[-1]
# make API request
res = requests.get(call,
params={"a": "BTC", 'api_key': api_key})
df = pd.read_json(res.text, convert_dates=['t'])
results.append(res.text)
Output:
The error in the above output is not clear. In such cases, you may want to make an API call via the glassnode-api-python-client library, as shown in the script below:
from glassnode import GlassnodeClient
import os
import pandas as pd
api_key = os.environ['GN-Key']
## behind the scene API call
## https://api.glassnode.com/v1/metrics/addresses/active_count
client = GlassnodeClient(api_key)
data = client.get("blockchain", "utxo_count", {"a": "BTC"})
print(type(data))
print(data[0].keys())
Output:
As you can see, the error returned, in this case, is more readable as it says that the asset (‘BTC’) is forbidden for this endpoint.
How do I Extract Glassnode Data to Excel?
To extract Glassnode data to an Excel file, you can store the response from the Glassnode API in a Pandas dataframe; you can then use the to_excel() function from the Pandas dataframe to write the data into an excel file.
The following script demonstrates how to extract Glassnode data to Excel.
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
since = 1232668800 # 2009-01-23
until = 1233532800 # 2009-02-03
resolution = "24h"
# make API request
res = requests.get('https://api.glassnode.com/v1/metrics/addresses/active_count',
params={"a": "BTC", "s": since, "u": until, "i": resolution, 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
df.to_excel("D:\Datasets\glassnode_output.xlsx",
sheet_name='Sheet_name_1')
Output:
import json
import requests
import os
import pandas as pd
api_key = os.environ['GN-Key']
since = 1232668800 # 2009-01-23
until = 1233532800 # 2009-02-03
resolution = "24h"
# make API request
res = requests.get('https://api.glassnode.com/v1/metrics/addresses/active_count',
params={"a": "BTC", "s": since, "u": until, "i": resolution, 'api_key': api_key})
# convert to pandas dataframe
df = pd.read_json(res.text, convert_dates=['t'])
The next step is to connect to Google spreadsheets from your Python application. To do so, you need a JSON file containing an API key that lets you connect to your Google spreadsheet account.
You can use the gspread library to connect to Google spreadsheets from your Python application. The process is explained on the official documentation page of gspread library.
Download the API Key, and authenticate your credentials using the following script:
# pip install gspread
import gspread
#pip install df2gspread
from df2gspread import df2gspread
from oauth2client import service_account
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = service_account.ServiceAccountCredentials.from_json_keyfile_name(
'D:\Datasets\my-project-1470409419661-70e344e255e3.json', scope)
gc = gspread.authorize(credentials)
Finally, you can use the upload() function from the df2gspread module to pull the data from the Pandas dataframe into Google sheets, as shown in the following script.
spreadsheet_key = os.environ['GSS-Key']
sheet_name = 'Sheet1'
df2gspread.upload(df, spreadsheet_key, sheet_name, credentials=credentials, row_names=True)
Glassnode Alternatives
Following are some of the other platforms providing on-chain data analytics services:
Glassnode vs. CryptoQuant
Glassnode | CryptoQuant | |
Membership Fees | Standard: FreeAdvanced: $29Professional: $799Institutional: Tailored as per requirement | Standard: FreeAdvanced: $29Professional $99Premium: $799 |
Monthly Visits (August 2022) | 640.4K | 605.4 K |
Features | Glassnode studioGlassnode AcademyGlass node Insights and ReportingAbility to view multiple charts | Ability to set alertsAbility to view multiple chartsLarge user community and social media presence |
Beginner Friendliness | Not very beginner friendly due to the complex interface | Beginner-friendly |
There is little to choose between Glassnode and CryptoQuant as both platforms have similar pricing and offer comparable features. However, CryptoQuant might be a good starting point for beginners.
Conclusion
Glassnode is an intelligent data analytics platform that provides insights into blockchain data. In addition to a sophisticated GUI dashboard in Glassnode studio, Glass node offers programmatically accessible REST API endpoints.
This tutorial teaches how to fetch data from Glassnode API in a Python application. You saw how to use the Python request method and the glassnode-api-python-client library to call the Glassnode API. The information in this tutorial can help you develop blockchain data analytics software.