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).
| Category | What it is | Notable fields |
|---|---|---|
external | A native-asset transfer from a top-level transaction (e.g. an ETH send). | asset = { symbol, decimals: 18 }, no asset.address. |
internal | A native-asset transfer from a contract-internal call frame (CALL/CREATE). Recovered from trace data. | asset = { symbol, decimals: 18 }. Opt-in subIndex, typeTraceAddress. |
token | An ERC-20 Transfer. | asset.address, plus asset.symbol/asset.decimals when known. Opt-in logIndex, log. |
erc721 | An ERC-721 (NFT) transfer. | tokenId, value always "1", asset.address, logIndex, log. |
erc1155 | An 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
}
}