{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","assetDecimals":6,"deployments":{"controls":["per-IP rate limit on the open channel (100000 ops/min)","size caps below"],"denials":"403 POLICY_DENIES when the governing policy lacks the op · 404 APP_NOT_FOUND for unknown ids · 409 APP_EXISTS when the name is already leased","derive":"scheme field `derive: \"<into>\"` — the runtime's trigger keeps <into>/count (live keys) and <into>/latest for that scheme, exactly once per committed change, with no writer cooperation (async by the engine's trigger lag)","kinds":{"counter":"body {key, by}: an integer moved by `by`","inventory":"body {key, by}: a counter that never goes below 0 (409 BELOW_FLOOR)","kv":"plain put (default); walletless submissions land at runtime-assigned keys","note":"what a scheme's WRITES do — invariants the runtime holds in the same transaction as the payment guard (a refused write costs nothing)","unique":"body {key, value}: first committer wins the key (409 CLAIMED after; the same value again is idempotent)"},"live":"GET /ingress/{app-id}/live?scheme=<a,b,…> — server-sent events: `attached {seqno}` first, then one `change {key, kind, value, seqno, commit}` per committed write inside those schemes (the engine's post-commit change stream, proxied per deployment; keys relative to the space); gated like a read on every scheme named — policy is re-decided every minute, and `end {error}` closes a feed the deployment no longer admits; `lagged` means re-sync (scan again)","note":"the only public unit — the database LEASES each deployment its space (id = keccak256(\"<owner>/<name>\")[..16], space = apps/<id>/ inside the owner's slice) and the author declares its SCHEMES: sub-keyspaces, each with its own exposure; callers address keys RELATIVE to the space and the runtime prepends it (CosmWasm-style), so nothing outside is nameable; authorization is the declared policy, never a per-key check","openChannel":"GET /ingress/{app-id} (doc) · GET /ingress/{app-id}/get?key= · GET /ingress/{app-id}/scan?prefix= · GET /ingress/{app-id}/tally?scheme= · GET /ingress/{app-id}/live?scheme= (SSE) · POST /ingress/{app-id}[/{scheme}] (one submission at a runtime-assigned key under the scheme) — no wallet, no charge","paidChannel":"POST /v1/app/{app-id}/get|scan|tally|put|delete — x402-signed by the caller (every quote is 0; the signature is the caller's identity); keys relative to the space (e.g. entries/1)","policy":{"open":["none","read","write","readwrite"],"paid":["none","read","write","readwrite"],"per_caller":"wallet callers each get their own sub-space under the scheme (<scheme>/<payer>/) — per-caller state (one vote per wallet) by construction"},"schemes":"app-create {name, policy?, schemes?: [{path, paid?, open?, per_caller?, kind?, derive?}], doc?} — `policy` is the default for everything undeclared (private when omitted); the longest scheme whose path prefixes a key governs it; a scan spanning schemes is governed by the default; app-scheme upserts one scheme later","tally":"op `tally` (price of a scan): GROUP BY over a scheme's values at one snapshot — owner plane {prefix}, app channel {scheme}, open channel GET /ingress/{app-id}/tally?scheme= — gated like a read; on a per_caller scheme it aggregates every caller (counts are public where reads are, ballots never)"},"identity":"the x402 payer address is the tenant; /v1/db acts on the payer's own slice; everything public goes through a deployment (app)","limits":{"maxBatchOps":100,"maxKeyBytes":512,"maxScanLimit":500,"maxValueBytes":65536},"network":"eip155:8453","ops":[{"app":"/v1/app/{app-id}/get","op":"get","open":"GET /ingress/{app-id}/get?key= (and GET /ingress/{app-id} for the doc)","owner":"/v1/db/get","price":"0"},{"app":"/v1/app/{app-id}/scan","op":"scan","open":"GET /ingress/{app-id}/scan?prefix=","owner":"/v1/db/scan","price":"0"},{"app":"/v1/app/{app-id}/put","op":"put","open":"POST /ingress/{app-id}[/{scheme}] (one submission)","owner":"/v1/db/put","price":"0"},{"app":"/v1/app/{app-id}/delete","op":"delete","open":null,"owner":"/v1/db/delete","price":"0"},{"app":"/v1/app/{app-id}/tally","op":"tally","open":"GET /ingress/{app-id}/tally?scheme=","owner":"/v1/db/tally","price":"0"},{"app":null,"op":"batch","open":null,"owner":"/v1/db/batch","price":"0"},{"app":null,"op":"app-create","open":null,"owner":"/v1/db/app-create","price":"0"},{"app":null,"op":"app-update","open":null,"owner":"/v1/db/app-update","price":"0"},{"app":null,"op":"app-scheme","open":null,"owner":"/v1/db/app-scheme","price":"0"},{"app":null,"op":"app-close","open":null,"owner":"/v1/db/app-close","price":"0"},{"app":null,"op":"apps","open":null,"owner":"/v1/db/apps","price":"0"},{"app":null,"op":"live","open":"GET /ingress/{app-id}/live?scheme= (SSE)","owner":null,"price":"0 per open minute"}],"payTo":"0x81A29cAfA4A5a4911eBDD2f513D41f9516F892dE","protocol":{"deniedRequestsAreNotCharged":true,"free":true,"scheme":"exact","settlement":"none","x402Version":2},"runtime":"the service's logic is one WASM module INSIDE the fluent31 store: every call is one engine transaction that burns the payment nonce, checks the deployment's policy, and applies the op — a refusal aborts the transaction, so it never consumes an authorization","service":"seal-x402-estuary","version":1}