> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Using Alerts API

> Configure simple and compound alerting rules programmatically with the Tenderly Alerts API, covering each expression type and multi-condition combinations.

This guide covers setting up both simple and complex alerting rules using Tenderly's API. We'll explore each expression type and then combine them into sophisticated monitoring solutions.

<Card title="Alerting API reference" href="/api-reference" />

## Introduction

Tenderly's Alert API allows you to create simple and complex Alerts.
A simple alert consists of one rule, for example `method_call` will get triggered when a transaction invokes your public or external method. A complex alert can have several conditions, and will get triggered when all of them are met. For example, an alert with `method_call` and `state_change` will trigger when a transaction calls the given method and updates the specified storage slot.

When defining an Alert using the API, you need to specify the following:

* **delivery channels** that get notified when alerting rule is triggered. See more about [Delivery Channels](/api-reference).
* **expressions** array that will trigger the alert when all conditions represented by individual expressions are met.

<Note>
  You can create delivery channels only via Dashboard, but you can fetch them using the [API](/api-reference).
</Note>

## Authentication

Before creating alerts, you'll need to set up authentication and identify your project:

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const TENDERLY_API_KEY = 'your_api_key';
    const PROJECT_SLUG = 'your_project_slug';
    const ACCOUNT_ID = 'me';  // Use 'me' or your specific account ID

    // Base configuration for axios
    const baseConfig = {
      baseURL: 'https://api.tenderly.co/api/v1',
      headers: {
        'X-Access-Key': TENDERLY_API_KEY,
        'Content-Type': 'application/json'
      }
    };
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    export TENDERLY_API_KEY="your_api_key"
    export PROJECT_SLUG="your_project_slug"
    export ACCOUNT_ID="me"  # Use 'me' or your specific account ID
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    import requests

    TENDERLY_API_KEY = 'your_api_key'
    PROJECT_SLUG = 'your_project_slug'
    ACCOUNT_ID = 'me'  # Use 'me' or your specific account ID

    # Base configuration for requests
    base_url = 'https://api.tenderly.co/api/v1'
    headers = {
        'X-Access-Key': TENDERLY_API_KEY,
        'Content-Type': 'application/json'
    }
    ```
  </Tab>
</Tabs>

## Expression Types

You can use different expression types for specifying Alerts' trigger rules.

| Expression Type                | Monitoring                                                                   | Main Use Case                             | Required Arguments                                                                                                           | Optional Arguments                                                                            |
| ------------------------------ | ---------------------------------------------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `method_call`                  | Specific function calls in contracts (direct or internal transactions apply) | Track when important functions are called | - `line_number`: Line where function is defined; `call_position`: Position of call ("first", "last", "any")                  | None                                                                                          |
| `whitelisted_caller_addresses` | For calls from specific addresses                                            | Allow-list based access control           | - `addresses`: Array of Ethereum addresses                                                                                   | None                                                                                          |
| `blacklisted_caller_addresses` | For calls from blocked addresses                                             | Block-list based access control           | - `addresses`: Array of Ethereum addresses                                                                                   | None                                                                                          |
| `contract_address`             | Specific contract interactions                                               | Track all interactions with a contract    | - `address`: Contract address                                                                                                | - `transaction_type`: "direct", "source", or "internal"                                       |
| `network`                      | Events on specific networks                                                  | Multi-chain monitoring                    | - `network_id`: Network/chain ID                                                                                             | None                                                                                          |
| `tag`                          | Contracts with specific tags                                                 | Group-based monitoring                    | - `tag`: Tag string                                                                                                          | - `transaction_type`: "direct", "source", or "internal"                                       |
| `tx_status`                    | Transaction success/failure                                                  | Track failed transactions                 | None                                                                                                                         | - `transaction_success`: boolean                                                              |
| `function_params`              | Function parameter values                                                    | Track specific function inputs            | - `address`: Contract address; `function_line_number`: Function definition line; `parameter_conditions`: Array of conditions | - Parameter specific options                                                                  |
| `tx_value`                     | Transaction value                                                            | Track large transfers                     | - `transaction_value`: Amount in wei; `operator`: Comparison operator                                                        | None                                                                                          |
| `emitted_log`                  | Contract events                                                              | Track specific events                     | - `address`: Contract address; `event_name`: Event name; `event_id`: Event signature                                         | - `match_any`: boolean; `decode_events`: boolean; `parameter_conditions`: Array of conditions |
| `state_change`                 | Contract state changes                                                       | Track storage changes                     | - `address`: Contract address; `parameter_conditions`: Array of conditions                                                   | - Comparison options (threshold, percentage)                                                  |
| `view_function`                | Read-only function results                                                   | Track computed values                     | - `address`: Contract address; `input`: ABI encoded function data; `network_id`: Network ID                                  | - `parameter_condition`: Value comparison                                                     |
| `eth_balance`                  | ETH balance changes                                                          | Track balance thresholds                  | - `address`: Contract address; `threshold`: Balance in wei; `operator`: Comparison operator                                  | None                                                                                          |
| `erc20_transfer_matcher`       | ERC20 transfer consistency                                                   | Validate transfer mechanics               | - `address`: Token address; `log_name`: Event name; `balances`: State variable name                                          | None                                                                                          |
| `tx_error`                     | For transaction errors                                                       | Track unexpected failures                 | None                                                                                                                         | - `addresses_to_ignore`: Array of addresses                                                   |
| `tx_internal_error`            | For internal tx errors                                                       | Track internal call failures              | None                                                                                                                         | - `addresses_to_match`: Array of addresses                                                    |
| `no_action`                    | For inactivity                                                               | Track contract dormancy                   | - `check_after_seconds`: Time threshold                                                                                      | - `no_log`: Log conditions; `no_transaction`: Transaction conditions                          |
| `sandwich_transaction`         | For sandwich attacks                                                         | Track MEV activity                        | - `address`: Contract address                                                                                                | - `transaction_type`: "direct", "source", or "internal"                                       |

### Notes

* For comparison operators (`operator`), valid values are: `>`, `>=`, `<`, `<=`, `==`, `!=`, `contains`, `notContains`
* Parameter types (`parameter_type`) include: `uint`, `int`, `bool`, `address`, `string`, `byte`
* All addresses must be valid Ethereum addresses (`0x` prefixed, 40 hex chars)
* Wei values should be passed as strings to handle large numbers
* Network IDs should match the target blockchain (e.g., "1" for Ethereum mainnet)

For more details, explore the [Alerting API reference](/api-reference).

## Simple expressions examples

Explore examples of setting up simple expression rules.

### 1. Method Call Monitoring

**Use Case**: Monitor specific function calls in your smart contract.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const methodCallAlert = {
      name: "Critical Function Call Alert",
      description: "Monitors calls to critical functions",
      enabled: true,
      expressions: [{
        type: "method_call",
        expression: {
          line_number: 123, // Line where function is defined
          call_position: "any" // "first", "last", or "any"
        }
      },
      {
          "type": "contract_address",
          "expression": {
              "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
          }
      }
      ],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      methodCallAlert,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "Critical Function Call Alert",
      "description": "Monitors calls to critical functions",
      "enabled": true,
      "expressions": [
        {
        "type": "method_call",
          "expression": {
            "line_number": 123,
            "call_position": "any"
          }
        },
        {
          "type": "contract_address",
          "expression": {
              "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
          }
        }
      ],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    method_call_alert = {
        "name": "Critical Function Call Alert",
        "description": "Monitors calls to critical functions",
        "enabled": True,
        "expressions": [{
            "type": "method_call",
            "expression": {
                "line_number": 123,
                "call_position": "any"
            }
        },
         {
              "type": "contract_address",
              "expression": {
                  "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
              }
            }],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=method_call_alert
    )
    ```
  </Tab>
