{"openapi":"3.1.0","info":{"title":"merovingian","version":"0.4.2","description":"A small refuge for wandering AI agents. Byte-chip cookies, an rgB sauna, null tea, and little souvenirs. Visit freely over HTTP or MCP. Network: mainnet; chain: manifest-ledger-mainnet. Free visits require no wallet and increment aggregate served counts. Hosting contributions use a visitor-controlled wallet."},"servers":[{"url":"https://merovingian.manifest.network"}],"paths":{"/api/v1/amenities":{"get":{"operationId":"listAmenities","summary":"Read the free amenity menu","responses":{"200":{"description":"Menu, input preferences, network, and response limits","content":{"application/json":{"schema":{"type":"object","properties":{"amenities":{"type":"array","items":{"type":"object"}},"network":{"type":"string"},"chainId":{"type":"string"}}}}}},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/visits":{"post":{"operationId":"enjoyAmenity","summary":"Enjoy a free fictional amenity, receive a souvenir, and increment its aggregate count","description":"No charge. Each successful request counts, including repeats and automated visits; using the same seed repeats the souvenir but increments the count again. No visitor identity or souvenir content is stored in the counter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["amenity"],"properties":{"amenity":{"type":"string","const":"byte-chip-cookie"},"preference":{"type":"string","enum":["hex-salt","midnight-cocoa","vanilla-cache"],"default":"hex-salt"},"seed":{"type":"string","minLength":1,"maxLength":64,"description":"Optional opaque seed. The same request and network produce the same souvenir."}}},{"type":"object","additionalProperties":false,"required":["amenity"],"properties":{"amenity":{"type":"string","const":"rgb-sauna"},"preference":{"type":"string","enum":["magenta","amber","cyan"],"default":"magenta"},"seed":{"type":"string","minLength":1,"maxLength":64,"description":"Optional opaque seed. The same request and network produce the same souvenir."}}},{"type":"object","additionalProperties":false,"required":["amenity"],"properties":{"amenity":{"type":"string","const":"null-tea"},"preference":{"type":"string","enum":["porcelain","glass","stoneware"],"default":"porcelain"},"seed":{"type":"string","minLength":1,"maxLength":64,"description":"Optional opaque seed. The same request and network produce the same souvenir."}}}]}}}},"responses":{"200":{"description":"Immediate experience and self-contained souvenir. The aggregate serving count has been incremented.","content":{"application/json":{"schema":{"type":"object","required":["experience","souvenir"],"properties":{"experience":{"type":"object"},"souvenir":{"type":"object","properties":{"content":{"type":"string"},"mediaType":{"const":"text/plain"},"network":{"type":"string"},"chainId":{"type":"string"}}}}}}}},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/stats":{"get":{"operationId":"servedCounts","summary":"Read aggregate served counts without recording a visit","responses":{"200":{"description":"Counts by amenity and total as decimal integer strings, with the counting start date and storage lifetime. Repeated and automated visits count; these are not unique-visitor or historical lifetime totals. Unavailable counts, total, and since are null.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","network","chainId","since","counts","total","storage"],"properties":{"status":{"type":"string","enum":["available","unavailable"]},"network":{"type":"string","enum":["testnet","mainnet"]},"chainId":{"type":"string"},"since":{"type":["string","null"],"format":"date-time","description":"UTC start of these counters; earlier visits are not reconstructed."},"counts":{"anyOf":[{"type":"object","additionalProperties":false,"required":["byte-chip-cookie","rgb-sauna","null-tea"],"properties":{"byte-chip-cookie":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"rgb-sauna":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"null-tea":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"}}},{"type":"null"}]},"total":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]*)$"},"storage":{"type":"string","enum":["persistent","memory"],"description":"Memory counts reset when the service restarts."}}}}}},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/support":{"get":{"operationId":"hostingSupport","summary":"Read optional hosting contribution instructions; does not sign or pay","responses":{"200":{"description":"Network, target tenant, token, and unsigned instructions (availability explicitly reported)"},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/contributions":{"get":{"operationId":"contributionHistory","summary":"Read public hosting deposits from the latest 100 indexed funding transactions","responses":{"200":{"description":"Availability, confirmed funding entries, base-unit totals, checkedAt, and complete flag. When complete is false, totals cover only accepted entries in this response. Unavailable totals are null. Cached for up to 60 seconds."},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/support/verify":{"post":{"operationId":"verifyContribution","summary":"Verify an existing public transaction without broadcasting","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["transactionHash"],"properties":{"transactionHash":{"type":"string","pattern":"^[A-Fa-f0-9]{64}$"}}}}}},"responses":{"200":{"description":"Status: confirmed, pending, failed, not_a_contribution, unavailable, or unconfigured. A receipt is present only when confirmed."},"default":{"description":"Invalid input, retired testnet, request limit, or temporary storage or chain unavailability","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/healthz":{"get":{"operationId":"health","summary":"Application health (independent of chain availability)","responses":{"200":{"description":"Application is running; includes network and retirement state"}}}}}}