# Get EVM Transactions

Paginated decoded EVM transactions.

_Source: https://beta.taostats.io/docs/new/evm/get-evm-transactions_

_Last reviewed: 2026-10-07_

```http
GET https://api.taostats.io/v1/evm/transactions
```

Requires an API key in the `Authorization` header.

Paginated decoded EVM transactions.

## 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/evm/transactions"
```

**JavaScript**

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

**Python**

```python
import requests

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `block_number` | query | `integer (int32)` |  | Filter by exact block number. |
| `block_start` | query | `integer (int32)` |  | Block-number range start (inclusive). |
| `block_end` | query | `integer (int32)` |  | Block-number range end (inclusive). |
| `timestamp_start` | query | `integer (int64)` |  | Timestamp range start, Unix seconds (inclusive). |
| `timestamp_end` | query | `integer (int64)` |  | Timestamp range end, Unix seconds (inclusive). |
| `hash` | query | `string` |  | Filter by exact transaction hash. |
| `address` | query | `string` |  | Filter by `from` OR `to` address (lower-cased server-side). |
| `to` | query | `string` |  | Filter by recipient (`to`) address (lower-cased server-side). |
| `from` | query | `string` |  | Filter by sender (`from`) address (lower-cased server-side). |
| `method_name` | query | `string` |  | Filter by decoded method name. |
| `method_id` | query | `string` |  | Filter by 4-byte method id, bare lower-case hex with NO `0x` prefix (e.g. `a9059cbb`) — matched verbatim against the stored column, exactly as the old API does. |
| `contract_created` | query | `string` |  | Filter by created-contract address (lower-cased server-side). |
| `index` | query | `integer (int32)` |  | Filter by transaction index within the block. |
| `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. Out-of-range values are clamped into `[1, 200]` (e.g. `0`→1, `9999`→200), matching the old API rather than 400ing. |
| `order_by` | query | `string` |  | Column to order by: `block_number` (default) or `timestamp`. |
| `order_dir` | query | `string` |  | Sort direction: `asc` or `desc`. Default: `desc`. |

## Responses

### `200` — Paginated list of decoded EVM transactions

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `array` | Yes |  |
| `data[].abi_json` | `object` | Yes | Decoded ABI fragment as JSON, or `null` when the selector is unknown. |
| `data[].args` | `object` | Yes | Decoded call arguments as a JSON object, or `null` when undecodable. |
| `data[].block_hash` | `string` | Yes | Block hash. |
| `data[].block_number` | `integer (int32)` | Yes | Block number containing the transaction. |
| `data[].contract_created` | `string, nullable` | Yes | Address of the contract created by this transaction, if any. |
| `data[].cumulative_gas_used` | `string` | Yes | Cumulative gas used in the block up to and including this tx. |
| `data[].effective_gas_price` | `string` | Yes | Effective gas price (decimal string). |
| `data[].from` | `string` | Yes | Sender address (`from_address`). |
| `data[].full_signature` | `string, nullable` | Yes | Full function signature (e.g. `transfer(address,uint256)`), or `null`. |
| `data[].gas` | `string` | Yes | Gas limit (decimal string). |
| `data[].gas_price` | `string` | Yes | Gas price (decimal string). |
| `data[].gas_used` | `string` | Yes | Gas used by this transaction (decimal string). |
| `data[].hash` | `string` | Yes | Transaction hash. |
| `data[].hashable_signature` | `string, nullable` | Yes | Hashable function signature, or `null`. |
| `data[].index` | `integer (int32)` | Yes | Transaction index within the block. |
| `data[].input` | `string` | Yes | Raw call input data (`0x…`). |
| `data[].max_fee_per_gas` | `string, nullable` | Yes | EIP-1559 max fee per gas (decimal string), or `null`. |
| `data[].max_priority_fee_per_gas` | `string, nullable` | Yes | EIP-1559 max priority fee per gas (decimal string), or `null`. |
| `data[].method_id` | `string, nullable` | Yes | 4-byte method selector as bare lower-case hex (8 chars, NO `0x` prefix — e.g. `a9059cbb`), matching the old API and the stored column (`input[2..10]`). `null` for native transfers (input shorter than 10). |
| `data[].method_name` | `string, nullable` | Yes | Decoded method name (e.g. `transfer`, `native_transfer`, `unknown`). |
| `data[].nonce` | `integer (int32)` | Yes | Transaction nonce. |
| `data[].success` | `boolean` | Yes | Whether the transaction succeeded. |
| `data[].timestamp` | `string` | Yes | Block time, ISO 8601 seconds precision (e.g. `2026-06-27T17:06:00Z`). |
| `data[].to` | `string, nullable` | Yes | Recipient address (`to_address`), or `null` for contract creation. |
| `data[].value` | `string` | Yes | Transaction value in wei (decimal string). |
| `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). |

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