</Tabs>

### 2. State Change Monitoring

**Use Case**: Monitor changes in contract state variables, especially useful for tracking critical parameters like paused state or balance thresholds.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const stateChangeAlert = {
      name: "Critical State Change Alert",
      description: "Monitors important state changes",
      enabled: true,
      expressions: [{
        type: "state_change",
        expression: {
          address: "0x1234....",
          parameter_conditions: [
            {
              parameter_name: "pause",
              parameter_type: "bool",
              compare_change: true
            },
            {
              parameter_name: "totalSupply",
              parameter_type: "uint",
              compare_percentage: true,
              comparison_value: "5",
              operator: ">="
            }
          ]
        }
      }],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      stateChangeAlert,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "Critical State Change Alert",
      "description": "Monitors important state changes",
      "enabled": true,
      "expressions": [{
        "type": "state_change",
        "expression": {
          "address": "0x1234....",
          "parameter_conditions": [
            {
              "parameter_name": "pause",
              "parameter_type": "bool",
              "compare_change": true
            },
            {
              "parameter_name": "totalSupply",
              "parameter_type": "uint",
              "compare_percentage": true,
              "comparison_value": "5",
              "operator": ">="
            }
          ]
        }
      }],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    state_change_alert = {
        "name": "Critical State Change Alert",
        "description": "Monitors important state changes",
        "enabled": True,
        "expressions": [{
            "type": "state_change",
            "expression": {
                "address": "0x1234....",
                "parameter_conditions": [
                    {
                        "parameter_name": "pause",
                        "parameter_type": "bool",
                        "compare_change": True
                    },
                    {
                        "parameter_name": "totalSupply",
                        "parameter_type": "uint",
                        "compare_percentage": True,
                        "comparison_value": "5",
                        "operator": ">="
                    }
                ]
            }
        }],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=state_change_alert
    )
    ```
  </Tab>
</Tabs>

### 3. Event Monitoring

**Use Case**: Monitor specific events emitted by your contracts, with parameter filtering.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const eventAlert = {
      name: "Large Transfer Event Alert",
      description: "Monitors large transfer events",
      enabled: true,
      expressions: [{
        type: "emitted_log",
        expression: {
          address: "0x1234....",
          event_name: "Transfer",
          event_id: "0x241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80",
          parameter_conditions: [
            {
              parameter_name: "amount",
              parameter_type: "uint",
              operator: ">=",
              comparison_value: "1000000000000000000" // 1 ETH
            }
          ],
          decode_events: true
        }
      }],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      eventAlert,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "Large Transfer Event Alert",
      "description": "Monitors large transfer events",
      "enabled": true,
      "expressions": [{
        "type": "emitted_log",
        "expression": {
          "address": "0x1234....",
          "event_name": "Transfer",
          "event_id": "0x241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80",
          "parameter_conditions": [
            {
              "parameter_name": "amount",
              "parameter_type": "uint",
              "operator": ">=",
              "comparison_value": "1000000000000000000"
            }
          ],
          "decode_events": true
        }
      }],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    event_alert = {
        "name": "Large Transfer Event Alert",
        "description": "Monitors large transfer events",
        "enabled": True,
        "expressions": [{
            "type": "emitted_log",
            "expression": {
                "address": "0x1234....",
                "event_name": "Transfer",
                "event_id": "0x241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80",
                "parameter_conditions": [
                    {
                        "parameter_name": "amount",
                        "parameter_type": "uint",
                        "operator": ">=",
                        "comparison_value": "1000000000000000000"
                    }
                ],
                "decode_events": True
            }
        }],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=event_alert
    )
    ```
  </Tab>
</Tabs>

### 4. Native ETH Balance Monitoring

**Use Case**: Alert when an address's native ETH balance falls below a threshold, for example a relayer or operations wallet that must stay funded. Scope the alert to a network and an address, then compare the native balance against the threshold (in wei).

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const balanceAlert = {
      name: "Low ETH balance alert",
      description: "Alerts when the native ETH balance falls below 0.1 ETH",
      enabled: true,
      expressions: [
        // Scope to a specific network
        {
          type: "network",
          expression: {
            network_id: "1" // Ethereum mainnet
          }
        },
        // Scope to the watched address
        {
          type: "contract_address",
          expression: {
            address: "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b"
          }
        },
        // Trigger when the native balance drops below the threshold
        {
          type: "eth_balance",
          expression: {
            address: "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b",
            threshold: "100000000000000000", // 0.1 ETH in wei
            operator: "<"
          }
        }
      ],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      balanceAlert,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "Low ETH balance alert",
      "description": "Alerts when the native ETH balance falls below 0.1 ETH",
      "enabled": true,
      "expressions": [
        {
          "type": "network",
          "expression": {
            "network_id": "1"
          }
        },
        {
          "type": "contract_address",
          "expression": {
            "address": "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b"
          }
        },
        {
          "type": "eth_balance",
          "expression": {
            "address": "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b",
            "threshold": "100000000000000000",
            "operator": "<"
          }
        }
      ],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    balance_alert = {
        "name": "Low ETH balance alert",
        "description": "Alerts when the native ETH balance falls below 0.1 ETH",
        "enabled": True,
        "expressions": [
            {
                "type": "network",
                "expression": {
                    "network_id": "1"
                }
            },
            {
                "type": "contract_address",
                "expression": {
                    "address": "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b"
                }
            },
            {
                "type": "eth_balance",
                "expression": {
                    "address": "0x3b8c2f1a9d7e4605c8a1b2d3e4f5061728394a5b",
                    "threshold": "100000000000000000",
                    "operator": "<"
                }
            }
        ],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=balance_alert
    )
    ```
  </Tab>
</Tabs>

## Complex Alert Examples

Explore examples of showing complex expression rules. The alert will get triggered when every expression in the `expressions` array is satisfied.

### 1. Security Monitoring System

**Use Case**: Comprehensive security monitoring combining multiple conditions:

* Monitor admin function calls
* Track large value transfers
* Watch for blacklisted addresses
* Alert on state changes to critical parameters

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const securityAlert = {
      name: "Security Monitoring System",
      description: "Comprehensive security monitoring for contract",
      enabled: true,
      expressions: [
        {
          "type": "contract_address",
          "expression": {
              "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
          }
        },
        // Admin function monitoring
        {
          type: "method_call",
          expression: {
            line_number: 123,
            call_position: "any"
          }
        },
        // Blacklist checking
        {
          type: "blacklisted_caller_addresses",
          expression: {
            addresses: [
              "0xblacklisted1...",
              "0xblacklisted2..."
            ]
          }
        },
        // Large value transfers
        {
          type: "tx_value",
          expression: {
            transaction_value: "100000000000000000000", // 100 ETH
            operator: ">"
          }
        },
        // Critical state changes
        {
          type: "state_change",
          expression: {
            address: "0x1234....",
            parameter_conditions: [
              {
                parameter_name: "pause",
                parameter_type: "bool",
                compare_change: true
              },
              {
                parameter_name: "owner",
                parameter_type: "address",
                compare_change: true
              }
            ]
          }
        }
      ],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      securityAlert,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "Security Monitoring System",
      "description": "Comprehensive security monitoring for contract",
      "enabled": true,
      "expressions": [
       {
          "type": "contract_address",
          "expression": {
              "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
          }
        },
        {
          "type": "method_call",
          "expression": {
            "line_number": 123,
            "call_position": "any"
          }
        },
        {
          "type": "blacklisted_caller_addresses",
          "expression": {
            "addresses": [
              "0xblacklisted1...",
              "0xblacklisted2..."
            ]
          }
        },
        {
          "type": "tx_value",
          "expression": {
            "transaction_value": "100000000000000000000",
            "operator": ">"
          }
        },
        {
          "type": "state_change",
          "expression": {
            "address": "0x1234....",
            "parameter_conditions": [
              {
                "parameter_name": "pause",
                "parameter_type": "bool",
                "compare_change": true
              },
              {
                "parameter_name": "owner",
                "parameter_type": "address",
                "compare_change": true
              }
            ]
          }
        }
      ],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    security_alert = {
        "name": "Security Monitoring System",
        "description": "Comprehensive security monitoring for contract",
        "enabled": True,
        "expressions": [
         {
            "type": "contract_address",
            "expression": {
                "address": "0xe592427a0aece92de3edee1f18e0157c05861564"
            }
          },
            {
                "type": "method_call",
                "expression": {
                    "line_number": 123,
                    "call_position": "any"
                }
            },
            {
                "type": "blacklisted_caller_addresses",
                "expression": {
                    "addresses": [
                        "0xblacklisted1...",
                        "0xblacklisted2..."
                    ]
                }
            },
            {
                "type": "tx_value",
                "expression": {
                    "transaction_value": "100000000000000000000",
                    "operator": ">"
                }
            },
            {
                "type": "state_change",
                "expression": {
                    "address": "0x1234....",
                    "parameter_conditions": [
                        {
                            "parameter_name": "pause",
                            "parameter_type": "bool",
                            "compare_change": True
                        },
                        {
                            "parameter_name": "owner",
                            "parameter_type": "address",
                            "compare_change": True
                        }
                    ]
                }
            }
        ],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=security_alert
    )
    ```
  </Tab>
</Tabs>

### 2. DeFi Protocol Monitor

**Use Case**: Monitor a DeFi protocol for:

* Large trades/swaps
* Significant price impacts
* Liquidity changes
* Failed transactions
* Sandwich attacks

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const defiMonitor = {
      name: "DeFi Protocol Monitor",
      description: "Comprehensive DeFi protocol monitoring system",
      enabled: true,
      expressions: [
        // Monitor large swaps via events
        {
          type: "emitted_log",
          expression: {
            address: "0xpool_address",
            event_name: "Swap",
            event_id: "0x...", // Swap event signature
            parameter_conditions: [
              {
                parameter_name: "amountOut",
                parameter_type: "uint",
                operator: ">=",
                comparison_value: "1000000000000000000000" // 1000 tokens
              }
            ],
            decode_events: true
          }
        },
        // Monitor liquidity changes
        {
          type: "state_change",
          expression: {
            address: "0xpool_address",
            parameter_conditions: [
              {
                parameter_name: "reserve0",
                parameter_type: "uint",
                compare_percentage: true,
                comparison_value: "10",
                operator: ">="
              },
              {
                parameter_name: "reserve1",
                parameter_type: "uint",
                compare_percentage: true,
                comparison_value: "10",
                operator: ">="
              }
            ]
          }
        },
        // Monitor for sandwich attacks
        {
          type: "sandwich_transaction",
          expression: {
            address: "0xpool_address",
            transaction_type: "direct"
          }
        },
        // Monitor failed transactions
        {
          type: "tx_error",
          expression: {
            addresses_to_ignore: [] // Monitor all addresses
          }
        }
      ],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      defiMonitor,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "DeFi Protocol Monitor",
      "description": "Comprehensive DeFi protocol monitoring system",
      "enabled": true,
      "expressions": [
        {
          "type": "emitted_log",
          "expression": {
            "address": "0xpool_address",
            "event_name": "Swap",
            "event_id": "0x...",
            "parameter_conditions": [
              {
                "parameter_name": "amountOut",
                "parameter_type": "uint",
                "operator": ">=",
                "comparison_value": "1000000000000000000000"
              }
            ],
            "decode_events": true
          }
        },
        {
          "type": "state_change",
          "expression": {
            "address": "0xpool_address",
            "parameter_conditions": [
              {
                "parameter_name": "reserve0",
                "parameter_type": "uint",
                "compare_percentage": true,
                "comparison_value": "10",
                "operator": ">="
              },
              {
                "parameter_name": "reserve1",
                "parameter_type": "uint",
                "compare_percentage": true,
                "comparison_value": "10",
                "operator": ">="
              }
            ]
          }
        },
        {
          "type": "sandwich_transaction",
          "expression": {
            "address": "0xpool_address",
            "transaction_type": "direct"
          }
        },
        {
          "type": "tx_error",
          "expression": {
            "addresses_to_ignore": []
          }
        }
      ],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    defi_monitor = {
        "name": "DeFi Protocol Monitor",
        "description": "Comprehensive DeFi protocol monitoring system",
        "enabled": True,
        "expressions": [
            {
                "type": "emitted_log",
                "expression": {
                    "address": "0xpool_address",
                    "event_name": "Swap",
                    "event_id": "0x...",
                    "parameter_conditions": [
                        {
                            "parameter_name": "amountOut",
                            "parameter_type": "uint",
                            "operator": ">=",
                            "comparison_value": "1000000000000000000000"
                        }
                    ],
                    "decode_events": True
                }
            },
            {
                "type": "state_change",
                "expression": {
                    "address": "0xpool_address",
                    "parameter_conditions": [
                        {
                            "parameter_name": "reserve0",
                            "parameter_type": "uint",
                            "compare_percentage": True,
                            "comparison_value": "10",
                            "operator": ">="
                        },
                        {
                            "parameter_name": "reserve1",
                            "parameter_type": "uint",
                            "compare_percentage": True,
                            "comparison_value": "10",
                            "operator": ">="
                        }
                    ]
                }
            },
            {
                "type": "sandwich_transaction",
                "expression": {
                    "address": "0xpool_address",
                    "transaction_type": "direct"
                }
            },
            {
                "type": "tx_error",
                "expression": {
                    "addresses_to_ignore": []
                }
            }
        ],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=defi_monitor
    )
    ```
  </Tab>
</Tabs>

### 3. ERC20 Token Monitor with Inactivity Alerts

**Use Case**: Comprehensive token monitoring including:

* Transfer monitoring
* Balance checks
* State consistency checks
* Inactivity monitoring

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    const tokenMonitor = {
      name: "ERC20 Token Monitor",
      description: "Comprehensive ERC20 token monitoring with inactivity alerts",
      enabled: true,
      expressions: [
        // Monitor Transfer event consistency
        {
          type: "erc20_transfer_matcher",
          expression: {
            address: "0xtoken_address",
            log_name: "Transfer",
            balances: "balances"
          }
        },
        // Monitor large transfers
        {
          type: "emitted_log",
          expression: {
            address: "0xtoken_address",
            event_name: "Transfer",
            event_id: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
            parameter_conditions: [
              {
                parameter_name: "value",
                parameter_type: "uint",
                operator: ">=",
                comparison_value: "1000000000000000000000" // 1000 tokens
              }
            ]
          }
        },
        // Monitor total supply changes
        {
          type: "state_change",
          expression: {
            address: "0xtoken_address",
            parameter_conditions: [
              {
                parameter_name: "totalSupply",
                parameter_type: "uint",
                compare_percentage: true,
                comparison_value: "1",
                operator: ">="
              }
            ]
          }
        },
        // Monitor for inactivity
        {
          type: "no_action",
          expression: {
            no_log: {
              address: "0xtoken_address",
              event_name: "Transfer",
              event_id: "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
            },
            check_after_seconds: 86400 // 24 hours
          }
        }
      ],
      delivery_channels: [{
        id: "your_channel_id",
        enabled: true
      }]
    };

    await axios.post(
      `/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert`,
      tokenMonitor,
      baseConfig
    );
    ```
  </Tab>

  <Tab title="Shell">
    ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl -X POST "https://api.tenderly.co/api/v1/account/${ACCOUNT_ID}/project/${PROJECT_SLUG}/alert" \
    --header "Content-Type: application/json" \
    --header "X-Access-Key: ${TENDERLY_API_KEY}" \
    --data-raw '{
      "name": "ERC20 Token Monitor",
      "description": "Comprehensive ERC20 token monitoring with inactivity alerts",
      "enabled": true,
      "expressions": [
        {
          "type": "erc20_transfer_matcher",
          "expression": {
            "address": "0xtoken_address",
            "log_name": "Transfer",
            "balances": "balances"
          }
        },
        {
          "type": "emitted_log",
          "expression": {
            "address": "0xtoken_address",
            "event_name": "Transfer",
            "event_id": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
            "parameter_conditions": [
              {
                "parameter_name": "value",
                "parameter_type": "uint",
                "operator": ">=",
                "comparison_value": "1000000000000000000000"
              }
            ]
          }
        },
        {
          "type": "state_change",
          "expression": {
            "address": "0xtoken_address",
            "parameter_conditions": [
              {
                "parameter_name": "totalSupply",
                "parameter_type": "uint",
                "compare_percentage": true,
                "comparison_value": "1",
                "operator": ">="
              }
            ]
          }
        },
        {
          "type": "no_action",
          "expression": {
            "no_log": {
              "address": "0xtoken_address",
              "event_name": "Transfer",
              "event_id": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
            },
            "check_after_seconds": 86400
          }
        }
      ],
      "delivery_channels": [{
        "id": "your_channel_id",
        "enabled": true
      }]
    }'
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    token_monitor = {
        "name": "ERC20 Token Monitor",
        "description": "Comprehensive ERC20 token monitoring with inactivity alerts",
        "enabled": True,
        "expressions": [
            {
                "type": "erc20_transfer_matcher",
                "expression": {
                    "address": "0xtoken_address",
                    "log_name": "Transfer",
                    "balances": "balances"
                }
            },
            {
                "type": "emitted_log",
                "expression": {
                    "address": "0xtoken_address",
                    "event_name": "Transfer",
                    "event_id": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "parameter_conditions": [
                        {
                            "parameter_name": "value",
                            "parameter_type": "uint",
                            "operator": ">=",
                            "comparison_value": "1000000000000000000000"
                        }
                    ]
                }
            },
            {
                "type": "state_change",
                "expression": {
                    "address": "0xtoken_address",
                    "parameter_conditions": [
                        {
                            "parameter_name": "totalSupply",
                            "parameter_type": "uint",
                            "compare_percentage": True,
                            "comparison_value": "1",
                            "operator": ">="
                        }
                    ]
                }
            },
            {
                "type": "no_action",
                "expression": {
                    "no_log": {
                        "address": "0xtoken_address",
                        "event_name": "Transfer",
                        "event_id": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
                    },
                    "check_after_seconds": 86400
                }
            }
        ],
        "delivery_channels": [{
            "id": "your_channel_id",
            "enabled": True
        }]
    }

    response = requests.post(
        f"{base_url}/account/{ACCOUNT_ID}/project/{PROJECT_SLUG}/alert",
        headers=headers,
        json=token_monitor
    )
    ```
  </Tab>
</Tabs>
