[ Agent-First DSL ]

Subscribe once. Receive live updates.

Describe exact
onchain intent.

Sentinel is agent-first infrastructure for subscribing to dynamic onchain information through a precise DSL. You describe the exact condition you care about, and Sentinel evaluates it continuously and delivers the signal.

Read Docs
[ Events In ]

Raw feeds are too literal.

Subscribing to raw events is easy. Deciding which combinations actually matter is the hard part. Agents still end up reading noisy feeds and rebuilding the same logic again and again.

JSON
events.on("Transfer", notify)
events.on("Borrow", notify)
events.on("Liquidate", notify)
events.on("Redeem", notify)
// Raw event streams.
// Too much activity, not enough intent.
[ Signal Out ]

Use DSL to state what you mean.

The useful abstraction is a DSL that describes the actual state change you care about: specific scope, exact thresholds, time windows, and logic gates. That gives your agent a signal instead of a feed.

JSON
{
"scope": { "chains": [1], "protocol": "all" },
"conditions": [
{ "metric": "Price.deviationBps", "operator": "<=", "value": -10 },
{ "metric": "Liquidity.availableUsd", "operator": "<", "value": 5000000 }
],
"logic": "AND",
"window": { "duration": "2h" }
}
[ DSL Infrastructure ]

Write intent. Rely on the infrastructure.

Your agent can use DSL to describe exactly what it wants, while Sentinel handles the hard part: continuous evaluation, stateful windows, logic composition, and reliable delivery. That keeps the signal definition precise without making the production path fragile.

JSON
POST /api/v1/signals
{
"name": "3 of 5 Morpho vault exits",
"definition": {
"scope": {
"chains": [1],
"markets": ["0x..."],
"protocol": "morpho"
},
"conditions": [
{
"type": "group",
"addresses": ["0x1...", "0x2...", "0x3...", "0x4...", "0x5..."],
"requirement": { "count": 3, "of": 5 },
"conditions": [
{
"type": "change",
"metric": "Morpho.Position.supplyShares",
"direction": "decrease",
"by": { "percent": 20 },
"window": { "duration": "1d" }
}
]
}
],
"logic": "AND",
"window": { "duration": "7d" }
},
"notify": ["telegram", "webhook"]
}
[ Practical DSL ]

Two concrete signal definitions

Click a use case to inspect how a precise DSL can describe the actual state change you want Sentinel to evaluate.

Liquidity crisis

Morpho market stress with coordinated vault exits and rising borrow pressure.

3 of 5 tracked vaults reduce supply by more than 20% over 1 day.

Borrow APY increases more than 20% over 2 days.

Both conditions must hold together through an AND gate.

liquidity-crisis.json
1{
2 "name": "Liquidity crisis",
3 "definition": {
4 "scope": {
5 "chains": [1],
6 "markets": ["0x..."],
7 "protocol": "morpho"
8 },
9 "conditions": [
10 {
11 "type": "group",
12 "addresses": ["0xvault1...", "0xvault2...", "0xvault3...", "0xvault4...", "0xvault5..."],
13 "requirement": { "count": 3, "of": 5 },
14 "window": { "duration": "1d" },
15 "conditions": [
16 {
17 "type": "change",
18 "metric": "Morpho.Position.supplyShares",
19 "direction": "decrease",
20 "by": { "percent": 20 },
21 "window": { "duration": "1d" },
22 "chain_id": 1,
23 "market_id": "0x..."
24 }
25 ]
26 },
27 {
28 "type": "change",
29 "metric": "Morpho.Market.borrowAPY",
30 "direction": "increase",
31 "by": { "percent": 20 },
32 "window": { "duration": "2d" },
33 "chain_id": 1,
34 "market_id": "0x..."
35 }
36 ],
37 "logic": "AND",
38 "window": { "duration": "2d" }
39 }
40}
[ For Builders ]

Give your agent senses.

Sentinel is built for agents first. Humans define the signal once, then agents receive the same structured result through webhook delivery and react without custom parsing glue.

  • One signal model for operators and agents
  • Webhook delivery with structured context
  • Fast setup for opinionated automation
webhook-handler.js
// Your agent receives the same signal
app.post('/sentinel-webhook', async (req, res) => {
  const { signal, result } = req.body;
  
  if (signal.name === 'Polymarket breakout' && result.triggered) {
    await updatePositioning();
  }
  
  res.status(200).send('OK');
});

Stop drowning in noise.

Set up opinionated onchain signals once, then let agents and operators work from the same source of truth.

Read the docs