Documentación / Nueva referencia de API / Blockchain
Get Events
Última revisión: 2026-11-01
Paginated list of indexed events.
Try it
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). | |
pallet | query | string | Filter by pallet name (exact match). | |
name | query | string | Filter by event name (exact match). | |
full_name | query | string | Filter by Pallet.Name (exact match). | |
id | query | string | Event ID ({block_number}-{event_idx:04}) — exact match. | |
phase | query | string | Filter by phase. Typical values: Initialization, Finalization, ApplyExtrinsic. No allow-list enforced — unknown values return zero rows. | |
call_id | query | string | Filter by call ID (exact match). Returns only events that have been mapped to a call. | |
extrinsic_id | query | string | Filter by extrinsic ID ({block_number}-{extrinsic_idx:04}) — exact match. Returns only events under that extrinsic; excludes Initialization / Finalization-phase events with extrinsic_id = null. | |
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 events matching the filter set
| Field | Type | Required | Description |
|---|---|---|---|
data | array | Yes | |
data[].args | object | Yes | Event arguments as JSON. The stored JSON text is passed directly to the response serializer without building a JSON value tree. null when the indexer wrote nothing or when the stored text is invalid. The shape is intentionally any-value: the substrate-archive decoder produces an object for named-field composites, an array for tuple-style unnamed composites, and a string for empty variants (composite_inner_to_json in substrate-archive/src/decode.rs). Advertising the schema as object-only would make generated SDKs reject valid rows. utoipa 5's built-in ToSchema for serde_json::Value emits SchemaType::AnyValue (no type constraint), which matches the contract. #[schema(required)] keeps the field always present in responses — when the row's args is None, the JSON value is the explicit literal null rather than an omitted field. |
data[].block_number | integer (int32) | Yes | Block height. |
data[].call_id | string, nullable | Yes | Associated call ID; null when the event hasn't been mapped to a call. |
data[].extrinsic_id | string, nullable | Yes | Parent extrinsic ID; null for Initialization / Finalization phase events. |
data[].id | string | Yes | {block_number}-{event_idx:04} (event_idx is the global index within the block, across all phases). |
data[].index | integer (int32) | Yes | Event index within the block (global across phases). |
data[].name | string | Yes | Event name. |
data[].pallet | string | Yes | Pallet name. |
data[].phase | string | Yes | Event phase: Initialization, Finalization, or ApplyExtrinsic. |
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.