Skip to main content

Flexible Webhook Overview


What is Flexible Webhook?

Flexible Webhook is a webhook that lets you define your own filter conditions and receive fields. It supports 6 stream types, including blocks, token transfers, and event logs. You can set precise conditions using CEL expressions and receive only the fields you need.

Here, stream type refers to the kind of on-chain data that the webhook tracks. This is a separate concept from the Nodit Stream service, which provides real-time data over WebSocket.


Differences from Classic Webhook

Classic Webhook provides fixed conditions and payloads per Event Type. Flexible Webhook lets you freely configure conditions and received data.

Classic Webhook

Flexible Webhook

Creation Method

API or Console

Console Only

Event Definition

Select Event Type

Stream Type + CEL Condition

Filtering

Fixed conditions per Event Type

Freely configured via CEL expressions

Received Data

Fixed full payload

Field selection available

Pre-validation

Not supported

Preview, Test Webhook

Delivery History

API query

Console view and resend

Flexible Webhook is a console-only feature. Creation and management via API is not supported.


Key Features

1. Condition-Based Filtering

Define webhook trigger conditions using the filterable fields of each stream type. Supports AND/OR logic groups and offers two editing modes.

  • Visual Mode: Build conditions by selecting fields, operators, and values in a no-code UI
  • Text Mode: Directly edit CEL expressions

You can switch between both modes at any time, and changes are synchronized bidirectionally. However, if you enter an expression in Text Mode that does not conform to the expected format, you cannot switch back to Visual Mode.


2. CEL Expression Syntax

CEL (Common Expression Language) syntax available in Text Mode. Conditions can be combined using the operators below.

Comparison Operators

Operator

Description

Example

Example Description

`==`

Equal to

`receipt_status == "0x1"`

Successful transactions only

`!=`

Not equal to

`receipt_status != "0x0"`

Exclude failed transactions

`>` `<` `>=` `<=`

Numeric comparison

`transaction_count > 100`

Blocks with more than 100 transactions

String Operators

Operator

Description

Example

Example Description

`in`

Matches one of multiple values

`topics[0] in ["0xddf...", "0x8c5..."]`

Transfer or Approval event

`contains`

Contains substring

`data.contains("a9059cbb")`

data contains a specific pattern

`startsWith`

Starts with a specific string

`data.startsWith("0xa9059cbb")`

Specific function selector

Address Operators

Operator

Description

Example

Example Description

`address_eq`

Case-insensitive address comparison

`address_eq(from_address, "0xA0b8...")`

Transfers sent from a specific wallet

Large Number (bigint) Operators

Quantity fields (value, gas_used, etc.) are large integers represented as strings. Use bigint_* functions instead of standard comparison operators.

Operator

Description

Example

Example Description

`bigint_eq`

Equal to

`bigint_eq(value, "1000000")`

Exactly 1 USDC

`bigint_gt` / `bigint_gte`

Greater than / Greater than or equal to

`bigint_gt(value, "1000000000000000000")`

More than 1 ETH

`bigint_lt` / `bigint_lte`

Less than / Less than or equal to

`bigint_lt(value, "100")`

Less than 100

Array Operators

Operator

Description

Example

Example Description

`exists`

At least one element in the array satisfies the condition

`topics.exists(e, e == "0xddf...")`

A specific value exists in topics

Combination Examples

# ERC-20 Transfer
address_eq(token_address, "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48") && bigint_gt(value, "1000000000")

# Transaction Receipt
address_eq(to_address, "0x1234...") && receipt_status == "0x1"

# Log: Transfer or Approval events
topics[0] in ["0xddf252ad...", "0x8c5be1e5..."]

# Block
transaction_count > 200 && log_count > 500

Constraints

  • Maximum 2 groups, maximum 3 conditions per group
  • Conditions between groups / within groups are connected by AND or OR
  • Maximum 700 characters for the entire expression

For filterable fields, refer to the Condition column in Flexible Webhook Stream Types.


Preset Templates

Frequently used condition patterns are provided as Presets. Selecting a Preset automatically sets the conditions and output fields.

Stream Type

Preset

Block

High Gas Block

ERC-20 Transfer

Token Burn, Token burning (to zero address), Token Mint, USDC Whale Transfer, USDT Whale Transfer

ERC-721 Transfer

NFT Burn, NFT burning (to zero address), NFT Mint

ERC-1155 Transfer

Token Burn

Log

ERC20 Approval, Ownership Transferred

Transaction Receipt

Failed Transaction, High Gas Transaction, High Value Transaction

The Preset list is subject to change in the future.


Selective Output Fields

Select which fields to include in the webhook payload. By receiving only the fields you need, you can reduce payload size and use the data directly without additional parsing.

Fields used in filter conditions cannot be deselected.


Live Testing

You can use the two features below to validate your configuration with real on-chain data before creating the webhook.

Live Sample and Test Webhook use the latest data from the selected stream regardless of the filtering conditions. The data may differ from what is actually received by the Webhook.


Live Sample

Preview recent events that match the current conditions. Useful for validating whether the condition scope is appropriate.

Test Webhook

Send a test payload to the entered Webhook URL and verify the delivered data and whether it was received.


Delivery History and Resend

Select individual items from the delivery history list to resend them. (Note: retry records are not separately logged in the history.)



Learn More