On-chain events, the moment they happen
Spectrum Webhooks watches the chain and pushes a signed HTTPS request to your endpoint the moment an address you track moves value, or a contract you track emits an event you declared. No polling, no node to run, no missed blocks, just a clean JSON payload for every relevant event.
1 block
Typical delivery latency
Pushed the moment an event is confirmed
At-least-once
Durable, retried delivery
Retries until your server returns 2xx
Replace your indexer and your polling loops
Building on-chain usually means running an archive node with a custom indexer, or hammering a public RPC with polling that is slow, rate-limited, and still misses reorgs. Webhooks replaces both.
Stop polling
Get a push the instant an event is confirmed, typically within one block. No loops, no rate limits, no missed blocks.
Never miss an event
Durable, at-least-once delivery with automatic retries survives your endpoint being down, then a dead-letter queue you can replay.
Reorg-aware
When the chain reorganizes we flag which events to roll back, so you are never quietly left holding bad data.
Signed and verifiable
Every POST is HMAC-signed with a per-webhook secret and timestamp, so you can prove origin and reject replays.
From on-chain event to your endpoint
We ingest and decode every block, match it against your filters, sign it, and deliver, retrying until your server acknowledges. Everything is durably queued first, so an outage on either side never loses an event.
On-chain event
Block confirmed
Spectrum
Decode & sign
Your endpoint
Verify & 2xx
On-chain event
Block confirmed
Spectrum
Decode & sign
Your endpoint
Verify & 2xx
- 1
Ingest and decode
We subscribe to the chain and decode every block: native, internal, and token transfers.
- 2
Match your filters
Each event is matched against your webhook's addresses, token, and category filters.
- 3
Sign and batch
Matching events are batched by block, signed with your secret, and ordered deterministically.
- 4
Deliver and retry
We deliver to your destination, a signed POST to your endpoint or a summary in Slack or Telegram, and retry with backoff; persistent failures go to a dead-letter queue.
Delivered where your team already is
Every webhook names a destination. Send the signed JSON to your own endpoint, post a readable summary into Slack or Telegram, or do both: the same chain and filter can deliver to more than one destination.
Your endpoint
A signed JSON POST to any HTTPS URL you own, with the full decoded envelope and nothing stripped out.
- HMAC-SHA256 signature over the timestamped body, in X-Spectrum-Signature
- X-Spectrum-Event-Id to deduplicate, since delivery is at-least-once
- Retries with backoff until 2xx, then a dead-letter queue
- Key rotation ships a second header during the grace period
Slack
The same event rendered as a readable summary and posted straight into a channel by your bot.
- Posted with your bot token and channel ID
- Amounts, tokens and addresses resolved in the message
- Revoked tokens and missing channels dead-letter instead of retrying
Telegram
A readable summary delivered to a chat or group, so on-call sees the event without leaving Telegram.
- Posted with your BotFather token and chat ID
- Works for a private chat, a group or a channel
- Same filters and event coverage as every other destination
Every kind of transfer, decoded
Watch an address as sender or receiver, narrowed by token contract and category. Every event arrives with human-readable amounts and token metadata, so you never need a second RPC call to make sense of it.
externalNative coin transfers (e.g. ETH) sent as a top-level transaction.
internalNative value moved inside a contract call, recovered from execution traces and invisible in logs.
tokenERC-20 fungible token transfers, with symbol and decimals resolved.
erc721NFT transfers, including the tokenId.
erc1155Single and batch multi-token transfers.
Not just transfers, any event your contracts emit
Address activity answers who moved value. A custom webhook answers what your contracts actually did: a governance vote cast, an oracle price posted, a pool swapped, a role granted, a position liquidated. Name the contracts, name the events, and every matching log rides the same signed, retried, reorg-aware pipeline to the same destinations.
Decode with the ABI
Paste the event fragment from your artifact or the explorer. Matching logs arrive with named, typed arguments, so your handler never touches a topic hash.
Filter on argument values
Narrow to the indexed arguments you care about by name. Values OR within an argument and AND across arguments, matched on-chain before anything is delivered.
Or match a raw topic0
Unverified contract, or no ABI to hand? Subscribe by 32-byte signature hash and receive the raw topics and data.
Or take everything
Name the contracts and no events at all, and you get every log they emit, anonymous events included. Useful while you are still mapping a protocol.
Paste the event fragment straight from your contract artifact or the explorer's ABI tab. Spectrum derives the signature hash to match on and the type layout to decode with, so every matching log arrives with named arguments.
{
"name": "Pool swaps",
"type": "CONTRACT_EVENT",
"chain": "ethereum",
"destination": {
"type": "http",
"url": "https://api.yourapp.com/hooks/swaps"
},
"filter": {
"events": [
{
"contracts": ["0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640"],
"abi": [
{
"type": "event",
"name": "Swap",
"inputs": [
{ "name": "sender", "type": "address", "indexed": true },
{ "name": "recipient", "type": "address", "indexed": true },
{ "name": "amount0", "type": "int256" },
{ "name": "amount1", "type": "int256" }
]
}
]
}
],
"include": ["transaction"]
}
}{
"id": "whevt_2f7c91ab",
"type": "CONTRACT_EVENT",
"webhookId": "wh_8ad31c04",
"event": {
"chain": "ethereum",
"blockNumber": 21874310,
"blockTimestamp": 1739452800,
"logs": [
{
"contract": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
"event": "Swap",
"txHash": "0x7c1e4b0d9a3f",
"logIndex": 42,
"args": {
"sender": "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
"recipient": "0xbdb3ba9ffe392549e1f8658dd2630c141fdf47b6",
"amount0": "-1500000000",
"amount1": "412873910284712"
},
"transaction": {
"from": "0xbdb3ba9ffe392549e1f8658dd2630c141fdf47b6",
"to": "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
"value": "0",
"gas": 184320
}
}
]
}
}Then tune what each delivery carries:
include: ["transaction"]Attach the matched log's transaction: from, to, value and gas, with no follow-up RPC call.
include: ["receipt"]Attach the outcome and what it actually cost: status, gasUsed and effectiveGasPrice.
decodedOnlyReject raw and all-event selectors at creation, so every event this webhook can match is decodable. A log that matches but fails to decode still arrives, with a decodeError.
omitRawDrop raw topics and data from entries that decoded, leaving just the named args.
Built for every on-chain trigger
One durable, signed event stream behind deposit detection, treasury monitoring, payments, alerting, and analytics.
Deposit detection
Credit users the moment funds land on your hot or deposit addresses, including internal transfers that log-only services miss.
Treasury monitoring
An audit trail of every inflow and outflow for your org wallets, with amounts already denominated in token units.
NFT activity feeds
Track mints, sales, and transfers for a collection or a set of holders in real time.
Payments and invoicing
Trigger fulfillment the instant a specific token payment hits your receiving address.
Security and alerting
Fire a Slack or PagerDuty alert when a monitored treasury or multisig moves unexpectedly.
Analytics pipelines
Stream decoded, normalized on-chain events straight into your data warehouse without running an indexer.
Ship real-time on-chain events today
Create a webhook, point it at your endpoint, and start receiving signed, decoded events. No nodes, no polling, no missed blocks.
Free tier included · No credit card required
