# Get Proxy Calls

Paginated list of indexed proxy calls.

_Source: https://taostats.io/docs/api-reference/chain/get-proxy-calls_

_Last reviewed: 2026-11-10_

```http
GET https://api.taostats.io/v1/proxy-calls
```

Requires an API key in the `Authorization` header.

Paginated list of indexed proxy calls.

## 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/proxy-calls"
```

**JavaScript**

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

**Python**

```python
import requests

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `network` | query | `string` |  | Network. One of `finney`, `kusanagi`, `nakamoto`. Default: `finney`. One of `finney`, `kusanagi`, `nakamoto`. |
| `block_number` | query | `integer (int32)` |  | Specific block number (exact match). |
| `block_start` | query | `integer (int32)` |  | Block range start (inclusive lower bound). |
| `block_end` | query | `integer (int32)` |  | Block range end (inclusive upper bound). |
| `timestamp_start` | query | `integer (int64)` |  | Timestamp range start, Unix seconds (inclusive lower bound). |
| `timestamp_end` | query | `integer (int64)` |  | Timestamp range end, Unix seconds (inclusive upper bound). |
| `id` | query | `string` |  | Exact proxy call ID. |
| `signer_address` | query | `string` |  | Signer address (SS58 or 0x-hex; normalized to SS58 before the query). Exact match. |
| `real_address` | query | `string` |  | Real (proxied) address (SS58 or 0x-hex; normalized to SS58 before the query). Exact match. |
| `extrinsic_hash` | query | `string` |  | Exact extrinsic hash (0x-prefixed hex). |
| `extrinsic_id` | query | `string` |  | Exact extrinsic ID (e.g. `5000000-0002`). |
| `page` | query | `integer (int32)` |  | Page number (1-indexed). Default: 1. Bounded window: `(page − 1) × limit` must be below 1,000,000. Deep `OFFSET` paging is linear in the offset, so an uncapped `page` lets one request scan tens of millions of rows; a page past the window is rejected with a 400. Reach deeper history with this endpoint's range filters (`block_start`/`block_end`, `timestamp_start`/`timestamp_end`) rather than a larger `page`. |
| `limit` | query | `integer (int32)` |  | Results per page. Default: 50. Max: 200. |
| `order_by` | query | `string` |  | Column to order by. Only `timestamp` is supported. One of `timestamp`. |
| `order_dir` | query | `string` |  | Sort direction. Default: `desc`. One of `asc`, `desc`. |

## Responses

### `200` — Paginated list of proxy calls matching the filter set

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `array` | Yes |  |
| `data[].args` | `object` | Yes | Inner dispatched call arguments as JSON. The stored JSON text is passed directly to the response serializer. The shape varies by dispatched call, so callers should treat it as opaque JSON. Serializes as the explicit literal `null` if the stored string fails to parse. utoipa 5's built-in `ToSchema for serde_json::Value` emits `SchemaType::AnyValue` (no `type` constraint), matching the real-world variability. `#[schema(required)]` keeps the field always present in responses. |
| `data[].block_number` | `integer (int32)` | Yes | Block height. |
| `data[].extrinsic_hash` | `string` | Yes | Extrinsic hash (0x-prefixed hex). |
| `data[].extrinsic_id` | `string` | Yes | Parent extrinsic ID. |
| `data[].id` | `string` | Yes | Proxy call ID. |
| `data[].network` | `string` | Yes | Network name. |
| `data[].real_address` | `string` | Yes | Real (proxied) SS58 address. |
| `data[].signer_address` | `string` | Yes | Signer SS58 address. |
| `data[].timestamp` | `string` | Yes | ISO 8601 timestamp with millisecond precision, e.g. `"2024-05-15T10:30:00.000Z"`. |
| `pagination` | `object` | Yes | Pagination metadata appended to collection responses. `next_page` / `prev_page` are explicitly required+nullable in the OpenAPI spec: per `docs/api_standards.md` we emit `null` rather than omitting the field, so the SDK should model them as `Option`/nullable types that are always present in the response. **`total_items` is the exact number of matching rows** on every route (issue #992). It used to stop at 1,000,000, which reported a million transfers when finney holds 7,513,252 and a million events when the real figure is 981,179,110; the cap was removed on 29 Sep 2026 and nothing may reintroduce one — `crate::pagination::exact_count_sql` is the only count form, and `no_capped_count_reaches_the_api_surface` in `data-debug-scripts` fails the build if a capped one comes back. **`total_pages` is still bounded**, to `crate::pagination::max_reachable_page(per_page)`, because the `page` parameter is capped to a 1,000,000-row window: deep `OFFSET` paging reads every skipped row (24.7M rows / 36.6 GiB / 42 s measured on one endpoint, issue #413). So `total_pages` is exactly the last page this API will serve and `next_page` / `prev_page` stay coherent at the window edge, while `total_items` tells the caller how many rows there really are. History beyond the window is reached with each endpoint's range filters, not a larger `page`. |
| `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). |

### `413` — The selected rows carry more `args` than one request may materialize — lower `limit` or narrow the filter

| 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). |

### `503` — Another large `args` response is already in flight; retry shortly

| 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://taostats.io/docs/start-here/getting-started-with-taostats-api).
