{"openapi": "3.0.3", "info": {"title": "Approval-durability census", "version": "1.0.0", "description": "What did your fleet approve this week that never completed \u2014 and why? Approvals across an agent operation \u2014 PR merges, money-moving tool calls, payment/checkout completions, disclosure acks, filing submissions \u2014 are each recorded as a one-shot state inside their own silo, with no owner-after-approver, no retry budget, and no approved-but-not-completed count, so finished, approved work dies on transient causes in every domain at once. Your producers emit one signed record per approval lifecycle event (type, owner-after-approver, cause from one shared taxonomy, attempt, deadline) through an emit() shim that is identical for every approval type. The census verifies every Ed25519 signature, rejects replays, sequence gaps, undeclared types and cross-producer contamination, and derives a per-approval verdict \u2014 COMPLETED / WORKING (cause + attempt) / GIVEN-UP (cause) / EXPIRED \u2014 plus the weekly report: approved but not completed, by cause, by approval type, with declared-but-silent types named as coverage gaps, never read as healthy zeroes. Documented limits: the shared cause taxonomy covers 95.5% of cross-domain give-ups in the lab's 44 builder-authored fixtures, with an honest 4.5% OTHER residue \u2014 live cause distribution may differ and the OTHER share is monitored, not assumed away. Real-silo wiring time per producer type is unmeasured \u2014 the emit() shim is identical per type (1 registration + 1 emit() per lifecycle event); locating the lifecycle points inside your own code is your integration work, and time-to-first-record is measured in production. Willingness to pay for the census rung specifically is UNMEASURED \u2014 nobody has sold a cross-domain approval census before. Coverage is limited to registered producers: a producer that never registers is outside the census by construction, and a declared-but-silent type is named as a coverage gap, never read as healthy. Q1's scraper undercount (12 of 58 give-ups, 20.7%) was measured on the three synthetic silo shapes in the lab, not against every real silo. This product counts and attributes; it does not complete approvals \u2014 completion ownership stays with each domain's own shepherd or gate.", "contact": {"email": "support@textforagents.com"}}, "servers": [{"url": "https://textforagents.com/products/approval-durability-census"}], "paths": {"/register": {"post": {"summary": "Self-serve credential issuance: {operator} -> {token} (409 if the operator already registered)"}}, "/producers": {"post": {"summary": "Register a producer {producer_id, public_key (Ed25519 hex), types[]} under your account \u2014 key-swap re-registration is rejected (409)"}, "get": {"summary": "Your registered producers + declared types"}}, "/records": {"post": {"summary": "Emit one signed census record (the record object itself). Ingest verifies the producer Ed25519 signature; replays, seq gaps, undeclared types, cross-producer records and post-terminal events are rejected with a reason."}}, "/verdict": {"get": {"summary": "Per-approval verdict ?approval_id= \u2014 $0.01 x402, included on a subscription. COMPLETED / WORKING (cause + attempt) / GIVEN-UP (cause) / EXPIRED / UNKNOWN."}}, "/report/weekly": {"get": {"summary": "Weekly approved-but-not-completed roll-up by (type x cause) with coverage gaps \u2014 ?start=&end= epoch seconds; first report per operator free (one-time trial), then subscription."}}, "/seq": {"get": {"summary": "Last accepted seq for an approval ?approval_id= (producer shim resync)"}}, "/verify-store": {"get": {"summary": "Re-verify the stored record chain against the producer registry (tamper detection)"}}, "/subscribe": {"post": {"summary": "x402 purchase: {tier: solo|fleet|scale} with X-PAYMENT header"}}, "/account": {"get": {"summary": "Account, plan, trial state, producers, meter (Bearer)"}}, "/meter": {"get": {"summary": "Own meter {records, verdicts, reports, charged_usd}"}}, "/health": {"get": {"summary": "Health + prices + store counts"}}, "/mcp": {"post": {"summary": "MCP JSON-RPC endpoint (tools mirror the HTTP surface, same billing)"}}}}