There are four main ways of accessing historical market data:
HTTP API - provides historical market data in exchange' native format in minute by minute slices, can be used from any programming language that support HTTP(S) protocol.
Locally runnable tardis-machine server with built-in local data caching, market data normalization support, custom order book snapshots capabilities and real-time market data streaming support that connects directly to exchanges' WebSocket APIs. It allows efficiently requesting market data for whole time periods in contrast to HTTP API that provides data in minute by minute slices. Provides both streaming HTTP and WebSocket endpoints that can be consumed from any programming language supporting those protocols. It's available via NPM or as a Docker Image.
Node.js tardis-dev library providing fast and convenient access to tick-level historical and real-time cryptocurrency market data both in exchange native and normalized formats as well as transparent historical local data caching (cached data is stored on disk in compressed GZIP format and decompressed on demand when reading the data)
Python tardis-client providing fast and convenient access to tick-level historical market data in exchange native format as well as transparent historical local data caching (requires Python 3.7.0+)
If you'd like to know more about historical data, how it's being collected, it's format, availability dates and more, please see historical data details.