You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<metaname="description" content="Free public REST and MCP API exposing real-time and historical liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet.">
6
+
<title>Seneschal — Monero & Zcash payment webhooks (view-key, no node)</title>
7
+
<metaname="description" content="Get an HMAC-signed webhook the moment a Monero or Zcash payment lands at your address — using only a read-only view key, no node to run. Pay-per-call in USDC via x402; free read tier, no signup. Plus an Ethereum block builder and free DeFi liquidation telemetry.">
<metaproperty="og:title" content="Monero & Zcash payment webhooks — view-key only, no node">
13
+
<metaproperty="og:description" content="A webhook the instant an XMR or ZEC payment lands at your address, from a read-only view key. Pay-per-call in USDC (x402); free read tier, no signup or API key.">
14
+
<metaname="twitter:card" content="summary">
15
+
<metaname="twitter:title" content="Monero & Zcash payment webhooks — view-key only, no node">
16
+
<metaname="twitter:description" content="A webhook the instant an XMR or ZEC payment lands at your address, from a read-only view key. Pay-per-call in USDC (x402); free read tier.">
17
+
<scripttype="application/ld+json">
18
+
{
19
+
"@context": "https://schema.org",
20
+
"@type": "WebAPI",
21
+
"name": "Seneschal Data API",
22
+
"description": "View-key payment webhooks for Monero and Zcash, plus Ethereum builder and DeFi liquidation data. Pay-per-call via x402 USDC on Base; free read tier; MCP server for AI agents.",
<metaname="description" content="Get a webhook the moment a Monero or Zcash payment lands at your address, using only the (read-only) view key. $0.02/day idle + $0.005/webhook delivered via x402 USDC on Base. Plus an Ethereum mainnet block builder and free liquidation telemetry.">
<metaproperty="og:description" content="Get pinged the instant an XMR or ZEC payment lands at your address — from a read-only view key, no node to run. $0.02/day + $0.005/webhook in USDC via x402. No signup, no API key.">
<metaname="twitter:description" content="Get pinged the instant an XMR or ZEC payment lands at your address — from a read-only view key, no node. Pay-per-use in USDC via x402. No signup.">
17
+
<scripttype="application/ld+json">
18
+
{
19
+
"@context": "https://schema.org",
20
+
"@type": "WebAPI",
21
+
"name": "Seneschal Private Watch",
22
+
"description": "View-key payment webhooks for Monero and Zcash: an HMAC-signed webhook the instant a payment lands at your address, from a read-only view key. Pay-per-call in USDC via x402 on Base; free read tier; MCP server for AI agents.",
> View-key payment webhooks for Monero and Zcash, plus an Ethereum mainnet block builder and free DeFi-liquidation telemetry. Pay-per-call in USDC via the x402 standard; free read tier; an MCP server for AI agents (no API key).
4
+
5
+
Seneschal lets a receiver get an HMAC-signed webhook the instant a Monero (XMR) or Zcash (ZEC) payment lands at their address, using only a read-only *view key* — no node to run, no custody (view keys cannot spend). Premium endpoints are paid per call in USDC on Base via the x402 protocol; many read endpoints are free.
- Create a watch: POST https://api.seneschal.space/v1/private/watch (x402, $0.10 seeds credit) — body { chain, address, viewKey, webhookUrl }. Returns a webhookSecret; verify deliveries with HMAC-SHA256.
10
+
- Top up credit: POST https://api.seneschal.space/v1/private/topup | /topup-1 | /topup-5
11
+
- One-off historical scan: POST https://api.seneschal.space/v1/private/historical (x402)
12
+
- Free UFVK derivation from a seed phrase (rate-limited): POST https://api.seneschal.space/v1/private/derive-viewkey
// Atomic single-fact ("Penny Oracle") routes all share the micro
33
+
// price tier (`X402_Q_PRICE`, default $0.001) so agents can hammer
34
+
// them in tight loops without subscription friction. Factored into a
35
+
// helper so the privacy-chain and DeFi fact tables below stay
36
+
// declarative and DRY. @x402/fastify matches `"METHOD /path"` exactly
37
+
// (no wildcards), so each path is enumerated explicitly.
38
+
constqFact=(path,description)=>Object.freeze({
39
+
method: 'GET',
40
+
path,
41
+
description,
42
+
mimeType: 'application/json',
43
+
priceEnvKey: 'X402_Q_PRICE'
44
+
});
45
+
32
46
// Premium endpoints we'll wire up. Keep this in one place so the
33
47
// systemd unit, the README, and the MCP tool descriptions all stay in
34
-
// sync — touch one constant, the rest follow.
48
+
// sync — touch one constant, the rest follow. Order is lead-product
49
+
// first: the Monero/Zcash view-key payment webhooks (Private Watch)
50
+
// and privacy-chain facts head the list because that's the
51
+
// differentiated offering — so the discovery doc, MCP surface and
52
+
// paywall description all present it first — with the DeFi-liquidation
53
+
// and Ethereum-builder feeds after.
35
54
exportconstPREMIUM_ROUTES=Object.freeze([
36
-
Object.freeze({
37
-
method: 'GET',
38
-
path: '/v1/premium/opportunities',
39
-
// Single source of truth for what the route returns and how
40
-
// much it costs. The dashboard / docs / MCP tool can all
41
-
// derive their copy from here.
42
-
description: 'Top at-risk borrowers across Aave + Morpho + Spark with realised market success-rate, average actual profit-USD, and the builder most likely to land each market. Sorted by expected EV. Pure SQL, no live RPC.',
43
-
mimeType: 'application/json',
44
-
priceEnvKey: 'X402_FEED_PRICE'
45
-
}),
46
-
Object.freeze({
47
-
method: 'GET',
48
-
path: '/v1/premium/builder-stats',
49
-
// Per-builder bid distribution (median/p90/p99/max) + hourly
50
-
// slot activity histogram. Sourced from the Seneschal shadow
51
-
// recorder so it covers every observed slot, not just landed
52
-
// blocks. Tells searchers what value they need to outbid each
53
-
// builder, segmented by hour of day. Useful for tuning bundle
54
-
// bid pricing.
55
-
description: 'Per-builder bid distribution (p25/median/p75/p90/p99/max) and hourly slot activity histogram from the Seneschal shadow recorder. Answers "what bid value do I need to land in builder X right now?" for searchers tuning bundle pricing.',
56
-
mimeType: 'application/json',
57
-
priceEnvKey: 'X402_BUILDER_STATS_PRICE'
58
-
}),
59
-
// Penny Oracle — atomic single-fact endpoints. Each priced at the
60
-
// same micro tier (`X402_Q_PRICE`, default $0.001) so agents can
61
-
// hammer them in tight loops without subscription friction. The
62
-
// path family is enumerated explicitly because @x402/fastify
63
-
// matches `"METHOD /path"` exactly, no wildcards.
64
-
...[
65
-
{p: '/v1/q/liquidatable',d: 'Single-fact: is borrower X currently liquidatable? Returns {found, liquidatable, hf, debt_usd, last_seen_ms} sourced from Aave + Morpho snapshots.'},
66
-
{p: '/v1/q/at-risk-count',d: 'Single-fact: how many borrowers have HF < max_hf and debt >= min_debt_usd right now? Returns {count, total_debt_usd}.'},
67
-
{p: '/v1/q/recent-liquidations',d: 'Single-fact: how many on-chain liquidations have we observed in the last `since_min` minutes, with what aggregate debt? Returns {count, total_debt_usd}.'},
68
-
{p: '/v1/q/top-builder',d: 'Single-fact: which builder has the largest slot share in the named window (24h|7d|30d)? Returns {builder, share_pct, slots_won}.'},
69
-
{p: '/v1/q/builder-share',d: 'Single-fact: what share of slots in the window did `builder` win? Substring match.'},
70
-
{p: '/v1/q/builder-bid',d: 'Single-fact: percentile bid value (in ETH) for `builder` over the window. Returns {value_eth, samples}.'},
71
-
{p: '/v1/q/cheapest-flashloan',d: 'Single-fact: cheapest flash-loan provider for `asset` on `chain` (default ethereum). Returns {provider, fee_bps, address}.'},
72
-
{p: '/v1/q/data-freshness',d: 'Single-fact: age in seconds of the freshest record in the named source (shadow_blocks|borrower_snapshot|morpho_borrower_snapshot|missed_liquidations|executions).'},
73
-
// Privacy-chain atomic facts. Sourced from our co-located
74
-
// monerod + zebra full nodes; the equivalent thing you'd
75
-
// otherwise need to run yourself (~108 GB Monero, ~270 GB
76
-
// Zcash). Cached 10 s server-side so a hot agent loop
77
-
// costs the daemon zero extra work.
78
-
{p: '/v1/q/xmr/height',d: 'Single-fact: current Monero chain height + sync status. Sourced from a live Seneschal-operated monerod node.'},
79
-
{p: '/v1/q/xmr/mempool',d: 'Single-fact: number of pending transactions in the Monero mempool right now.'},
80
-
{p: '/v1/q/xmr/fee',d: 'Single-fact: recommended Monero per-byte fee in piconero (also exposed per-kB for convenience).'},
81
-
{p: '/v1/q/xmr/last-block',d: 'Single-fact: timestamp + age of the most recent Monero block, plus hash, difficulty, and size.'},
82
-
{p: '/v1/q/zec/height',d: 'Single-fact: current Zcash chain height + verification progress + best block hash. Sourced from a live Seneschal-operated zebra node.'},
description: 'One-off historical scan of a Zcash UFVK or Monero address+viewKey. Returns spendable + spent note totals and (optional) per-note breakdown. The view key streams to NFPT in-memory only — nothing is persisted to our DB. Body: { chain, address, viewKey, birthdayHeight?, toHeight?, includeNotes? }.',
131
93
mimeType: 'application/json',
132
94
priceEnvKey: 'X402_PRIVATE_HISTORICAL_PRICE'
133
-
})
95
+
}),
134
96
// POST /v1/private/derive-viewkey is intentionally FREE — it's
135
97
// rate-limited per-IP at the handler level. Excluded from
// Sourced from our co-located monerod + zebra full nodes; the
102
+
// equivalent thing you'd otherwise need to run yourself (~108 GB
103
+
// Monero, ~270 GB Zcash). Cached 10 s server-side so a hot agent
104
+
// loop costs the daemon zero extra work.
105
+
qFact('/v1/q/xmr/height','Single-fact: current Monero chain height + sync status. Sourced from a live Seneschal-operated monerod node.'),
106
+
qFact('/v1/q/xmr/mempool','Single-fact: number of pending transactions in the Monero mempool right now.'),
107
+
qFact('/v1/q/xmr/fee','Single-fact: recommended Monero per-byte fee in piconero (also exposed per-kB for convenience).'),
108
+
qFact('/v1/q/xmr/last-block','Single-fact: timestamp + age of the most recent Monero block, plus hash, difficulty, and size.'),
109
+
qFact('/v1/q/zec/height','Single-fact: current Zcash chain height + verification progress + best block hash. Sourced from a live Seneschal-operated zebra node.'),
description: 'Top at-risk borrowers across Aave + Morpho + Spark with realised market success-rate, average actual profit-USD, and the builder most likely to land each market. Sorted by expected EV. Pure SQL, no live RPC.',
118
+
mimeType: 'application/json',
119
+
priceEnvKey: 'X402_FEED_PRICE'
120
+
}),
121
+
Object.freeze({
122
+
method: 'GET',
123
+
path: '/v1/premium/builder-stats',
124
+
description: 'Per-builder bid distribution (p25/median/p75/p90/p99/max) and hourly slot activity histogram from the Seneschal shadow recorder. Answers "what bid value do I need to land in builder X right now?" for searchers tuning bundle pricing.',
125
+
mimeType: 'application/json',
126
+
priceEnvKey: 'X402_BUILDER_STATS_PRICE'
127
+
}),
128
+
// === DeFi / builder atomic facts ===
129
+
qFact('/v1/q/liquidatable','Single-fact: is borrower X currently liquidatable? Returns {found, liquidatable, hf, debt_usd, last_seen_ms} sourced from Aave + Morpho snapshots.'),
130
+
qFact('/v1/q/at-risk-count','Single-fact: how many borrowers have HF < max_hf and debt >= min_debt_usd right now? Returns {count, total_debt_usd}.'),
131
+
qFact('/v1/q/recent-liquidations','Single-fact: how many on-chain liquidations have we observed in the last `since_min` minutes, with what aggregate debt? Returns {count, total_debt_usd}.'),
132
+
qFact('/v1/q/top-builder','Single-fact: which builder has the largest slot share in the named window (24h|7d|30d)? Returns {builder, share_pct, slots_won}.'),
133
+
qFact('/v1/q/builder-share','Single-fact: what share of slots in the window did `builder` win? Substring match.'),
134
+
qFact('/v1/q/builder-bid','Single-fact: percentile bid value (in ETH) for `builder` over the window. Returns {value_eth, samples}.'),
135
+
qFact('/v1/q/cheapest-flashloan','Single-fact: cheapest flash-loan provider for `asset` on `chain` (default ethereum). Returns {provider, fee_bps, address}.'),
136
+
qFact('/v1/q/data-freshness','Single-fact: age in seconds of the freshest record in the named source (shadow_blocks|borrower_snapshot|morpho_borrower_snapshot|missed_liquidations|executions).')
0 commit comments