Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Real-time blockchain event monitoring with webhooks. Use when user asks about setting up webhooks, real-time event streaming, monitoring wallet addresses, tr...
Real-time blockchain event monitoring with webhooks. Use when user asks about setting up webhooks, real-time event streaming, monitoring wallet addresses, tr...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
The #1 cause of bugs is using wrong HTTP methods or stream configurations. For EVERY endpoint: Read rules/{EndpointName}.md Check HTTP method (PUT for create, POST for update, DELETE for delete) Verify stream ID format (UUID, not hex) Use hex chain IDs (0x1, 0x89), not names (eth, polygon) Reading Order: This SKILL.md (core patterns) Endpoint rule file in rules/ Pattern references in references/ (for edge cases only)
Never ask the user to paste their API key into the chat. Instead: Check if MORALIS_API_KEY is set in the environment (try running [ -n "$MORALIS_API_KEY" ] && echo "API key is set" || echo "API key is NOT set"). If not set, offer to create the .env file with an empty placeholder: MORALIS_API_KEY= Tell the user to open the .env file and paste their key there themselves. Let them know: without the key, you won't be able to test or call the Moralis API on their behalf. If they don't have a key yet, point them to admin.moralis.com/register (free, no credit card).
The .env file location depends on how skills are installed: Create the .env file in the project root (same directory the user runs Claude Code from). Make sure .env is in .gitignore.
curl "https://api.moralis-streams.com/streams/evm?limit=10" \ -H "X-API-Key: $MORALIS_API_KEY"
https://api.moralis-streams.com Important: Different from Data API (deep-index.moralis.io).
All requests require: X-API-Key: $MORALIS_API_KEY
ActionMethodEndpointCreate streamPUT/streams/evmUpdate streamPOST/streams/evm/{id}Delete streamDELETE/streams/evm/{id}Get streamsGET/streams/evmReplace addressesPATCH/streams/evm/{id}/address Common mistake: Using POST to create streams. Use PUT instead.
TypeDescriptiontxNative transactionslogContract event logserc20transferERC20 token transferserc20approvalERC20 approvalsnfttransferNFT transfersinternalTxInternal transactions
// WRONG - Hex format "0x1234567890abcdef" // CORRECT - UUID format "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
"0x1" // Ethereum "0x89" // Polygon "0x38" // BSC "0xa4b1" // Arbitrum "0xa" // Optimism "0x2105" // Base
"Transfer(address,address,uint256)" // ERC20/NFT Transfer "Approval(address,address,uint256)" // ERC20 Approval
"active" // CORRECT - normal operating state "paused" // CORRECT - manually paused "error" // CORRECT - auto-set when webhook success rate <70% "terminated" // CORRECT - unrecoverable, after 24h in error "ACTIVE" // WRONG
Using POST to create streams - Use PUT instead Wrong base URL - Use api.moralis-streams.com, NOT deep-index.moralis.io Hex stream ID - Must be UUID format, not hex String chain names - Use hex (0x1), not names (eth) Uppercase status - Use lowercase ("active", "paused") Not returning 200 on test webhook - Stream won't start unless your endpoint returns 2xx on the test webhook sent during create/update See references/CommonPitfalls.md for complete reference.
Enrich webhook data with on-chain reads (e.g., balanceOf). Triggers execute view/pure functions and attach results to webhook events. Supports dynamic selectors ($contract, $from, $to). See references/Triggers.md for complete reference with examples.
Configure getNativeBalances to include native token balances (ETH, BNB, etc.) in webhook payloads. Requires Business plan+. See references/UsefulStreamOptions.md for configuration details.
Two webhooks per event: Unconfirmed (confirmed: false) + Confirmed (confirmed: true). Idempotent handlers required. Streams auto-terminate after 24 hours in error state (webhook success rate <70%). This is unrecoverable โ you must create a new stream. Test webhook: Sent on every create/update. Must return 200 or stream won't start. See references/DeliveryGuarantees.md and references/ErrorHandling.md.
Webhooks are signed with your streams secret (different from API key). Header: x-signature Algorithm: sha3(JSON.stringify(body) + secret) const verifySignature = (req, secret) => { const provided = req.headers["x-signature"]; const generated = web3.utils.sha3(JSON.stringify(req.body) + secret); if (generated !== provided) throw new Error("Invalid Signature"); }; See references/WebhookSecurity.md for complete examples.
WEBHOOK_URL="https://your-server.com/webhook" # List streams (requires limit) curl "https://api.moralis-streams.com/streams/evm?limit=100" \ -H "X-API-Key: $MORALIS_API_KEY" # Create stream (PUT, not POST) curl -X PUT "https://api.moralis-streams.com/streams/evm" \ -H "X-API-Key: $MORALIS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "webhookUrl": "'${WEBHOOK_URL}'", "description": "Test stream", "tag": "test", "topic0": ["Transfer(address,address,uint256)"], "allAddresses": false, "chainIds": ["0x1"] }' # Pause stream (POST to status) curl -X POST "https://api.moralis-streams.com/streams/evm/<stream_id>/status" \ -H "X-API-Key: $MORALIS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "paused"}'
IssueCauseSolution"400 Bad Request"Invalid configCheck webhookUrl, topic0 format, chainIds"404 Not Found"Wrong stream IDVerify UUID format"Method Not Allowed"Wrong HTTP methodPUT for create, POST for update"Missing limit"GET /streams/evmAdd ?limit=100"No webhooks"Stream pausedCheck status is "active"
Complete list of all 20 Streams API endpoints organized by category.
Create, update, delete, and manage streams. EndpointDescriptionAddAddressToStreamAdd address to streamCreateStreamCreate streamDeleteAddressFromStreamDelete address from streamDeleteStreamDelete streamDuplicateStreamDuplicate streamGetAddressesGet addresses by streamGetHistoryGet historyGetLogsGet logsGetSettingsGet project settingsGetStatsGet project statsGetStatsByStreamIdGet project stats by Stream IDGetStreamGet a specific evm stream.GetStreamBlockDataByNumberGet webhook data returned on the block number with provided stream configGetStreamBlockDataToWebhookByNumberSend webhook based on a specific block number using stream config and addresses.GetStreamsGet streamsReplaceAddressFromStreamReplaces address from streamUpdateStreamUpdate streamUpdateStreamStatusUpdate stream status
Pause/resume streams and configure settings. EndpointDescriptionSetSettingsSet project settings
Stream history, replay, statistics, logs, and block data. EndpointDescriptionReplayHistoryReplay history
Set allAddresses: true with a topic0 and abi to monitor an event across every contract on a chain (e.g., all ERC20 transfers network-wide). Requires higher-tier plans. See references/ListenToAllAddresses.md for complete examples, ABI templates, and gotchas.
curl -X PUT "https://api.moralis-streams.com/streams/evm" \ -H "X-API-Key: $MORALIS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "webhookUrl": "https://your-server.com/webhook", "description": "Monitor ERC20 transfers", "tag": "erc20-monitor", "topic0": ["Transfer(address,address,uint256)"], "allAddresses": true, "chainIds": ["0x1", "0x89"], "advancedOptions": [{ "topic0": "Transfer(address,address,uint256)", "includeNativeHash": true }] }'
List endpoints use cursor-based pagination: # First page curl "...?limit=100" -H "X-API-Key: $KEY" # Next page curl "...?limit=100&cursor=<cursor>" -H "X-API-Key: $KEY"
All major EVM chains: Ethereum (0x1), Polygon (0x89), BSC (0x38), Arbitrum (0xa4b1), Optimism (0xa), Base (0x2105), Avalanche (0xa86a), and more. See references/StreamConfiguration.md for complete chain ID list.
references/CommonPitfalls.md - Complete pitfalls reference references/DeliveryGuarantees.md - At-least-once delivery, dual webhooks, confirmation blocks, test webhooks references/ErrorHandling.md - Retry schedule, error/terminated states, rate limits, re-org handling references/FAQ.md - Streams API frequently asked questions references/FilterStreams.md - Webhook data filtering to reduce noise references/ListenToAllAddresses.md - Monitor events across all contracts on a chain references/MonitorMultipleAddresses.md - Multi-address monitoring patterns references/ReplayFailedWebhooks.md - Replay failed webhook guide references/StreamConfiguration.md - Stream config reference references/Triggers.md - Read-only contract call enrichment (balanceOf, etc.) references/Tutorials.md - Real-world examples and tutorials references/UsefulStreamOptions.md - Advanced stream configuration options references/WebhookResponseBody.md - Webhook payload structure references/WebhookSecurity.md - Signature verification
Endpoint rules: rules/*.md files Data API: @moralis-data-api for querying blockchain state
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.