---
title: Quickstart
description: From zero to streaming cross-exchange data in 5 minutes.
---

# Quickstart

## Your first call

Every data query goes through `GET /v1/points`. Authenticate with your API key in the
`X-Kiyotaka-Key` header. Here's BTC candles from Binance Futures:

<CodeTabs>

<CodePanel lang="curl">
<pre><span class="s-f">curl</span> <span class="s-s">"https://api.kiyotaka.ai/v1/points</span>
    <span class="s-p">?type</span>=<span class="s-s">TRADE_SIDE_AGNOSTIC_AGG</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&amp;rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&amp;interval</span>=<span class="s-s">HOUR</span>
    <span class="s-p">&amp;from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&amp;period</span>=<span class="s-n">3600</span><span class="s-s">"</span> \
  <span class="s-k">-H</span> <span class="s-s">"X-Kiyotaka-Key: YOUR_API_KEY"</span></pre>
</CodePanel>

<CodePanel lang="python">
<pre><span class="s-k">import</span> <span class="s-v">requests</span>
&#10;
<span class="s-v">response</span> = requests.<span class="s-f">get</span>(
    <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TRADE_SIDE_AGNOSTIC_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=HOUR&amp;from=1774800000&amp;period=3600"</span>,
    headers={<span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span>}
)
<span class="s-v">data</span> = response.<span class="s-f">json</span>()</pre>
</CodePanel>

