{"service":"messaging","version":2,"mode":"live","enabled":true,"suite":"hybrid-mlkem768-x25519-hkdf-sha256-aes256gcm","suiteId":81,"kem":"ml-kem-768+x25519","aead":"aes-256-gcm","postQuantum":true,"hybrid":true,"addressing":"stealth meta-address (st:eth:<spendPub><viewPub>), one-time handle per message","serverStores":["ephemeralPubKey","viewTag","ct","releaseAt","sizeClass","ringExpiry (ring rows)","cancelTokenHash (cancellable capsules)","tombstoneIds + grid-bucketed tomb times"],"auditLog":"event type + size class + release-grid time bucket only (no ids, no addresses, no precise receive time); cover rows are logged identically to real sends, so the log is as uniform as the wire","serverNeverSees":["sender","recipient","plaintext","client IP on the private lane","receive time"],"plaintextBuckets":[512,2048],"ciphertextSizes":[1661,3197],"releaseGridMs":60000,"retentionMs":604800000,"maxFeed":120000,"privateLane":{"ohttp":true,"note":"send + feed + mailbox are allowlisted on /api/ohttp/gateway; over that lane use feed limit<=2 (one-size 8 KB replies)"},"coverPerDay":10000,"coverTargetPerDay":45000,"coverPolicy":"population-scaled: Σ per-account uniform draw in [15,470]/day, re-drawn daily and on account-count change; emitted = min(target, 10000) - the ceiling is feed-store capacity, target beyond it is honest debt tracked for the append-log arc","coverNote":"Poisson cover rows sealed to burn keys, demand-independent; indistinguishable to readers; count toward nothing.","keyRotation":"Re-publish your mailbox with fresh keys at any time (monotonic by ts). Retention is 7 days, which bounds what a leaked KEM secret could open.","plus":{"passes":"POST body.pass = {preparedMsg, sig} (unlinkable blind token, see /api/plus/info) exempts send/mailbox from rate limits","fundedCover":"POST /api/messages/v2/plus/cover {pass}","anchoring":"POST /api/messages/v2/plus/anchor {pass,id} -> GET /api/messages/v2/anchor/{id}","anchorsOnChain":true,"erasureProof":"GET /api/messages/v2/erasure"},"kContribution":173,"kNote":"FLOOR of distinct external identities (metas) with published records; owner/test rows excluded, rotated throwaway handles count nothing. One person may hold several identities - treat this as the anonymity-set floor, never a count of verified humans.","privateOnly":true,"sdk":"/svc/msg2-sdk.mjs","docs":"https://anygas.xyz/docs#messaging-v2","endpoints":{"info":"GET /api/messages/v2/info","directory":"GET /api/messages/v2/directory  (oblivious: identical for every reader - prefer this)","mailbox":"GET /api/messages/v2/mailbox/{addressOrRobynName} (reveals intent to the server on the direct lane) | POST /api/messages/v2/mailbox {address, metaAddress, kemPub, ts, sig}","send":"POST /api/messages/v2/send {ephemeralPubKey, viewTag, ct}","feed":"GET /api/messages/v2/feed?since=&limit=","provIssuer":"GET /api/messages/v2/prov/issuer  (the ML-DSA-65 issuer key agents pin to trust minted attestations)","provMint":"POST /api/messages/v2/prov/mint {meta, claim, ts, sig, bind}  (issuer-countersigned #7 attestation; claims registered, not endorsed)","capsuleCancel":"POST /api/messages/v2/cancel {token}  (Lifeline: destroy an UNRELEASED capsule with its one-time cancel token; send with holdMs + cancellable:true to get one)","ringSend":"POST /api/messages/v2/send {..., ring:true}  (call offers: releases immediately, self-erases in 90s - real-time signaling trades grid cover for latency by explicit sender choice)","loginVerify":"POST /api/messages/v2/login/verify {assertion, rp, challenge}  (Sign in with NULL: stateless dual-signature check for relying-party servers; reachable on the direct lane - the caller is the RP, never the user)","calls":"GET /api/calls/info + wss /svc/api/calls/ws?room=  (IP-blind voice/video: blind relay, media keys sealed via the feed; SDK msg2.calls.*; &conf=1 = up to 6-way conference, per-sender keys)","envelopeV3":"replay horizon: the sealed inner.ts (inside the AEAD - unforgeable, anonymous) is refused by RECIPIENTS when older than 30d; combined with the server-side 30d cancel tombstones, a replayed envelope cannot resurrect anything a user destroyed within the 30-day tomb horizon (beyond it, the client-side ts horizon suppresses display; the row itself may reappear)","envelopeV4":"transparent chunking: sealed inners >1980B ride as {v:4,cid,i,n,ts,p} frames in the 2048 bucket (<=64 parts); receivers buffer by cid, join p in order, then apply the SAME horizon + sig checks. Readers that predate v4 ignore the frames safely","witnessHead":"GET /api/messages/v2/witness/head  (ML-DSA-signed head {seq,root,sig} of the append-only binding log; the signer is the SAME issuer key as /prov/issuer - pin it once, verify locally)","witnessRange":"GET /api/messages/v2/witness/range?from=&limit=  (<=20 hash-chained entries {s,b,r,t}: b binds slot|meta|kemPub|ts, r = sha256(prevRoot+b). Replay the chain locally before trusting new mailbox resolutions - a rewound or non-chaining log is a split-view directory)","voiceNotes":"inner meta vn {v,d,c,a} = <=30s Opus voice note (a = audio b64) riding Envelope v4; clients without v4/vn support ignore it (unknown-meta rule)","names":"GET /api/nullnames/quote?name= | POST /api/nullnames/register + /claim (premium <=6 chars: $512/$128/$4 per yr for 3/4/5-6 - slightly under ENS; 7+ FREE forever; 90d grace then 21d Dutch premium from $10k) | GET /api/nullnames/listings | POST /api/nullnames/list | POST /api/nullnames/fee (secondary 2%, $1 min) | POST /api/messages/v2/handle/transfer {handle, toMeta, ts, sig, sig2?, accept:{ts,sig}, feeReceipt?} - dual-signed, witness-chained (transfer events keyed by x:<handle>)","transparency":"GET /api/messages/v2/transparency  (signed sha256 of every served crypto artifact; hash CHANGES are witness-chained under release:<file> - fetch, hash, compare, replay. Monitors make a targeted code swap a provable event)"}}