==================
chaindl
==================
**Download crypto on-chain data with a single line of code.**
.. image:: https://github.com/dhruvan2006/chaindl/actions/workflows/release.yml/badge.svg
:target: https://github.com/dhruvan2006/chaindl/actions/workflows/release.yml
.. image:: https://github.com/dhruvan2006/chaindl/actions/workflows/tests.yml/badge.svg
:target: https://github.com/dhruvan2006/chaindl/actions/workflows/tests.yml
.. image:: https://img.shields.io/pypi/v/chaindl
:target: https://pypi.org/project/chaindl/
.. image:: https://static.pepy.tech/badge/ocfinance
:target: https://pypi.org/project/chaindl/
.. image:: https://img.shields.io/github/license/dhruvan2006/chaindl
:target: https://github.com/dhruvan2006/chaindl
`chaindl` is a lightweight Python library that lets you fetch historical and live on-chain crypto data
from multiple public sources in one step. Whether you want to analyze metrics from Bitcoin, Ethereum,
or other chains, `chaindl` handles the heavy lifting so you can focus on insights.
It supports:
- `CheckOnChain `__
- `ChainExposed `__
- `Woocharts `__
- `Bitbo Charts `__
- `Blockchain.com `__
- `Glassnode `__
- `The Block `__
- `Dune `__
- `Bitcoin Magazine Pro `__
---
Installation
============
Install using pip:
.. code-block:: bash
pip install chaindl
You will need Python 3 to use this package.
---
Usage
=====
To use `chaindl`, all you need is the direct URL of a metric or chart from a supported site.
.. code-block:: python
import chaindl
df = chaindl.download(
"https://charts.checkonchain.com/btconchain/unrealised/mvrv_all_zscore/mvrv_all_zscore_light.html",
)
This function returns a `pandas.DataFrame` with time series data.
Example output:
.. code-block:: text
1.5sd 1.0sd -0.5sd ... Price 1.0sd Price -0.5sd Price -1.0sd
Date ...
2010-07-18 NaN NaN NaN ... NaN NaN NaN
2010-07-19 NaN NaN NaN ... NaN NaN NaN
2010-07-20 NaN NaN NaN ... NaN NaN NaN
2010-07-21 NaN NaN NaN ... NaN NaN NaN
2010-07-22 NaN NaN NaN ... NaN NaN NaN
... ... ... ... ... ... ... ...
2025-08-16 0.0 0.0 0.0 ... 127515.763276 71066.069382 58482.837504
2025-08-17 0.0 0.0 0.0 ... 127558.310518 71091.341230 58504.062488
2025-08-18 0.0 0.0 0.0 ... 127616.938695 71125.767557 58532.873812
2025-08-19 0.0 0.0 0.0 ... 127713.177446 71181.632875 58579.459251
2025-08-20 0.0 0.0 0.0 ... 127717.341892 71186.181907 58583.814095
---
Supported Sources
=================
chaindl supports URLs from the following public sources:
CheckOnChain (`charts.checkonchain.com `__)
----------------------------------------------------------------------------
Example:
.. code-block:: python
url = "https://charts.checkonchain.com/btconchain/unrealised/mvrv_all_zscore/mvrv_all_zscore_light.html"
df = chaindl.download(url)
ChainExposed (`chainexposed.com `__)
---------------------------------------------------------------
Example:
.. code-block:: python
url = "https://chainexposed.com/NUPL.html"
df = chaindl.download(url)
WooCharts (`woocharts.com `__)
------------------------------------------------------
Example:
.. code-block:: python
url = "https://woocharts.com/bitcoin-price-models/"
df = chaindl.download(url)
Bitbo Charts (`charts.bitbo.io `__)
-------------------------------------------------------------------
Example:
.. code-block:: python
url = "https://charts.bitbo.io/long-term-power-law/"
df = chaindl.download(url)
Blockchain.com (`blockchain.com `__)
---------------------------------------------------------------------------------
Example:
.. code-block:: python
url = "https://www.blockchain.com/explorer/charts/market-price"
df = chaindl.download(url)
---
Glassnode (`studio.glassnode.com `__)
---------------------------------------------------------------------------
Only basic (T1) metrics are supported. You can find a list of the basic metrics
on their `website `__.
Example:
.. code-block:: python
url = "https://studio.glassnode.com/charts/addresses.ActiveCount?a=BTC"
df = chaindl.download(url)
The Block (`theblock.co/data `__)
---------------------------------------------------------------------------
Click 'Share' and 'Copy Link' to get the URL of the respective metric.
Example:
.. code-block:: python
url = "https://www.theblock.co/data/crypto-markets/spot/total-exchange-volume-daily"
df = chaindl.download(url)
Dune (`dune.com `__)
---------------------------------------
When on a Dune dashboard, you need to open the specific indicator/chart to access the queries page that shows the SQL and results. The URL should be in the format `https://dune.com/queries/{query_id}/{result_id}`.
.. image:: ../assets/dune.png
Example:
.. code-block:: python
url = "https://dune.com/queries/5583538/9204329"
df = chaindl.download(url)
Bitcoin Magazine Pro (`bitcoinmagazinepro.com `__)
--------------------------------------------------------------------------------------
Example:
.. code-block:: python
url = "https://www.bitcoinmagazinepro.com/charts/puell-multiple/"
df = chaindl.download(url)
Optional Arguments
==================
You can filter the data by date using:
- `start` (str): Starting date, format `"YYYY-MM-DD"`
- `end` (str): Ending date, format `"YYYY-MM-DD"`
If no dates are provided, the full available history is returned.
---
Error Handling
==============
If the URL is invalid or from an unsupported domain, an exception will be raised:
.. code-block:: python
chaindl.download("https://unsupported-domain.com")
# Raises ValueError: Unsupported source
---
Contributing
============
We welcome contributions! To add support for a new data source:
1. Create a new scraper module in `chaindl/sources/`
2. Add a URL pattern matcher in `chaindl/download.py`
3. Add tests and add documentation
4. Submit a pull request
---
License
=======
chaindl is released under the MIT License.