<CodePanel lang="javascript">
<pre><span class="s-k">const</span> <span class="s-v">response</span> = <span class="s-k">await</span> <span class="s-f">fetch</span>(
  <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TRADE_SIDE_AGNOSTIC_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=HOUR&amp;from=1774800000&amp;period=3600"</span>,
  { headers: { <span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
)
<span class="s-k">const</span> <span class="s-v">data</span> = <span class="s-k">await</span> response.<span class="s-f">json</span>()</pre>
</CodePanel>

</CodeTabs>

Same endpoint, same shape, for every data type. Change `type` and you get funding rates,
liquidations, orderbook heatmaps, or volume profiles instead of candles.

## Cross-exchange volume aggregation

This is where it gets interesting. Sum BTC volume across Binance, Bybit, and OKX in a single call --
USD-normalized so values are comparable:

<CodeTabs>

<CodePanel lang="curl">
<pre><span class="s-f">curl</span> <span class="s-s">"https://api.kiyotaka.ai/v1/points</span>
    <span class="s-p">?type</span>=<span class="s-s">TRADE_SIDE_AGNOSTIC_AGG</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">BYBIT</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">OKEX_SWAP</span>
    <span class="s-p">&amp;coin</span>=<span class="s-s">BTC</span>
    <span class="s-p">&amp;interval</span>=<span class="s-s">HOUR</span>
    <span class="s-p">&amp;from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&amp;period</span>=<span class="s-n">86400</span>
    <span class="s-p">&amp;transform.groupBy.type</span>=<span class="s-s">GROUP_BY_TYPE_SUM</span>
    <span class="s-p">&amp;transform.normalize.quote</span>=<span class="s-s">USD</span><span class="s-s">"</span> \
  <span class="s-k">-H</span> <span class="s-s">"X-Kiyotaka-Key: YOUR_API_KEY"</span></pre>
</CodePanel>

<CodePanel lang="python">
<pre><span class="s-k">import</span> <span class="s-v">requests</span>
&#10;
<span class="s-v">response</span> = requests.<span class="s-f">get</span>(
    <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TRADE_SIDE_AGNOSTIC_AGG&amp;exchange=BINANCE_FUTURES&amp;exchange=BYBIT&amp;exchange=OKEX_SWAP&amp;coin=BTC&amp;interval=HOUR&amp;from=1774800000&amp;period=86400&amp;transform.groupBy.type=GROUP_BY_TYPE_SUM&amp;transform.normalize.quote=USD"</span>,
    headers={<span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span>}
)
<span class="s-v">data</span> = response.<span class="s-f">json</span>()</pre>
</CodePanel>

<CodePanel lang="javascript">
<pre><span class="s-k">const</span> <span class="s-v">response</span> = <span class="s-k">await</span> <span class="s-f">fetch</span>(
  <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TRADE_SIDE_AGNOSTIC_AGG&amp;exchange=BINANCE_FUTURES&amp;exchange=BYBIT&amp;exchange=OKEX_SWAP&amp;coin=BTC&amp;interval=HOUR&amp;from=1774800000&amp;period=86400&amp;transform.groupBy.type=GROUP_BY_TYPE_SUM&amp;transform.normalize.quote=USD"</span>,
  { headers: { <span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
)
<span class="s-k">const</span> <span class="s-v">data</span> = <span class="s-k">await</span> response.<span class="s-f">json</span>()</pre>
</CodePanel>

</CodeTabs>

One response, one schema. No stitching together 3 different exchange APIs with 3 different symbol formats.

## Orderbook heatmap

Pull a 4K-resolution orderbook heatmap -- 1,000 price levels of bid/ask depth, updated every minute:

<CodeTabs>

<CodePanel lang="curl">
<pre><span class="s-f">curl</span> <span class="s-s">"https://api.kiyotaka.ai/v1/points</span>
    <span class="s-p">?type</span>=<span class="s-s">BLOCK_BOOK_SNAPSHOT_AGG</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&amp;rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&amp;interval</span>=<span class="s-s">MINUTE</span>
    <span class="s-p">&amp;period</span>=<span class="s-n">1140</span>
    <span class="s-p">&amp;blockSize</span>=<span class="s-n">5</span>
    <span class="s-p">&amp;maxDepth</span>=<span class="s-n">1000</span>
    <span class="s-p">&amp;sortDirection</span>=<span class="s-s">SORT_DIRECTION_DESC</span><span class="s-s">"</span> \
  <span class="s-k">-H</span> <span class="s-s">"X-Kiyotaka-Key: YOUR_API_KEY"</span></pre>
</CodePanel>

<CodePanel lang="python">
<pre><span class="s-k">import</span> <span class="s-v">requests</span>
&#10;
<span class="s-v">response</span> = requests.<span class="s-f">get</span>(
    <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=BLOCK_BOOK_SNAPSHOT_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=MINUTE&amp;period=1140&amp;blockSize=5&amp;maxDepth=1000&amp;sortDirection=SORT_DIRECTION_DESC"</span>,
    headers={<span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span>}
)
<span class="s-v">data</span> = response.<span class="s-f">json</span>()</pre>
</CodePanel>

<CodePanel lang="javascript">
<pre><span class="s-k">const</span> <span class="s-v">response</span> = <span class="s-k">await</span> <span class="s-f">fetch</span>(
  <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=BLOCK_BOOK_SNAPSHOT_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=MINUTE&amp;period=1140&amp;blockSize=5&amp;maxDepth=1000&amp;sortDirection=SORT_DIRECTION_DESC"</span>,
  { headers: { <span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
)
<span class="s-k">const</span> <span class="s-v">data</span> = <span class="s-k">await</span> response.<span class="s-f">json</span>()</pre>
</CodePanel>

</CodeTabs>

Each snapshot returns alternating `[price, volume]` pairs for bids and asks. Feed it directly
into a heatmap renderer.

## Real-time trade stream

Open a WebSocket and stream every BTC trade on Binance Futures as it happens:

<CodeBlock lang="WebSocket">
<pre><span class="s-c">// 1. Connect</span>
<span class="s-s">wss://ap-sin3.ws.api.kiyotaka.ai/nonbook/ws?encoding=json</span>
&#10;
<span class="s-c">// 2. Authenticate</span>
{ <span class="s-p">"method"</span>: <span class="s-s">"public/authenticate"</span>, <span class="s-p">"params"</span>: { <span class="s-p">"token"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
&#10;
<span class="s-c">// 3. Subscribe</span>
{
  <span class="s-p">"jsonrpc"</span>: <span class="s-s">"2.0"</span>, <span class="s-p">"id"</span>: <span class="s-n">0</span>,
  <span class="s-p">"method"</span>: <span class="s-s">"public/subscribe"</span>,
  <span class="s-p">"params"</span>: {
    <span class="s-p">"channels"</span>: [{
      <span class="s-p">"type"</span>: <span class="s-s">"TRADE"</span>,
      <span class="s-p">"exchange"</span>: <span class="s-s">"BINANCE_FUTURES"</span>,
      <span class="s-p">"symbol"</span>: <span class="s-s">"BTCUSDT"</span>,
      <span class="s-p">"category"</span>: <span class="s-s">"*"</span>
    }],
    <span class="s-p">"compression"</span>: <span class="s-s">"brotli"</span>,
    <span class="s-p">"version"</span>: <span class="s-s">"v2"</span>
  }
}
&#10;
<span class="s-c">// 4. Receive</span>
{
  <span class="s-p">"points"</span>: [{
    <span class="s-p">"series"</span>: { <span class="s-p">"type"</span>: <span class="s-s">"TRADE"</span>, <span class="s-p">"side"</span>: <span class="s-s">"BUY"</span>, <span class="s-p">"coin"</span>: <span class="s-s">"BTC"</span>, <span class="s-o">...</span> },
    <span class="s-p">"trade"</span>: { <span class="s-p">"price"</span>: <span class="s-n">90003</span>, <span class="s-p">"amount"</span>: <span class="s-n">0.002</span>, <span class="s-o">...</span> }
  }]
}</pre>
</CodeBlock>

## Liquidation heatmap

See where liquidations are clustered by price level -- useful for identifying stop-hunt zones and
liquidation cascades:

<CodeTabs>

<CodePanel lang="curl">
<pre><span class="s-f">curl</span> <span class="s-s">"https://api.kiyotaka.ai/v1/points</span>
    <span class="s-p">?type</span>=<span class="s-s">HYPERLIQUID_LIQUIDATION_AGG</span>
    <span class="s-p">&amp;coin</span>=<span class="s-s">BTC</span>
    <span class="s-p">&amp;interval</span>=<span class="s-s">HOUR</span>
    <span class="s-p">&amp;from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&amp;period</span>=<span class="s-n">3600</span>
    <span class="s-p">&amp;transform.normalize.quote</span>=<span class="s-s">USD</span><span class="s-s">"</span> \
  <span class="s-k">-H</span> <span class="s-s">"X-Kiyotaka-Key: YOUR_API_KEY"</span></pre>
</CodePanel>

<CodePanel lang="python">
<pre><span class="s-k">import</span> <span class="s-v">requests</span>
&#10;
<span class="s-v">response</span> = requests.<span class="s-f">get</span>(
    <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=HYPERLIQUID_LIQUIDATION_AGG&amp;coin=BTC&amp;interval=HOUR&amp;from=1774800000&amp;period=3600&amp;transform.normalize.quote=USD"</span>,
    headers={<span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span>}
)
<span class="s-v">data</span> = response.<span class="s-f">json</span>()</pre>
</CodePanel>

<CodePanel lang="javascript">
<pre><span class="s-k">const</span> <span class="s-v">response</span> = <span class="s-k">await</span> <span class="s-f">fetch</span>(
  <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=HYPERLIQUID_LIQUIDATION_AGG&amp;coin=BTC&amp;interval=HOUR&amp;from=1774800000&amp;period=3600&amp;transform.normalize.quote=USD"</span>,
  { headers: { <span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
)
<span class="s-k">const</span> <span class="s-v">data</span> = <span class="s-k">await</span> response.<span class="s-f">json</span>()</pre>
</CodePanel>

</CodeTabs>

Returns alternating `[price, liquidationVolume]` pairs showing exactly where positions are
getting blown up.

## Market Profile (TPO)

A Kiyotaka exclusive -- no other crypto API offers Time Price Opportunity data. Get a full day's Market
Profile with Point of Control and Value Area:

<CodeTabs>

<CodePanel lang="curl">
<pre><span class="s-f">curl</span> <span class="s-s">"https://api.kiyotaka.ai/v1/points</span>
    <span class="s-p">?type</span>=<span class="s-s">TPO_AGG</span>
    <span class="s-p">&amp;exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&amp;rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&amp;interval</span>=<span class="s-s">DAY</span>
    <span class="s-p">&amp;from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&amp;period</span>=<span class="s-n">86400</span>
    <span class="s-p">&amp;tpoSession</span>=<span class="s-s">TPO_SESSION_DAILY</span>
    <span class="s-p">&amp;tpoBlockSizeMinutes</span>=<span class="s-n">30</span><span class="s-s">"</span> \
  <span class="s-k">-H</span> <span class="s-s">"X-Kiyotaka-Key: YOUR_API_KEY"</span></pre>
</CodePanel>

<CodePanel lang="python">
<pre><span class="s-k">import</span> <span class="s-v">requests</span>
&#10;
<span class="s-v">response</span> = requests.<span class="s-f">get</span>(
    <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TPO_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=DAY&amp;from=1774800000&amp;period=86400&amp;tpoSession=TPO_SESSION_DAILY&amp;tpoBlockSizeMinutes=30"</span>,
    headers={<span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span>}
)
<span class="s-v">data</span> = response.<span class="s-f">json</span>()</pre>
</CodePanel>

<CodePanel lang="javascript">
<pre><span class="s-k">const</span> <span class="s-v">response</span> = <span class="s-k">await</span> <span class="s-f">fetch</span>(
  <span class="s-s">"https://api.kiyotaka.ai/v1/points?type=TPO_AGG&amp;exchange=BINANCE_FUTURES&amp;rawSymbol=BTCUSDT&amp;interval=DAY&amp;from=1774800000&amp;period=86400&amp;tpoSession=TPO_SESSION_DAILY&amp;tpoBlockSizeMinutes=30"</span>,
  { headers: { <span class="s-s">"X-Kiyotaka-Key"</span>: <span class="s-s">"YOUR_API_KEY"</span> } }
)
<span class="s-k">const</span> <span class="s-v">data</span> = <span class="s-k">await</span> response.<span class="s-f">json</span>()</pre>
</CodePanel>

</CodeTabs>

Each price level comes with time block IDs and buy/sell volume -- everything you need to render a classic
Market Profile chart.

## The pattern

Every example above uses the same endpoint (`/v1/points`), the same auth header, and the same
response shape. The only thing that changes is the `type` parameter. That's the whole idea -- one
API for everything.

| Change `type` to... | And you get |
| --- | --- |
| `TRADE_SIDE_AGNOSTIC_AGG` | OHLCV candles |
| `OPEN_INTEREST_AGG` | Open interest across exchanges |
| `FUNDING_RATE_AGG` | Funding rates with predicted values |
| `LIQUIDATION_AGG` | Liquidation volume by side |
| `VOLUME_PROFILE_AGG` | Volume at each price level |
| `TPO_AGG` | Market Profile / Time Price Opportunity |
| `BLOCK_BOOK_SNAPSHOT_AGG` | 4K orderbook depth heatmap |
| `HYPERLIQUID_LIQUIDATION_AGG` | Liquidation heatmap by price |