{"service":"bitid-watch","open":true,"what":"A signed webhook when a Bitcoin address you never tell us about is touched on-chain.","how":["Compute SHA256(\"BID1-watch/v1\" || scriptPubKey) for the address you want watched.","Take the first 5 hex characters (20 bits). That is your bucket prefix.","POST it with a webhook URL. We never see the address, and cannot derive it.","We scan every block; if any script in your bucket moves, you get one signed webhook for that block.","Compare the candidates against your own scriptPubKey locally. Usually none of them is yours."],"derivation":{"tag":"BID1-watch/v1","formula":"prefix = SHA256(\"BID1-watch/v1\" || scriptPubKey).hex.slice(0, bits/4)","minBits":12,"maxBits":24,"defaultBits":20,"maxBitsReason":"Past 24 bits a bucket holds fewer than one other funded script, so we could work out which address you are watching. The cap is what keeps the promise true."},"rates":{"daySats":50,"notificationSats":25,"minimumFundingSats":10000},"billing":["50 sats/day while the watch is open, accrued per second.","25 sats per notification, charged when it is produced rather than when it is delivered — a webhook endpoint that is down still cost us the scan.","At most one notification per block, however many scripts in your bucket move.","False alarms are billed like real ones. They cost the same to find, and pretending otherwise would make a wide bucket look free.","Out of credit pauses the watch; it does not delete it. Top up the same address and it resumes from the next block."],"buckets":[{"bits":12,"prefixHex":3,"members":10791,"alarmsPerDay":123.6,"quietDayOdds":0,"noiseSatsPerDay":3090},{"bits":16,"prefixHex":4,"members":674,"alarmsPerDay":16.5,"quietDayOdds":0,"noiseSatsPerDay":414},{"bits":20,"prefixHex":5,"members":42,"alarmsPerDay":1.1,"quietDayOdds":0.333,"noiseSatsPerDay":28},{"bits":24,"prefixHex":6,"members":2.6,"alarmsPerDay":0.07,"quietDayOdds":0.934,"noiseSatsPerDay":2}],"bucketsSpendsOnly":[{"bits":12,"prefixHex":3,"members":10791,"alarmsPerDay":89.8,"quietDayOdds":0,"noiseSatsPerDay":2245},{"bits":16,"prefixHex":4,"members":674,"alarmsPerDay":8.5,"quietDayOdds":0,"noiseSatsPerDay":214},{"bits":20,"prefixHex":5,"members":42,"alarmsPerDay":0.55,"quietDayOdds":0.577,"noiseSatsPerDay":14},{"bits":24,"prefixHex":6,"members":2.6,"alarmsPerDay":0.03,"quietDayOdds":0.966,"noiseSatsPerDay":1}],"noise":{"basis":"Distinct scriptPubKeys touched per block, counted against our own node: 72 blocks over one day (2026-08-03) gave a mean of 7,863, p50 8,862, p90 12,544, range 786-13,853. Quoted as a rate, not a promise about any one block.","exchangeRate":"One false alarm per day buys roughly 40 funded scripts of crowd, at every width — it is the inverse of the daily turnover of the funded set (~2.5%). A quieter webhook is a smaller crowd.","spendsOnly":"Pass spendsOnly:true to hear only about coins leaving the bucket, roughly halving the noise. Receives are noise for a rescue watch. Unlike a value threshold, this filter is applied to the block rather than to your address, so it tells us nothing about which script in the bucket is yours."},"signature":{"header":"x-bitid-signature","algorithm":"HMAC-SHA256 over the exact request body, hex, prefixed \"sha256=\"","verify":"timingSafeEqual(Buffer.from(header), Buffer.from(\"sha256=\" + hmac))"},"limits":["Confirmed blocks only. A sweep sitting in the mempool is not reported until it confirms.","HTTPS webhook URLs only (loopback excepted for local development).","We keep: your bucket prefix, your webhook URL, your credit. We do not keep, and are not told, the address."]}