Documentation Index
Fetch the complete documentation index at: https://docs.moralis.com/llms.txt
Use this file to discover all available pages before exploring further.
Overview
EVM Streams is the original Moralis Streams product, delivering real-time on-chain activity from every supported EVM chain via webhooks. Moralis indexes each chain automatically and pushes structured payloads to your endpoint whenever transactions or contract events match your criteria. Webhooks typically arrive within seconds of a block being mined — no node, no polling, no missed blocks. For a full chain list (Ethereum, Base, Polygon, BNB, Arbitrum, Optimism, Avalanche, and more), see Supported Chains.Key Features
- Real-time delivery: webhooks arrive within seconds of a block being produced
- Dual-phase notifications: every match fires twice — once unconfirmed (
confirmed: false) and again at finality (confirmed: true) - Rich filtering: watch addresses, contract events (via ABI), specific topics, or apply advanced value/contract conditions
- Free decoded data: ERC-20 transfers, ERC-20 approvals, NFT transfers (ERC-721 / ERC-1155), and NFT approvals are decoded into clean fields at no extra record cost
- Internal transactions: opt in to receive value moves that occur inside contract execution
- Triggers: invoke read-only contract functions as part of event processing — e.g. fetch token balances at the moment of a transfer
- Automatic retries: Moralis retries webhook delivery until your endpoint returns HTTP
200
How It Works
- A new block is produced on a supported EVM chain
- Moralis evaluates every transaction and log in the block against your stream’s filters
- Matching events fire an unconfirmed webhook immediately
- Once the block reaches the chain’s confirmation threshold, a confirmed webhook is delivered
- Your service upserts on
transactionHash(ortransactionHash + logIndexfor logs) to reconcile the two-phase lifecycle
Webhook Payload Structure
Each EVM webhook payload contains:- Block metadata — number, hash, timestamp
txs— native transactions (whenincludeNativeTxsis enabled)txsInternal— internal transactions (whenincludeInternalTxsis enabled)logs— raw contract event logs (whenincludeContractLogsis enabled)erc20Transfers/erc20Approvals— automatically decoded from logs, freenftTransfers/nftApprovals— automatically decoded for ERC-721 and ERC-1155, free- Confirmation status —
confirmed: true/false
EVM addresses are hex-encoded (
0x...) and case-insensitive. Comparisons should be done with toLowerCase() to avoid false negatives.Configuration Parameters
When creating an EVM stream you specify:| Parameter | Description |
|---|---|
webhookUrl | Public HTTPS endpoint that will receive payloads (required) |
chainIds | Array of hex chain IDs to watch (e.g. ["0x1", "0x2105"]) |
includeNativeTxs | Include native transactions in the payload |
includeContractLogs | Include raw contract logs in the payload |
includeInternalTxs | Include internal transactions in the payload |
abi | ABI fragments used to decode targeted contract events |
topic0 | Event signature(s) to match (e.g. Transfer(address,address,uint256)) |
advancedOptions | Per-event value-based filters and aggregations — see Advanced Options |
triggers | Read-only contract calls to execute at match time — see Triggers |
description | Human-readable stream description |
tag | Identifier for routing / filtering on your side |
API Endpoints
All EVM Streams endpoints require thex-api-key header.
Streams
| Method | Endpoint | Purpose |
|---|---|---|
PUT | /streams/evm | Create a stream with a webhook URL and configuration |
POST | /streams/evm/{id} | Update a stream’s configuration |
POST | /streams/evm/{id}/status | Pause or resume a stream |
GET | /streams/evm | List existing EVM streams |
GET | /streams/evm/{id} | Get a stream by ID |
DELETE | /streams/evm/{id} | Remove a stream |
POST | /streams/evm/{id}/duplicate | Duplicate a stream |
POST | /streams/evm/{chainId}/block/{blockNumber} | Get webhook data for a historical block |
POST | /streams/evm/{chainId}/block-to-webhook/{blockNumber}/{streamId} | Replay a historical block for backfilling |
Addresses
| Method | Endpoint | Purpose |
|---|---|---|
GET | /streams/evm/{id}/address | List addresses attached to a stream |
POST | /streams/evm/{id}/address | Add an address to monitor |
PATCH | /streams/evm/{id}/address | Replace an address on a stream |
DELETE | /streams/evm/{id}/address | Remove an address from a stream |
Common Use Cases
- Wallet activity notifications — alert users on inbound and outbound transfers, swaps, and contract interactions
- Token transfer tracking — ERC-20 movements (airdrops, payments, vesting) decoded for free
- NFT marketplaces — mint, transfer, and approval events for ERC-721 and ERC-1155 collections
- DeFi protocol monitoring — track interactions with specific contracts via ABI events and topics
- Treasury & accounting — real-time corporate or DAO wallet activity across multiple chains
- AI agents — react to on-chain events as they happen
Setup Checklist
- Generate an API key from admin.moralis.com
- Deploy a publicly accessible HTTPS webhook endpoint
- Create the stream via
PUT /streams/evm - Register the addresses you want to monitor (
POST /streams/evm/{id}/address) - Implement the verification handler — respond to the empty-body test
POSTwith HTTP200 - Verify the
x-signatureheader on every delivery - Build dedupe logic keyed on
transactionHash(ortransactionHash + logIndexfor logs) to handle the unconfirmed → confirmed transition - Always return HTTP
200from your handler, even when your own processing errors — Moralis retries on non-200 responses

