Polkadot - Getting Extrinsics from a Block

Getting the Extrinsics from a block requires a few steps

Steps

Step_1: Get Block Hash

RPC call. We need the block number to pass it as a parameter.

Example request:

curl --location 'https://polkadot-mainnet.gateway.tatum.io' \
--header 'Content-Type: application/json' \
--header 'x-api-key: {YOUR_API_KEY}' \
--data '{
    "jsonrpc": "2.0",
    "method": "chain_getBlockHash",
    "params": [21453172],
    "id": 1
}'
//Response:
{
    "jsonrpc": "2.0",
    "result": "0xe45599f512e6487668031b0ef0d1df79ccdfc3eea4f7b6987eb2e64cb5acd5e1",
    "id": 1
}

Step_2: Get Block

RPC call. Take the block hash from Step_1 and pass it as a parameter

Example request:

curl --location 'https://polkadot-mainnet.gateway.tatum.io' \
--header 'Content-Type: application/json' \
--header 'x-api-key: {YOUR_API_KEY}' \
--data '{
    "jsonrpc": "2.0",
    "method": "chain_getBlock",
    "params": ["0xe45599f512e6487668031b0ef0d1df79ccdfc3eea4f7b6987eb2e64cb5acd5e1"],
    "id": 1
}'
//Response:
{
    "jsonrpc": "2.0",
    "result": {
        "block": {
            "header": {
                "parentHash": "0x49cec4687315e7aa0b3e20926dfb5b4103fcd66678de5a0e2774b5250974c85e",
                "number": "0x1475974",
                "stateRoot": "0x20eea15eacd5b52af0398b5894eb40c02d44c94aae2e918c6b821cfdbffbe56f",
                "extrinsicsRoot": "0x480781608d53a81287a876ca2ea57e013764f786c31f8606cbeb212b146d14aa",
                "digest": {
                    "logs": [
                        "0x0642414245b501030b0000008eb6151100000000e65b7d0b72ef8b189d0215e158dd5c76588e474b82a17e51f24ec581deed764313f0531a714c511935b34d3c54df07e67d346a60ef59f117f6ce77125cf0bf0eee40269abadc70052796c7259a9f7f9fd64996c0a9affd2ff1709f5324909909",
                        "0x044245454684039950151e4e3cf24d3059738b0dfd470a702030dbac21eab570475746b8b38043",
                        "0x0542414245010136b35069302a31e006977220857f48cadb93a8722df8a106336a2b1d2003ed3ad11b0624a907c2bfa6300f7a97b6bfaef55cc9918f9af27a4067d1557256d385"
                    ]
                }
            },
            "extrinsics": [
                "0x280403000b20a0e66c9001",
                "0x228402000
              ...

Step_3: Automatize data gathering

Here's an example code file in Python that can help you out.

🚧

Tatum staff does not troubleshoot 3rd party code.

Example code:

import os
import requests

# --- Config ---
API_KEY = os.getenv("YOUR_API_KEY") 
API_URL = "https://polkadot-mainnet.gateway.tatum.io"  
TIMEOUT = 15  # seconds

HEADERS = {
    "Content-Type": "application/json",
    "x-api-key": API_KEY,   # Required
}

def rpc(method, params=None, req_id=1):
    payload = {
        "jsonrpc": "2.0",
        "method": method,
        "params": params or [],
        "id": req_id,
    }
    resp = requests.post(API_URL, json=payload, headers=HEADERS, timeout=TIMEOUT)
    resp.raise_for_status()
    data = resp.json()
    if "error" in data and data["error"]:
        raise RuntimeError(f"RPC error: {data['error']}")
    return data.get("result")

def get_block_hash(block_number: int | None):
    # Polkadot accepts a block number (int) or None for the latest finalized block
    return rpc("chain_getBlockHash", [block_number] if block_number is not None else [])

def get_block_extrinsics(block_hash: str):
    result = rpc("chain_getBlock", [block_hash]) or {}
    return (result.get("block") or {}).get("extrinsics", [])

def main():
    block_number = 21_453_172
    extrinsic_index = 2

    try:
        block_hash = get_block_hash(block_number)
        print(f"Block hash for block {block_number}: {block_hash}")

        if not block_hash:
            print(f"Block hash for block {block_number} not found")
            return

        extrinsics = get_block_extrinsics(block_hash)
        if not extrinsics:
            print(f"No extrinsics found for block {block_number} ({block_hash})")
            return

        if 0 <= extrinsic_index < len(extrinsics):
            print(f"Extrinsic[{extrinsic_index}]: {extrinsics[extrinsic_index]}")
        else:
            print(f"Extrinsic index {extrinsic_index} out of range (len={len(extrinsics)})")

    except requests.exceptions.Timeout:
        print("Timeout contacting Gateway. Consider retry/backoff.")
    except requests.exceptions.HTTPError as e:
        print(f"HTTP error {e.response.status_code}: {e.response.text}")
    except Exception as e:
        print(f"Unhandled error: {e}")

if __name__ == "__main__":
    main()