Overview
Every Streams webhook delivers a JSON payload containing the on-chain events that match your stream configuration. Payload shape depends on the chain:- EVM payloads include native transactions, internal transactions, contract logs, and free decoded ERC-20 / NFT transfers and approvals.
- Bitcoin payloads include block metadata and matched transactions with output (
vout) and input (vin) details. - Solana payloads include slot/block metadata and matched transactions with
accountKeys, instructions, inner instructions, and pre/post token balances.
Top-Level Payload Structure
- EVM
- Bitcoin
- Solana
| Field | Description |
|---|---|
confirmed | Whether the block is finalized |
chainId | Hex-encoded EVM chain ID |
streamId | Unique stream identifier |
tag | Optional stream tag |
retries | Number of delivery attempts |
block | Block metadata |
logs | Raw smart contract logs |
txs | Native transactions |
txsInternal | Internal (contract) transactions |
Confirmed vs Unconfirmed Events
Streams sends two webhook payloads per match:- Unconfirmed (
confirmed: false) — sent as soon as the matching transaction is included in a block (or slot, on Solana). The block is close to the chain tip and could still be reorged. - Confirmed (
confirmed: true) — sent after the chain’s reorg-safety threshold has passed and the same block has been re-fetched.
For chain-specific confirmation rules and finality models, see Supported Chains and Confirmation & Finality.For how reorgs are handled, see Re-org Handling.
Verifying Webhook Authenticity
Every webhook includes anx-signature header. You must verify this signature to ensure the payload originated from Moralis. Verification is identical for EVM, Bitcoin, and Solana payloads.
Basic flow:
- Read the raw request body
- Hash it together with your Streams secret
- Compare against
x-signature
Detailed Payload Contents
- EVM
- Bitcoin
- Solana
Native Transactions (txs)
Included when includeNativeTxs is enabled. Native transactions include sender and recipient, value transferred, gas usage, and receipt fields.Contract Logs (logs)
Included when includeContractLogs is enabled. Logs contain raw topics and data, the emitting contract address, the transaction hash, and a log index. Logs are automatically decoded into higher-level objects when applicable (see below).ERC-20 Transfers
ERC-20 transfers are automatically decoded from logs and included at no additional cost. Each transfer includesfrom, to, value, token metadata (name, symbol, decimals), and a human-readable valueWithDecimals. Transfers appear in both confirmed and unconfirmed payloads.ERC-20 Approvals
ERC-20 approvals are also automatically decoded and include owner and spender, approved amount, and token metadata.NFT Transfers
NFT transfers are automatically decoded for both ERC-721 and ERC-1155 tokens. Each NFT transfer includes:tokenName: the name of the NFTtokenSymbol: the symbol of the NFT (only for ERC721)tokenContractType: the type of the NFT (either ERC721 or ERC1155)to: the receiver address of the NFT transferfrom: the sender address of the NFT transferamount: the amount of NFT transferred (1for ERC-721)transactionHash: the transaction hash of the NFT transfertokenId: the token ID of the NFT transferredoperator: a third-party address approved to manage NFTs owned byfrom(see EIP-1155)contract: the contract address of the NFT transferred
NFT Approvals
Approval events for ERC-721 and ERC-1155 tokens are grouped undernftApprovals and decoded automatically.Smart Contract Events Only
If you configure a stream to listen only to specific contract events:- Only
logswill be populated - ABI decoding is applied using the ABI you provide
- No token or transaction arrays are included unless explicitly enabled
Internal Transactions (txsInternal)
Internal transactions represent value transfers occurring inside contract execution. Included when includeInternalTxs is enabled. Useful for DeFi protocol tracing, internal fund movement, and advanced analytics.Retry Metadata
If a webhook delivery fails:retriesincrements- The event is retried automatically
- Failed deliveries are retained for replay (plan-dependent)
Common Next Steps
Depending on what you’re building:- Need cleaner decoded data? Explore Parsed Data
- Need fine-grained filtering? Explore Filters
- Need on-chain lookups inside webhooks (EVM only)? Explore Triggers
- Handling high throughput? Explore Rate Limits

