API docs

Base URL: https://ledgerbell.quietworklabs.workers.dev. Auth: header x-api-key: lb_…. Machine-readable: /openapi.json, /.well-known/x402.

POST /api/key                       -> {key}
GET  /api/me             (x-api-key) -> plan, watches (with last_error, pending), invoices
POST /api/watch          (x-api-key) {chain, kind, address, webhook, event?, token?, label?, safe_api_key?}
POST /api/watch/test     (x-api-key) {id}
POST /api/watch/delete   (x-api-key) {id}
POST /api/upgrade        (x-api-key) {months?} -> exact USDC amount on Base (+ x402 pay link)
GET  /api/stats                      -> public counters
GET  /x402/pro-30d | /x402/pro-7d    -> x402 payment, returns {key, plan, pro_until}
GET  /upgrade/{report_id}[?format=json] -> proxy upgrade report

Watch kinds

kindalerts on
walletERC-20 transfers in/out (non-zero), new Approval and ApprovalForAll granted by the wallet. Optional token filter.
contractAdmin events: Upgraded, AdminChanged, BeaconUpgraded, OwnershipTransferred(Started), Paused/Unpaused, Role granted/revoked/admin changed, Safe owner/threshold/module/guard/fallback-handler changes and executions, Timelock CallScheduled/CallExecuted/Cancelled/MinDelayChange, Governor proposals.
eventAny event: event = signature like Deposit(address,uint256) or a topic0 hash.
safe_queue (Pro)New queued (unexecuted) Safe transactions and when one reaches its signature threshold, from the Safe Transaction Service. Flags DELEGATECALL, settings changes and approvals.

Webhooks

Discord (https://discord.com/api/webhooks/…), Slack incoming webhooks, Telegram (https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<ID>), ntfy (https://ntfy.sh/<topic>; the public ntfy.sh server rate-limits shared cloud IPs, so add an access token as ?auth=… or use your own ntfy server), or any HTTPS URL receiving JSON:

{"text":"⬇️ Received 250 USDC from 0x12ab…","watch_id":7,"chain":"base","kind":"wallet","watched":"0x…","tx":"0x…","log_index":12,"block":52750911,"log_address":"0x8335…","topics":[…],"data":"0x…","service":"ledgerbell"}

When several alerts for the same webhook are due at once they are sent as one message (JSON: {"text", "alerts":[…], "count"}). Failed deliveries are retried with exponential backoff (honoring Retry-After) for up to 24 hours.

Limits

Free: 3 watches, 50 alerts/day. Pro: 30 watches, 1,000 alerts/day. At most 5 alerts per watch per minute. Native ETH and NFT transfers are not covered.