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
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.
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)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()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.
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.
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.
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.
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.
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.
wallet.balance() < parseUnits("0.05", 18)pool.getUserAccountData(user).healthFactor < parseUnits("1.25", 18)safe.getThreshold()usdc.paused()
Create your first monitor, step by step.
From a free account to your first alert in four steps.
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. 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. 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. 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.
Test the read before you monitor it.
Free tools that run the same reads a monitor would. No signup, no wallet connect.
Aave Health Factor Checker
Health factor, collateral, debt and LTV
pool.getUserAccountData(user)Ethereum · Base · Polygon
Gnosis Safe Inspector
Owners, threshold, nonce and version
safe.getOwners()Ethereum · Base · BNB Smart Chain · Polygon
ERC-20 Token Inspector
Name, symbol, decimals and total supply
token.totalSupply()Ethereum · Base · BNB Smart Chain · Polygon
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