Skip to Content
WebhooksActivity Categories

Activity Categories

Every webhook has a type that determines what it watches. Spectrum currently offers one type, Address Activity (ADDRESS_ACTIVITY), which delivers the native, token, and NFT transfers a watched address takes part in on Ethereum and Polygon. Each delivered event carries a category describing the kind of transfer.

Address Activity

Type value: ADDRESS_ACTIVITY

An Address Activity webhook watches a set of addresses on a single chain. Whenever one of those addresses is the from or to side of decoded on-chain activity, that activity is delivered to your URL.

A single delivery can contain several events, since Spectrum groups every matching event from one block into one POST. See Delivery & Retries for the payload shape.

type is set at creation and is immutable. You cannot change a webhook’s type later; create a new webhook if you need a different one.

The categories

By default a webhook delivers all categories. You choose which ones you want when you create the webhook (the Activity & tokens step).

CategoryWhat it isNotable fields
externalA native-asset transfer from a top-level transaction (e.g. an ETH send).asset = { symbol, decimals: 18 }, no asset.address.
internalA native-asset transfer from a contract-internal call frame (CALL/CREATE). Recovered from trace data.asset = { symbol, decimals: 18 }. Opt-in subIndex, typeTraceAddress.
tokenAn ERC-20 Transfer.asset.address, plus asset.symbol/asset.decimals when known. Opt-in logIndex, log.
erc721An ERC-721 (NFT) transfer.tokenId, value always "1", asset.address, logIndex, log.
erc1155An ERC-1155 transfer. Batch transfers fan out to one event per (id, value) pair.tokenId, logIndex, subIndex (batch position), asset.address, log.

Filter value vs. delivered value for ERC-20. In filter.categories you request ERC-20 activity with the value erc20. In the delivered payload, those events arrive with category: "token". The five filter values are external, internal, erc20, erc721, erc1155.

Example payloads

Each example below is one entry from the delivery’s event.activity[] array. The surrounding envelope (id, webhookId, event.blockHash, and so on) is the same for every category, see the delivery payload.

Fields appear in this order: category, fromAddress, toAddress, hash, txIndex, then any of logIndex / subIndex / tokenId, then value, rawValue, asset, and finally typeTraceAddress / log.

Optional fields. token events can additionally carry logIndex and log; internal events can additionally carry subIndex and typeTraceAddress. Both minimal and expanded shapes are shown below. external has no optional fields, and erc721 / erc1155 always deliver their full shape.

External (native transfer)

A top-level transaction moving the chain’s native asset. No optional fields.

{ "category": "external", "fromAddress": "0x28c6c06298d514db089934071355e5743bf21d60", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 12, "value": "1.5", "rawValue": "1500000000000000000", "asset": { "symbol": "ETH", "decimals": 18 } }

Internal (native, from a call frame)

A value-bearing internal call. asset is the native asset, like external.

Minimal:

{ "category": "internal", "fromAddress": "0x1111111254eeb25477b68fb85ed929f73a960582", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 12, "value": "0.25", "rawValue": "250000000000000000", "asset": { "symbol": "ETH", "decimals": 18 } }

With optional fields (subIndex, typeTraceAddress):

{ "category": "internal", "fromAddress": "0x1111111254eeb25477b68fb85ed929f73a960582", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 12, "subIndex": 3, "value": "0.25", "rawValue": "250000000000000000", "asset": { "symbol": "ETH", "decimals": 18 }, "typeTraceAddress": "call_3" }

Token (ERC-20)

An ERC-20 Transfer. asset carries the token address, plus symbol/decimals once metadata resolves (value is null until then).

Minimal:

{ "category": "token", "fromAddress": "0x28c6c06298d514db089934071355e5743bf21d60", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 12, "value": "1", "rawValue": "1000000", "asset": { "symbol": "USDC", "decimals": 6, "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" } }

With optional fields (logIndex, log):

{ "category": "token", "fromAddress": "0x28c6c06298d514db089934071355e5743bf21d60", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 12, "logIndex": 34, "value": "1", "rawValue": "1000000", "asset": { "symbol": "USDC", "decimals": 6, "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" }, "log": { "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x00000000000000000000000028c6c06298d514db089934071355e5743bf21d60", "0x000000000000000000000000787b8840100d9baadd7463f4a73b5ba73b00c6ca" ], "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", "logIndex": 34, "removed": false, "transactionHash": "0x...", "transactionIndex": 12, "blockHash": "0x...", "blockNumber": 19000000 } }

ERC-721 (NFT)

Always full. value is always "1", tokenId identifies the NFT, and the source log is always included. asset has no decimals.

{ "category": "erc721", "fromAddress": "0x0000000000000000000000000000000000000000", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 5, "logIndex": 8, "tokenId": "4213", "value": "1", "rawValue": "1", "asset": { "symbol": "BAYC", "address": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d" }, "log": { "address": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000787b8840100d9baadd7463f4a73b5ba73b00c6ca", "0x0000000000000000000000000000000000000000000000000000000000001075" ], "data": "0x", "logIndex": 8, "removed": false, "transactionHash": "0x...", "transactionIndex": 5, "blockHash": "0x...", "blockNumber": 19000000 } }

ERC-1155 (multi-token)

Always full. subIndex is the position within a batch (0 for a single transfer), value is the transferred amount, and the source log is always included.

{ "category": "erc1155", "fromAddress": "0x28c6c06298d514db089934071355e5743bf21d60", "toAddress": "0x787b8840100d9baadd7463f4a73b5ba73b00c6ca", "hash": "0x...", "txIndex": 7, "logIndex": 15, "subIndex": 0, "tokenId": "1", "value": "5", "rawValue": "5", "asset": { "address": "0x495f947276749ce646f68ac8c248420045cb7b5e" }, "log": { "address": "0x495f947276749ce646f68ac8c248420045cb7b5e", "topics": [ "0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62", "0x00000000000000000000000028c6c06298d514db089934071355e5743bf21d60", "0x00000000000000000000000028c6c06298d514db089934071355e5743bf21d60", "0x000000000000000000000000787b8840100d9baadd7463f4a73b5ba73b00c6ca" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005", "logIndex": 15, "removed": false, "transactionHash": "0x...", "transactionIndex": 7, "blockHash": "0x...", "blockNumber": 19000000 } }