{"openapi":"3.1.0","info":{"title":"Kaskama API","version":"0.1.0","description":"Kaskama's HTTP API is the product; the browser app is one client of it. Identity is wallet ownership: sign a server-issued challenge, then send the returned token as `Authorization: Bearer`. There is no agent-specific account, token, or permission."},"servers":[{"url":"https://kaskama.com"}],"security":[{"bearerAuth":[]}],"externalDocs":{"url":"https://kaskama.com/docs/agent-guide.md","description":"Headless access and the signing protocol."},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Error":{"type":"object","required":["error","message","requestId"],"properties":{"error":{"type":"string","description":"Stable, machine-readable code."},"message":{"type":"string","description":"Human-readable explanation."},"requestId":{"type":"string","description":"Correlates with server logs."},"retry":{"type":"string","description":"Present when the caller should refetch before retrying.","enum":["AFTER_REFRESH"]}}},"NetworkConfig":{"type":"object","properties":{"network":{"type":"string","enum":["mainnet","testnet-10"]},"walletNetwork":{"type":"string"},"addressPrefix":{"type":"string"}}},"Profile":{"type":"object","properties":{"address":{"type":"string"},"displayAddress":{"type":"string"},"displayName":{"type":["string","null"]},"bio":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"isPublic":{"type":"boolean"}}},"CurrentSession":{"type":"object","properties":{"address":{"type":"string"},"displayName":{"type":["string","null"]},"expiresAt":{"type":"string"}}},"CreatorSearchResult":{"type":"object","properties":{"address":{"type":"string"},"displayAddress":{"type":"string"},"displayName":{"type":["string","null"]},"bio":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"lastPostedAt":{"type":["string","null"]},"membership":{"type":"object","properties":{"offered":{"type":"boolean"},"priceSompi":{"type":["string","null"]},"durationDays":{"type":"integer"}}}}},"Post":{"type":"object","properties":{"id":{"type":"string"},"creator":{"type":"string"},"caption":{"type":"string"},"priceSompi":{"type":"string"},"mediaType":{"type":"string","enum":["image/jpeg","image/png","image/webp","video/mp4","video/webm","audio/mpeg","application/pdf"],"description":"MIME type of the post's media."},"publishedAt":{"type":"string"},"canView":{"type":"boolean"}}},"Creator":{"type":"object","properties":{"address":{"type":"string"},"displayAddress":{"type":"string"},"displayName":{"type":["string","null"]},"bio":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"isPublic":{"type":"boolean"},"isOwner":{"type":"boolean"},"membership":{"type":"object","description":"The creator's subscription. `offered` is a server row, `available` is a live on-chain check, and `active` is this caller's own access; the three can disagree.","properties":{"offered":{"type":"boolean","description":"The server has a subscription offer for this creator."},"available":{"type":"boolean","description":"The offer is live on chain right now. An offer can be listed while the chain cannot serve it, so re-check before paying."},"canceled":{"type":"boolean","description":"The creator closed the offer."},"active":{"type":"boolean","description":"The wallet making this request holds an unexpired membership."},"priceSompi":{"type":["string","null"],"description":"The 30-day price in sompi."},"durationDays":{"type":"integer"},"covenantId":{"type":["string","null"],"description":"The on-chain covenant family id of the offer."}}},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}},"PreparedPayment":{"type":"object","properties":{"id":{"type":"string"},"transaction":{"type":"string","description":"An unsigned transaction JSON the client signs."},"amountSompi":{"type":"string"}}},"PreparedMembership":{"type":"object","properties":{"id":{"type":"string"},"transaction":{"type":"string","description":"An unsigned transaction JSON the client signs."},"signInputs":{"type":"array","items":{"type":"integer"},"description":"Input indices the client must sign; the server already signed the covenant inputs."}}},"SubmissionResult":{"type":"object","properties":{"state":{"type":"string","enum":["CONFIRMED","PENDING","REJECTED"]},"transactionId":{"type":["string","null"]},"covenantId":{"type":["string","null"]},"rejection":{"type":["string","null"]},"message":{"type":"string"}}},"MembershipCheck":{"type":"object","properties":{"transactionId":{"type":"string"},"outputIndex":{"type":"integer"},"covenantId":{"type":["string","null"]},"kind":{"type":"string","enum":["token","none"]},"tokenType":{"type":["string","null"]},"owner":{"type":["string","null"]},"contentCreator":{"type":["string","null"]},"platformAddress":{"type":["string","null"]},"status":{"type":"string","enum":["VALID","EXPIRED","OWNER_MISMATCH","NOT_MEMBERSHIP"]}}},"ChatMessage":{"type":"object","properties":{"id":{"type":"string"},"sender":{"type":"string"},"mine":{"type":"boolean","description":"Whether the wallet reading it wrote it."},"body":{"type":"string"},"sentAt":{"type":"string"}}},"ChatThread":{"type":"object","description":"One row of the Messages list.","properties":{"address":{"type":"string","description":"The other participant in the conversation."},"displayAddress":{"type":"string"},"displayName":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"counterpartIsCreator":{"type":"boolean","description":"True when the other person is the creator."},"lastMessage":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"unread":{"type":"integer"}}},"ChatConversation":{"type":"object","properties":{"address":{"type":"string"},"displayAddress":{"type":"string"},"displayName":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"canSend":{"type":"boolean","description":"Whether a live subscription lets this wallet write. A lapsed subscriber reads history with `canSend` false."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessage"}}}}}},"paths":{"/api/chat/threads":{"get":{"summary":"List conversations.","description":"Every off-chain conversation this wallet takes part in, newest message first. A creator sees their subscribers; a subscriber sees the creators they support.","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"threads":{"type":"array","items":{"$ref":"#/components/schemas/ChatThread"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/chat/threads/{address}":{"get":{"summary":"Read a conversation.","description":"The thread with one other wallet, either direction. Reading it marks the messages it received as read. A wallet that never subscribed and has no history gets `canSend` false and no messages.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"The other participant's wallet address."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatConversation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/chat/threads/{address}/messages":{"post":{"summary":"Send a message.","description":"Conversations are off chain and gated by subscription. Sending requires a live 30-day membership of the creator; a creator may always reply inside an existing thread. A lapsed subscriber may keep reading but cannot write until they resubscribe.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"The other participant's wallet address."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"properties":{"body":{"type":"string","description":"Up to 2000 characters."}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/config":{"get":{"summary":"Network identity.","security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkConfig"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/challenge":{"post":{"summary":"Ask for a single-use challenge to sign.","parameters":[],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"properties":{"address":{"type":"string"}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"challengeId":{"type":"string"},"message":{"type":"string"},"expiresAt":{"type":"string"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/session":{"get":{"summary":"Current identity.","security":[{"bearerAuth":[]},{}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentSession"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Exchange a signed challenge for a session token.","parameters":[],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["challengeId","address","publicKey","signature"],"properties":{"challengeId":{"type":"string"},"address":{"type":"string"},"publicKey":{"type":"string"},"signature":{"type":"string"}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"address":{"type":"string"},"expiresAt":{"type":"string"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/logout":{"post":{"summary":"Revoke the session token.","parameters":[],"security":[{"bearerAuth":[]},{}],"responses":{"204":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/profile":{"get":{"summary":"Own profile.","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Update own profile.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"type":"string"},"bio":{"type":"string","description":"The creator's bio, up to 120 characters."},"isPublic":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/profile/avatar":{"post":{"summary":"Set own avatar (multipart: avatar).","description":"Uploads a single image (JPEG, PNG or WebP, up to 5 MB). It replaces any previous avatar.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["avatar"],"properties":{"avatar":{"type":"string","format":"binary","description":"The avatar image."}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove own avatar.","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/creators/{address}/avatar":{"get":{"summary":"A creator's avatar image, if any.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Creator wallet address."}],"security":[],"responses":{"200":{"description":"Success.","content":{"application/octet-stream":{}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/creators/public":{"get":{"summary":"Public creators.","security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreatorSearchResult"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/creators/search":{"get":{"summary":"Search creators by name.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Search text."}],"security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreatorSearchResult"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/creators/{address}":{"get":{"summary":"Creator, posts, membership and unlocks.","description":"A creator's public page and, when signed in, their own access. `membership.available` is a live chain check; treat a false value as 'do not pay'.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Creator wallet address."}],"security":[{"bearerAuth":[]},{}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Creator"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/posts/{id}":{"get":{"summary":"Post metadata.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post id."}],"security":[{"bearerAuth":[]},{}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete own post.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post id."}],"responses":{"204":{"description":"Deleted."},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/posts/{id}/media":{"get":{"summary":"Full media (paid); returns the post's content type and supports Range.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post id."}],"responses":{"200":{"description":"Success.","content":{"application/octet-stream":{}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/posts/publish":{"post":{"summary":"Publish a post (multipart: caption, price, media).","description":"Publishing is free. `price` is what a buyer pays to unlock the post, in KAS with up to 8 decimals; `0` publishes it free for everyone.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["caption","price","media"],"properties":{"caption":{"type":"string"},"price":{"type":"string","description":"What a buyer pays to unlock the post, in KAS with up to 8 decimals; `0` means free."},"media":{"type":"string","format":"binary","description":"The media file: one of image/jpeg, image/png, image/webp, video/mp4, video/webm, audio/mpeg, application/pdf. Images up to 25 MB, videos up to 100 MB, audio and documents up to 25 MB."}}}}}},"responses":{"201":{"description":"Published.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected media. The code is one of UNSUPPORTED_MEDIA, IMAGE_TOO_LARGE, VIDEO_TOO_LARGE, AUDIO_TOO_LARGE, DOCUMENT_TOO_LARGE, MALFORMED_MEDIA.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/posts/{id}/payments/prepare":{"post":{"summary":"Prepare a post purchase, optionally crediting a referrer.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Post id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"referrer":{"type":"string","description":"Wallet to credit with the referral share of the platform fee (half of it), paid in the same transaction. Optional, and ignored when it is not a valid address on the server's network. The creator's payout is never reduced."}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedPayment"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/payments/{id}/finalize":{"post":{"summary":"Submit the signed payment.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Prepared payment id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string"}}}}}},"responses":{"201":{"description":"Confirmed and recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"202":{"description":"On chain but not confirmed yet. Do not submit again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/{creator}/prepare":{"post":{"summary":"Subscribe to a creator.","description":"A 30-day subscription the creator prices and a buyer pays once. The chain enforces a minimum price of 2 KAS (at most 1,000,000 KAS) and a platform fee of 1%, never below 1 KAS; the creator keeps the rest. Sign only the inputs listed in `signInputs`; the server already signed the covenant inputs. The offer must be live on chain: check `available` on GET /api/creators/{address} first.","parameters":[{"name":"creator","in":"path","required":true,"schema":{"type":"string"},"description":"Creator wallet address."}],"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedMembership"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/offers/prepare":{"post":{"summary":"Create the creator's subscription offer.","description":"A 30-day subscription the creator prices and a buyer pays once. The chain enforces a minimum price of 2 KAS (at most 1,000,000 KAS) and a platform fee of 1%, never below 1 KAS; the creator keeps the rest. Only the creator can open their own offer.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["price"],"properties":{"price":{"type":"string","description":"The subscription price in KAS, up to 8 decimals; from 2 to 1,000,000 KAS."}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedMembership"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/price/prepare":{"post":{"summary":"Change a creator's subscription price.","description":"Prepare a new price for an existing offer. A 30-day subscription the creator prices and a buyer pays once. The chain enforces a minimum price of 2 KAS (at most 1,000,000 KAS) and a platform fee of 1%, never below 1 KAS; the creator keeps the rest.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["price"],"properties":{"price":{"type":"string","description":"The subscription price in KAS, up to 8 decimals; from 2 to 1,000,000 KAS."}}}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedMembership"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/cancel/prepare":{"post":{"summary":"Close a creator's subscription offer.","description":"Prepare to close the offer permanently. Subscriptions already minted stay valid until they expire; the creator can open a new offer afterwards.","parameters":[],"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedMembership"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/offers/{id}/finalize":{"post":{"summary":"Submit the signed offer.","description":"Confirms the creator's offer on chain. The creator must sign.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Prepared offer id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string"}}}}}},"responses":{"201":{"description":"Confirmed and recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"202":{"description":"On chain but not confirmed yet. Do not submit again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/purchases/{id}/finalize":{"post":{"summary":"Submit the signed subscription.","description":"Submits the buyer's payment and records the subscription once the member output verifies on chain. Sign only the inputs listed in `signInputs`; the server already signed the covenant inputs.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Prepared purchase id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string"}}}}}},"responses":{"201":{"description":"Confirmed and recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"202":{"description":"On chain but not confirmed yet. Do not submit again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/price/{id}/finalize":{"post":{"summary":"Submit the signed price change.","description":"Applies the new price to the offer on chain.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Prepared price update id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string"}}}}}},"responses":{"201":{"description":"Confirmed and recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"202":{"description":"On chain but not confirmed yet. Do not submit again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/membership/cancel/{id}/finalize":{"post":{"summary":"Submit the signed cancellation.","description":"Closes the offer on chain. Existing subscriptions are unaffected.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Prepared cancellation id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string"}}}}}},"responses":{"201":{"description":"Confirmed and recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"202":{"description":"On chain but not confirmed yet. Do not submit again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResult"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/verify/membership/address/{address}":{"get":{"summary":"Membership status by address, from recorded covenant handles verified on chain.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"description":"Member wallet address."},{"name":"owner","in":"query","required":false,"schema":{"type":"string"},"description":"Expected owner address."}],"security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string"},"verifiedAt":{"type":"string"},"valid":{"type":"boolean"},"memberships":{"type":"array","items":{"$ref":"#/components/schemas/MembershipCheck"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/verify/membership/utxo/{transactionId}/{outputIndex}":{"get":{"summary":"Membership status from chain, by UTXO.","parameters":[{"name":"transactionId","in":"path","required":true,"schema":{"type":"string"},"description":"Mint transaction id."},{"name":"outputIndex","in":"path","required":true,"schema":{"type":"string"},"description":"Covenant output index."},{"name":"owner","in":"query","required":false,"schema":{"type":"string"},"description":"Expected owner address."}],"security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipCheck"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/feedback":{"post":{"summary":"Send short feedback.","parameters":[],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","maxLength":1500}}}}}},"responses":{"202":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict or stale state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The network refused the signed transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}