# Get Tax Report

Tax report for one coldkey and one token over a date range.

_Source: https://beta.taostats.io/docs/new/tax/get-tax-report_

_Last reviewed: 2026-10-07_

```http
GET https://api.taostats.io/v1/tax/report
```

Requires an API key in the `Authorization` header.

Tax report for one coldkey and one token over a date range.

## Try it

Try this request in the browser on the HTML version of this page, or use the code samples below.

### Code samples

**cURL**

```bash
curl -H "Authorization: <YOUR_API_KEY>" \
  "https://api.taostats.io/v1/tax/report"
```

**JavaScript**

```js
const response = await fetch('https://api.taostats.io/v1/tax/report', {
  headers: {
    Authorization: '<YOUR_API_KEY>',
  },
});
const data = await response.json();
```

**Python**

```python
import requests

response = requests.get(
    "https://api.taostats.io/v1/tax/report",
    headers={"Authorization": "<YOUR_API_KEY>"},
)
data = response.json()
```

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `token` | query | `string` | Yes | `TAO` (any case) or a subnet token, `SN1`, `SN2`, ... (exact case). |
| `date_start` | query | `string` | Yes | Start of the range, `YYYY-MM-DD`, inclusive. |
| `date_end` | query | `string` | Yes | End of the range, `YYYY-MM-DD`, inclusive. At most 12 calendar months after `date_start`. |
| `coldkey` | query | `string` | Yes | Coldkey, SS58 or 0x-prefixed hex. |
| `format` | query | `string` |  | `json` (default) or `csv`. CSV is served as a file download. One of `json`, `csv`. |

## Responses

### `200` — Every row of the range; with `format=csv`, the same rows as a CSV download

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `array` | Yes |  |
| `data[].additional_data` | `string, nullable` | Yes |  |
| `data[].block_number` | `integer (int32)` | Yes |  |
| `data[].coldkey` | `string` | Yes | Coldkey, SS58. |
| `data[].credit_amount` | `string, nullable` | Yes | TAO or alpha, decimal string. |
| `data[].daily_income` | `string, nullable` | Yes | TAO or alpha, decimal string. Set on income rows. |
| `data[].daily_income_usd` | `string, nullable` | Yes | USD, two decimal places. |
| `data[].date` | `string, nullable` | Yes | `YYYY-MM-DD`. Set on income rows and on an invented opening row. |
| `data[].debit_amount` | `string, nullable` | Yes | TAO or alpha, decimal string. |
| `data[].extrinsic_id` | `string, nullable` | Yes |  |
| `data[].free_balance` | `string, nullable` | Yes |  |
| `data[].locked_balance` | `string, nullable` | Yes |  |
| `data[].network` | `string` | Yes | `finney`, or `nakamoto` / `kusanagi` for the networks before it. |
| `data[].reserved_balance` | `string, nullable` | Yes |  |
| `data[].staked_balance` | `string, nullable` | Yes |  |
| `data[].timestamp` | `string` | Yes | ISO 8601, milliseconds, UTC. |
| `data[].token` | `string` | Yes | `TAO` or `SN{netuid}`. |
| `data[].token_price_in_tao` | `string, nullable` | Yes | Decimal string; `1` for TAO. |
| `data[].token_price_in_usd` | `string, nullable` | Yes | Decimal string. |
| `data[].total_balance` | `string, nullable` | Yes | TAO or alpha, decimal string. Set on balance rows. |
| `data[].transaction_type` | `string, nullable` | Yes | `transfer_in`, `fee`, `token_swap`, ...; `null` on a balance row or an income row. |
| `pagination` | `object` | Yes | Always one page holding every row. |
| `pagination.current_page` | `integer (int32)` | Yes | 1-indexed page that produced the rows in `data`. |
| `pagination.next_page` | `integer (int32), nullable` | Yes | Next page number, or `null` if this is the last page. |
| `pagination.per_page` | `integer (int32)` | Yes | Number of items requested per page. |
| `pagination.prev_page` | `integer (int32), nullable` | Yes | Previous page number, or `null` if this is the first page. |
| `pagination.total_items` | `integer (int64)` | Yes | Number of items matching the query across all pages. This is the exact count — every matching row, however many there are. It is not bounded by `total_pages`, so a listing can legitimately report far more items than `total_pages × per_page`. |
| `pagination.total_pages` | `integer (int32)` | Yes | Number of pages at the current `per_page` that this API will serve: `ceil(total_items / per_page)`, capped at `ceil(1000000 / per_page)` because the `page` parameter only reaches into the first 1,000,000 rows. When the cap bites, `total_items` is still the true total and this is the last page a request can ask for; reach deeper history with the endpoint's range filters instead of a larger `page`. |

### `400` — Invalid query parameter

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `message` | `string` | Yes | Plain-english message describing the failure from the caller's perspective. |
| `status_code` | `integer (int32)` | Yes | HTTP status code (mirrored in the response status line for convenience). |

### `404` — The coldkey has no rows for this token in the range

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `message` | `string` | Yes | Plain-english message describing the failure from the caller's perspective. |
| `status_code` | `integer (int32)` | Yes | HTTP status code (mirrored in the response status line for convenience). |

### `500` — Internal server error

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `message` | `string` | Yes | Plain-english message describing the failure from the caller's perspective. |
| `status_code` | `integer (int32)` | Yes | HTTP status code (mirrored in the response status line for convenience). |

Every request needs an `Authorization` header holding your API key — see [Getting started with the Taostats API](https://beta.taostats.io/docs/start-here/getting-started-with-taostats-api).
