Skip to content

Smart contract monitoring, no cron job to run

Get an email or webhook on the next check after a contract's state crosses a line. No server, no state file, no script that dies silently.

A monitor condition

Ethereum
token.balanceOf(wallet) < parseUnits("1000", 6)

Free plan: 3 monitors, checks every 15 minutes.

Every contract alert starts as a cron script.

It works on the day you write it. The upkeep is what costs you.

  • A server to run it on

    Something has to wake up every few minutes, call an RPC and decide. That means a box, a container or a CI schedule you now own.

  • A state file for the last value

    "Tell me when it changes" needs memory. You store the previous value, compare, then write it back without losing it on a crash.

  • The same alert every run

    Without dedupe, a balance that stays low pages you at every tick. Add a cooldown and you start tuning noise instead of watching contracts.

  • It dies without telling you

    An expired RPC key or a redeploy that drops the job produces no error and no alert. The first sign is the incident you wanted to catch.

State checks that run on our side.

A monitor is an expression that evmquery evaluates on an interval. You choose the line it must not cross and where the smart contract alerts go.

  1. A server to run it on

    Hosted checks, nothing to deploy

    Create a monitor in the web app, over REST or from Claude or Cursor through MCP. evmquery runs the check on your interval and reads live chain state each time.

    token.balanceOf(wallet) < parseUnits("1000", 6)
  2. A state file for the last value

    Condition and change triggers

    A condition trigger fires when a true or false expression turns true. A change trigger remembers the last value for you and fires when it moves, in either direction or only up or down, past a percentage or an absolute amount.

    token.totalSupply()
  3. The same alert every run

    One alert per crossing

    A condition stays quiet while it remains true. Alerts go out by email or to an HTTPS webhook. Delivery is at least once and retried with backoff, so dedupe on the event id.

  4. It dies without telling you

    It pauses itself and says so

    If a monitor keeps failing, for example after a contract upgrade changes what the expression returns, it pauses automatically and sends a paused alert to the same channels.

What it does not do. Monitors poll contract state. There are no event or log triggers and no mempool watching, and this is not exploit detection. Alerts go out by email and HTTPS webhook only.

An expression, a trigger, a channel.

That is the whole monitor. evmquery runs the checks, decides when one counts and delivers the alert.

  1. Checked on your schedule

    One expression reads live contract state. evmquery evaluates it on your interval, as often as every 15 minutes on the free plan and up to once a day, against fresh chain state each time.

  2. Alerts once, not every check

    A condition alerts when the expression turns true and stays quiet while it remains true. A change trigger keeps a baseline for you, alerts when the value moves past your threshold from it, then makes the new value the baseline.

  3. Delivered where you work

    Each alert goes to the channels you pick: an email to a member of your organization, or a JSON POST to an HTTPS URL. Up to five channels per monitor, retried with backoff when one is down.

  4. Keeps watching itself

    A temporary problem such as an RPC timeout is retried on schedule. If checks keep failing, the monitor pauses itself and sends a paused alert to the same channels. A failing channel backs off on its own and never pauses the monitor.

Monitors worth creating first.

  • Hot wallet running out of gas

    Condition

    Read the guide
    wallet.balance() < parseUnits("0.05", 18)
  • Aave position near liquidation

    Condition

    Read the guide
    pool.getUserAccountData(user).healthFactor < parseUnits("1.25", 18)
  • Safe signing threshold changed

    Change, any direction

    Read the guide
    safe.getThreshold()
  • Token paused by its admin

    Condition

    Read the guide
    usdc.paused()

Create your first monitor, step by step.

From a free account to your first alert in four steps.

  1. 1. Create a free account

    The free plan includes 3 active monitors checked every 15 minutes. Open Monitors in the app and click New monitor.

  2. 2. Start from a template or a prompt

    Pick a template such as a balance falling below an amount, a value moving by a percentage or an NFT changing hands. Or ask Claude or Cursor to create the monitor through MCP.

  3. 3. Write the condition

    Pick the chain, name the contract and write the expression. The form previews the current value and what a notification would do.

    token.balanceOf(wallet) < parseUnits("1000", 6)
  4. 4. Choose email or a webhook

    Send alerts to a member of your organization by email, or to an HTTPS URL that receives JSON. Add up to five channels per monitor.

Frequently asked questions

Ethereum, Base, BNB Chain and Polygon. Each monitor watches one chain.

As often as every 15 minutes on the free plan, and up to once a day.

The free plan includes 3 active monitors. Monitor checks do not consume query units. Paid plans raise the limits, see the pricing page.

A temporary problem such as an RPC timeout is retried on schedule. If checks keep failing, the monitor pauses itself and sends a paused alert to its channels. Fix the expression, then resume it.

A JSON POST with a version, a text summary, the monitor id, name and chain, and a list of events. Each event has an id, a type of triggered or paused, a time and a summary. Delivery is at least once, so deduplicate on the event id.

Yes. The MCP server has tools to create, list, inspect, pause, resume and delete monitors, so an agent can set one up from a prompt. You can also use the REST API or the web app.

No. A monitor reads current contract state on an interval. Watch the state an event changes, such as a balance, a threshold or a paused flag, and the monitor catches it on the next check.

Tenderly covers events and transactions across many channels. OpenZeppelin retired hosted Defender on 1 July 2026. evmquery monitors focus on state conditions and changes, with self-serve signup and a free plan.

Create your first monitor in minutes.

Free plan, no credit card. Three monitors, checked every 15 minutes.

Free plan included · No credit card