api.seneschal.space. Connect any EVM wallet via WalletConnect (or MetaMask). Pay for watches, top-ups and historical scans in USDC on Base via the x402 protocol — no account, no API key, no sign-up. Every action below shows the equivalent API call so you can graduate to your own automation any time. View keys never leave your browser except to be sent over TLS to the API for the specific action.
Create a new payment-monitoring watch
You'll be asked to sign an EIP-3009 transferWithAuthorization for $0.10 USDC on Base. Once payment is verified by Coinbase's x402 facilitator the watch is created with $0.10 of starter credit (~5 idle days at the $0.02/day rate). Top up any time.
Equivalent API call
Step 1 — create the watch ($0.10 fixed)curl -s https://api.seneschal.space/v1/private/watch \
-X POST -H "content-type: application/json" \
-H "x-payment: <base64 EIP-3009 payload, $0.10 USDC on Base>" \
-d '{
"chain": "monero",
"address": "44AFFq…",
"viewKey": "0123…",
"webhookUrl": "https://your.server/seneschal-hook"
}'
# returns { watchId, watchToken, webhookSecret, creditAtomic: "100000", ... }
Step 2 (optional) — add extra credit by ANY amount
curl -s -X POST https://api.seneschal.space/v1/private/topup-custom \
-H "x-payment: <base64 EIP-3009 payload, $X.XX USDC on Base>" \
-H "content-type: application/json" \
-d '{ "watchId": "…", "watchToken": "…", "amountAtomic": 900000 }'
# 900000 atomic = $0.90 → total credit on the watch becomes $1.00
Node.js (x402-fetch wraps the payment flow)
import { wrapFetchWithPayment } from "x402-fetch";
import { createWalletClient, http } from "viem";
import { base } from "viem/chains";
const fetchPaid = wrapFetchWithPayment(fetch, walletClient);
const r = await fetchPaid("https://api.seneschal.space/v1/private/watch", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ chain, address, viewKey, webhookUrl })
});
const { watchId, watchToken, webhookSecret } = await r.json();
// then optionally:
const t = await fetchPaid("https://api.seneschal.space/v1/private/topup-custom", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ watchId, watchToken, amountAtomic: 900_000 })
});
MCP (for AI agents already in a paid session)
tool: seneschal_private_watch_create
input: { chain, address, viewKey, webhookUrl }
Credit — view balances, top up by any amount
Drag the slider per watch to choose any top-up amount from $0.10 to $25. One wallet signature per top-up, settled via POST /v1/private/topup-custom. The $0.10 / $1 / $5 fixed-tier buttons are still in My watches if you prefer a one-click flow. Prefer privacy coin? Each card can also generate a pay-in-coin quote (XMR/ZEC) — no wallet connection required.
Equivalent API call — variable-amount top-up
curl + your own x402 signercurl -s -X POST https://api.seneschal.space/v1/private/topup-custom \
-H "x-payment: <base64 EIP-3009 payload, $X.XX USDC on Base>" \
-H "content-type: application/json" \
-d '{
"watchId": "…",
"watchToken": "…",
"amountAtomic": 250000
}'
Node.js (x402-fetch handles the dance)
import { wrapFetchWithPayment } from "x402-fetch";
const fetchPaid = wrapFetchWithPayment(fetch, walletClient);
const r = await fetchPaid("https://api.seneschal.space/v1/private/topup-custom", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ watchId, watchToken, amountAtomic: 250000 })
});
const { credit } = await r.json();
Notes
// amountAtomic is in atomic USDC (6 decimals): 100_000 = $0.10
// Range: 100_000 (min) — 25_000_000 (max)
// On 402 the server returns a `payment-required` header with the
// challenge baked to your requested amount; sign exactly that or
// the retry rejects with `amount_mismatch`.
Equivalent API call — pay in Monero / Zcash (no wallet, no x402)
1. Ask for a quote (free) — locks a USD→coin rate for the windowcurl -s -X POST https://api.seneschal.space/v1/private/topup-crypto \
-H "content-type: application/json" \
-d '{
"watchId": "…",
"watchToken": "…",
"chain": "monero",
"amountUsdCents": 500
}'
# → { quoteId, payTo, amount:{display,coin}, memo, confirmations, expiresAt }
2. Send the exact amount (Monero) or include the memo (Zcash), then poll
curl -s -H "x-watch-token: <token>" \
https://api.seneschal.space/v1/private/topup-crypto/<quoteId>
# status: pending → confirming (seen/required) → settled (watch credited)
MCP (for AI agents)
tool: seneschal_private_watch_topup_crypto
input: { watchId, watchToken, chain, amountUsdCents }
Notes
// amountUsdCents range: 200 ($2.00 min) — 50_000 ($500 max).
// Monero attribution is by EXACT amount (unique low-digit tag) — send
// precisely the quoted figure, no rounding. Zcash uses the memo.
// Credited at the rate locked in the quote, after the stated confs.
// No refunds on over/under-payment; re-quote if it expires.
My watches stored in this browser’s localStorage
Watches you create on this device are remembered locally so you can top up, check status and cancel them. Nothing is sent to our server about your saved list — the API only knows the watchToken we hand back at creation, and we cannot reconstruct that for you if you lose this browser. Export / import a JSON backup any time.
Equivalent API calls — managing a watch
Status (free)curl -s -H "x-watch-token: <token>" \
https://api.seneschal.space/v1/private/watch/<watchId>
Top up — $0.10 / $1 / $5 tier
curl -s -X POST https://api.seneschal.space/v1/private/topup-1 \
-H "x-payment: <base64 EIP-3009, $1.00 USDC on Base>" \
-H "content-type: application/json" \
-d '{"watchId":"…","watchToken":"…"}'
Cancel (free, no refund)
curl -s -X DELETE -H "x-watch-token: <token>" \
https://api.seneschal.space/v1/private/watch/<watchId>
One-off historical lookup
Single $0.50 USDC payment runs a full historical scan against the view key you supply and returns aggregated totals (received / spent / spendable in atomic units) and optionally per-note breakdowns. Your view key transits our process in memory only — it is never written to our SQLite or logs.
Equivalent API call
curl -s -X POST https://api.seneschal.space/v1/private/historical \
-H "x-payment: <base64 EIP-3009 payload, $0.50 USDC on Base>" \
-H "content-type: application/json" \
-d '{
"chain": "monero",
"address": "44AFFq…",
"viewKey": "0123…",
"includeNotes": true
}'
Derive a Zcash viewing key from a BIP-39 phrase
Free, no payment. Rate-limited 6/min/IP. Forwards your phrase to the local orchard-scanner derive-ufvk command and returns the matching read-only Unified Full Viewing Key.
api.seneschal.space. We do not log or persist it, but a network attacker between you and us would see the bytes. For maximum safety, derive offline using orchard-scanner. Leave the textarea blank to use the canonical BIP-39 test vector (no risk).Equivalent API call
curl -s -X POST https://api.seneschal.space/v1/private/derive-viewkey \
-H "content-type: application/json" \
-d '{"chain":"zcash","network":"mainnet","phrase":"abandon abandon … art"}'