Spectrum Nodes
Push, don't poll

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.

POST /webhooks/spectrum200 OK
{
"type": "ADDRESS_ACTIVITY",
"category": "token",
"value": "1000",
"asset": { "symbol": "USDC" },
"blockNumber": 19000000,
"removed": false
}
HMAC ✓X-Spectrum-Signature: t=…,v1=…

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

HMAC

Spectrum

Decode & sign

Your endpoint

Verify & 2xx

  1. 1

    Ingest and decode

    We subscribe to the chain and decode every block: native, internal, and token transfers.

  2. 2

    Match your filters

    Each event is matched against your webhook's addresses, token, and category filters.

  3. 3

    Sign and batch

    Matching events are batched by block, signed with your secret, and ordered deterministically.

  4. 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.

external

Native coin transfers (e.g. ETH) sent as a top-level transaction.

internal

Native value moved inside a contract call, recovered from execution traces and invisible in logs.

token

ERC-20 fungible token transfers, with symbol and decimals resolved.

erc721

NFT transfers, including the tokenId.

erc1155

Single and batch multi-token transfers.

Custom webhooks

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.

POST /v1/webhooks
{
  "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"]
  }
}
Delivered to your endpoint
{
  "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.

decodedOnly

Reject 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.

omitRaw

Drop 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.

Start delivering

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