---
title: TPO / Market Profile
description: Time Price Opportunity data -- a Kiyotaka exclusive. Not available on any other crypto data API.
---

# TPO / Market Profile

<EndpointBar method="GET" path="/v1/points"></EndpointBar>

<TypeHeader type="TPO_AGG" meta="Weight: 5x | Max points: 20,000"></TypeHeader>

Time Price Opportunity (Market Profile) data. Shows how price distributes over time blocks within a session. Includes structural features like Point of Control, Value Area, Initial Balance Range, poor highs/lows, and single prints.

<Callout kind="tip">

TPO is a Kiyotaka exclusive -- no other crypto data API offers Market Profile data.

</Callout>

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `tpoBlockSizeMinutes` | int32 | No | Size of each time block: `5`, `30`, `60`, or `240` minutes. Default: `30`. |
| `tpoSession` | TPOSession | No | Session type. Default: unspecified (uses interval). |

### TPO sessions

| Value | Description |
| --- | --- |
| `TPO_SESSION_DAILY` | Daily session profile |
| `TPO_SESSION_WEEKLY` | Weekly session profile |
| `TPO_SESSION_MONTHLY` | Monthly session profile |

## Response fields

| Field | Type | Description |
| --- | --- | --- |
| `timestamp` | Timestamp | Session start |
| `period_start` | Timestamp | Profile period start |
| `period_end` | Timestamp | Profile period end |
| `levels` | TPOLevel[] | Array of price levels (see below) |

<Callout kind="note">

TPO responses currently use snake_case JSON field names. Additional derived fields such as `block_size_minutes`, `poc_price`, `vah_price`, `val_price`, `profile_high`, `profile_low`, `opening_price`, `closing_price`, `ibr_high`, `ibr_low`, `total_tpo_count`, `value_area_percentage`, `poor_highs`, `poor_lows`, `total_volume`, and `single_prints` may be omitted when the backend does not populate them.

</Callout>

Unlike most REST types, TPO currently returns its payload under `Point.TpoAggregation` instead of inlining fields directly under `Point`.

### TPOLevel fields

Each entry in the `levels` array contains:

| Field | Type | Description |
| --- | --- | --- |
| `price` | double | Price level |
| `block_ids` | int32[] | Time block indices where this price was visited |
| `buy_volume` | double | Buy volume at this price |
| `sell_volume` | double | Sell volume at this price |

Current `/v1/points` responses may omit derived `levels` fields such as `tpo_count`, `volume`, `first_touch_block`, and `last_touch_block` when they are not populated.

## Capabilities

| Feature | Supported | Details |
| --- | --- | --- |
| USD denomination | Yes | `transform.normalize.quote=USD` |
| Multi-exchange aggregation | Yes | `transform.groupBy.type=GROUP_BY_TYPE_SUM` with `coin` param |
| Session types | Yes | Daily, weekly, monthly profiles |
| Configurable block size | Yes | 5, 30, 60, or 240 minute blocks |

## Examples

### Daily profile with 30-minute blocks

Fetches 1 day of daily Market Profile for BTCUSDT on Binance Futures. Each session is divided into 30-minute time blocks (the default). Returns POC, Value Area, Initial Balance Range, and per-price-level TPO counts.

<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">&exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&interval</span>=<span class="s-s">DAY</span>
    <span class="s-p">&from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&period</span>=<span class="s-n">86400</span>
    <span class="s-p">&tpoSession</span>=<span class="s-s">TPO_SESSION_DAILY</span>
    <span class="s-p">&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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=DAY&from=1774800000&period=86400&tpoSession=TPO_SESSION_DAILY&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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=DAY&from=1774800000&period=86400&tpoSession=TPO_SESSION_DAILY&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>

### Weekly profile

Fetches 1 week of weekly Market Profile with 60-minute time blocks. Useful for identifying higher-timeframe value areas and structural features.

<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">&exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&interval</span>=<span class="s-s">WEEK</span>
    <span class="s-p">&from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&period</span>=<span class="s-n">604800</span>
    <span class="s-p">&tpoSession</span>=<span class="s-s">TPO_SESSION_WEEKLY</span>
    <span class="s-p">&tpoBlockSizeMinutes</span>=<span class="s-n">60</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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=WEEK&from=1774800000&period=604800&tpoSession=TPO_SESSION_WEEKLY&tpoBlockSizeMinutes=60 "</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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=WEEK&from=1774800000&period=604800&tpoSession=TPO_SESSION_WEEKLY&tpoBlockSizeMinutes=60 "</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>

### High-resolution (5-minute blocks)

Same daily profile but with 5-minute time blocks instead of 30. Produces more granular TPO data with more time blocks per session -- useful for intraday analysis.

<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">&exchange</span>=<span class="s-s">BINANCE_FUTURES</span>
    <span class="s-p">&rawSymbol</span>=<span class="s-s">BTCUSDT</span>
    <span class="s-p">&interval</span>=<span class="s-s">DAY</span>
    <span class="s-p">&from</span>=<span class="s-n">1774800000</span>
    <span class="s-p">&period</span>=<span class="s-n">86400</span>
    <span class="s-p">&tpoSession</span>=<span class="s-s">TPO_SESSION_DAILY</span>
    <span class="s-p">&tpoBlockSizeMinutes</span>=<span class="s-n">5</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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=DAY&from=1774800000&period=86400&tpoSession=TPO_SESSION_DAILY&tpoBlockSizeMinutes=5 "</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&exchange=BINANCE_FUTURES&rawSymbol=BTCUSDT&interval=DAY&from=1774800000&period=86400&tpoSession=TPO_SESSION_DAILY&tpoBlockSizeMinutes=5 "</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>

### Response

<CodeBlock lang="JSON">
<pre>{
  <span class="s-p">"series"</span>: [
    {
      <span class="s-p">"id"</span>: {
        <span class="s-p">"type"</span>: <span class="s-s">"TPO_AGG"</span>,
        <span class="s-p">"exchange"</span>: <span class="s-s">"BINANCE_FUTURES"</span>,
        <span class="s-p">"rawSymbol"</span>: <span class="s-s">"BTCUSDT"</span>,
        <span class="s-p">"normalizedSymbol"</span>: <span class="s-s">"BTC-USDT"</span>,
        <span class="s-p">"category"</span>: <span class="s-s">"PERPETUAL"</span>,
        <span class="s-p">"interval"</span>: <span class="s-s">"FIFTEEN_MINUTES"</span>,
        <span class="s-p">"coin"</span>: <span class="s-s">"BTC"</span>
      },
      <span class="s-p">"points"</span>: [
        {
          <span class="s-p">"Point"</span>: {
            <span class="s-p">"TpoAggregation"</span>: {
              <span class="s-p">"timestamp"</span>: { <span class="s-p">"s"</span>: <span class="s-n">1774828800</span> },
              <span class="s-p">"period_start"</span>: { <span class="s-p">"s"</span>: <span class="s-n">1774828800</span> },
              <span class="s-p">"period_end"</span>: { <span class="s-p">"s"</span>: <span class="s-n">1774886400</span> },
              <span class="s-p">"levels"</span>: [
                {
                  <span class="s-p">"price"</span>: <span class="s-n">65754</span>,
                  <span class="s-p">"block_ids"</span>: [<span class="s-n">0</span>],
                  <span class="s-p">"buy_volume"</span>: <span class="s-n">10.413000000000006</span>,
                  <span class="s-p">"sell_volume"</span>: <span class="s-n">10.654999999999998</span>
                }
              ]
            }
          }
        }
      ]
    }
  ]
}</pre>
</CodeBlock>