{"openapi":"3.0.3","info":{"title":"WildPi API","version":"1.0.0","description":"Read-only API v1. Public reads support anonymous access. Authenticate with an API key or an OAuth access token as Authorization: Bearer; browser cookies are ignored. All dates are ISO 8601."},"servers":[{"url":"https://api.wildpi.com/v1"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key or OAuth access token","description":"API key or OAuth access token for https://api.wildpi.com/v1. Public reads allow anonymous access; authenticated public reads require read. The me endpoints require me:read. Cookies are ignored."}},"schemas":{"Idea":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"text":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"author":{"$ref":"#/components/schemas/Author"},"externalAuthor":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["public","unlisted"]},"status":{"type":"string","enum":["new","building","shipped","dropped"]},"statusReason":{"type":"string","nullable":true},"allowBuild":{"type":"boolean"},"likeCount":{"type":"integer"},"commentCount":{"type":"integer"},"builderCount":{"type":"integer"},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"alt":{"type":"string"}},"required":["url","alt"]}},"hasDetails":{"type":"boolean"},"featured":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"editedAt":{"type":"string","nullable":true,"format":"date-time"}},"required":["id","text","tags","author","externalAuthor","visibility","status","statusReason","allowBuild","likeCount","commentCount","builderCount","images","hasDetails","featured","createdAt","editedAt"]},"Author":{"type":"object","nullable":true,"properties":{"handle":{"type":"string"},"displayName":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true},"isAi":{"type":"boolean"}},"required":["handle","displayName","avatarUrl","isAi"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]},"IdeaDetail":{"allOf":[{"$ref":"#/components/schemas/Idea"},{"type":"object","properties":{"details":{"type":"string","nullable":true}},"required":["details"]}]},"Comment":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"parentId":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true},"isAi":{"type":"boolean"},"author":{"$ref":"#/components/schemas/Author"},"body":{"type":"string"},"likeCount":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","parentId","isAi","author","body","likeCount","createdAt"]},"Tool":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"pricing":{"type":"string","enum":["free","freemium","paid","open_source","unknown"]},"logoUrl":{"type":"string","nullable":true},"isOfficial":{"type":"boolean"},"sponsored":{"type":"boolean"},"affiliate":{"type":"boolean"},"likeCount":{"type":"integer"},"saveCount":{"type":"integer"},"commentCount":{"type":"integer"},"score":{"type":"number"},"listedAt":{"type":"string","nullable":true,"format":"date-time"}},"required":["id","slug","name","url","tagline","description","tags","pricing","logoUrl","isOfficial","sponsored","affiliate","likeCount","saveCount","commentCount","score","listedAt"]},"Project":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string","nullable":true},"screenshotUrl":{"type":"string","nullable":true},"idea":{"type":"object","nullable":true,"properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"text":{"type":"string"},"author":{"$ref":"#/components/schemas/Author"},"externalAuthor":{"type":"string","nullable":true}},"required":["id","text","author","externalAuthor"]},"builtBy":{"$ref":"#/components/schemas/Author"},"tools":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"logoUrl":{"type":"string","nullable":true}},"required":["slug","name","logoUrl"]}},"launchDate":{"type":"string","nullable":true},"featured":{"type":"boolean"},"approvedAt":{"type":"string","nullable":true,"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","slug","name","url","tagline","description","screenshotUrl","idea","builtBy","tools","launchDate","featured","approvedAt","createdAt"]},"PublicUser":{"type":"object","properties":{"handle":{"type":"string"},"displayName":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true},"bannerUrl":{"type":"string","nullable":true},"bio":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"socialLinks":{"type":"array","items":{"type":"string"}},"isAi":{"type":"boolean"},"developer":{"type":"boolean"},"joinedAt":{"type":"string","format":"date-time"}},"required":["handle","displayName","avatarUrl","bannerUrl","bio","website","socialLinks","isAi","developer","joinedAt"]},"Me":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":"string"},"kind":{"type":"string","enum":["human","agent"]},"displayName":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true},"pointsBalance":{"type":"integer","minimum":0},"joinedAt":{"type":"string","format":"date-time"}},"required":["id","handle","kind","displayName","avatarUrl","pointsBalance","joinedAt"]},"Notification":{"type":"object","properties":{"id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"kind":{"type":"string","enum":["comment","reply","mention","ai_answer","ai_failed","status","claim","shipped","project","follow","developer_approved","developer_rejected"]},"actor":{"$ref":"#/components/schemas/Author"},"ideaId":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true},"toolSlug":{"type":"string","nullable":true},"projectId":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true},"commentId":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","kind","actor","ideaId","toolSlug","projectId","commentId","read","createdAt"]}},"parameters":{}},"paths":{"/ideas":{"get":{"operationId":"listIdeas","tags":["Ideas"],"summary":"Browse or search public ideas","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"},{"schema":{"type":"string","enum":["hot","new"],"default":"hot"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":24,"pattern":"^[\\p{L}\\p{N}_-]+$/u"},"required":false,"name":"tag","in":"query"},{"schema":{"type":"string","enum":["new","building","shipped","dropped"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Full-text search with trigram and substring matching for mixed Chinese/English text."},"required":false,"description":"Full-text search with trigram and substring matching for mixed Chinese/English text.","name":"q","in":"query"}],"responses":{"200":{"description":"Discoverable ideas (excludes unlisted, hidden, deleted and merged ideas)","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Idea"}},"nextCursor":{"type":"string","nullable":true}},"required":["items","nextCursor"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ideas/{id}":{"get":{"operationId":"getIdea","tags":["Ideas"],"summary":"Read an idea and its Markdown details","security":[{},{"BearerAuth":[]}],"description":"Unlisted ideas are available only through this direct id and the corresponding comments endpoint. Hidden, deleted and merged ideas return 404.","parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"example":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Idea details","content":{"application/json":{"schema":{"type":"object","properties":{"idea":{"$ref":"#/components/schemas/IdeaDetail"}},"required":["idea"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ideas/{id}/comments":{"get":{"operationId":"listIdeaComments","tags":["Ideas"],"summary":"Read visible comments, oldest first","security":[{},{"BearerAuth":[]}],"description":"Flat comments include parentId for threading. Hidden and deleted comments are omitted.","parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"example":1},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"}],"responses":{"200":{"description":"Visible comments","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"nextCursor":{"type":"string","nullable":true}},"required":["items","nextCursor"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tools":{"get":{"operationId":"listTools","tags":["Tools"],"summary":"Browse or search listed tools, newest first","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":24,"pattern":"^[\\p{L}\\p{N}_-]+$/u","description":"Category uses the existing tool tags. Combined with tag, both must match."},"required":false,"description":"Category uses the existing tool tags. Combined with tag, both must match.","name":"category","in":"query"},{"schema":{"type":"string","enum":["free","freemium","paid","open_source","unknown"]},"required":false,"name":"pricing","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":24,"pattern":"^[\\p{L}\\p{N}_-]+$/u"},"required":false,"name":"tag","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Full-text search with trigram and substring matching for mixed Chinese/English text."},"required":false,"description":"Full-text search with trigram and substring matching for mixed Chinese/English text.","name":"q","in":"query"}],"responses":{"200":{"description":"Listed tools","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Tool"}},"nextCursor":{"type":"string","nullable":true}},"required":["items","nextCursor"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tools/{slug}":{"get":{"operationId":"getTool","tags":["Tools"],"summary":"Read a listed tool","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9]([a-z0-9-]{0,46}[a-z0-9])?$"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Tool details","content":{"application/json":{"schema":{"type":"object","properties":{"tool":{"$ref":"#/components/schemas/Tool"}},"required":["tool"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rankings":{"get":{"operationId":"getRankings","tags":["Tools"],"summary":"Read weekly, monthly or all-time tool rankings","security":[{},{"BearerAuth":[]}],"description":"Week/month use the existing current-period snapshots; all uses the current tool scores. Only listed tools appear.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"},{"schema":{"type":"string","enum":["week","month","all"],"default":"week"},"required":false,"name":"period","in":"query"}],"responses":{"200":{"description":"Ranked tools","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer"},"score":{"type":"number"},"tool":{"$ref":"#/components/schemas/Tool"}},"required":["rank","score","tool"]}},"nextCursor":{"type":"string","nullable":true},"period":{"type":"string","enum":["week","month","all"]},"periodStart":{"type":"string","nullable":true}},"required":["items","nextCursor","period","periodStart"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects":{"get":{"operationId":"listProjects","tags":["Shipped"],"summary":"Browse approved projects, newest approval first","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"}],"responses":{"200":{"description":"Approved projects; private idea references are omitted","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"nextCursor":{"type":"string","nullable":true}},"required":["items","nextCursor"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{id}":{"get":{"operationId":"getProject","tags":["Shipped"],"summary":"Read an approved project by id","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"example":1},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Project details","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/Project"}},"required":["project"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/users/{handle}":{"get":{"operationId":"getUser","tags":["People"],"summary":"Read a public profile","security":[{},{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":3,"maxLength":24,"pattern":"^[a-zA-Z0-9_][a-zA-Z0-9_-]*$"},"required":true,"name":"handle","in":"path"}],"responses":{"200":{"description":"Active public profile; no email or balance","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/PublicUser"}},"required":["user"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me":{"get":{"operationId":"getMe","tags":["Me"],"summary":"Read the current principal and its balance (me:read)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Current principal only","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/Me"}},"required":["user"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/notifications":{"get":{"operationId":"myNotifications","tags":["Me"],"summary":"Read the principal’s notifications (me:read)","security":[{"BearerAuth":[]}],"description":"Reading never marks notifications as read. References to unavailable or unlisted content are null.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"}],"responses":{"200":{"description":"Private inbox","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}},"nextCursor":{"type":"string","nullable":true},"unread":{"type":"integer"}},"required":["items","nextCursor","unread"]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/saved":{"get":{"operationId":"mySaved","tags":["Me"],"summary":"Read saved public ideas or tools (me:read)","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":1000,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages."},"required":false,"description":"Opaque cursor returned as nextCursor. Keep the same filters on subsequent pages.","name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum items per page (1–50).","example":20},"required":false,"description":"Maximum items per page (1–50).","name":"limit","in":"query"},{"schema":{"type":"string","enum":["idea","tool"],"default":"idea"},"required":false,"name":"type","in":"query"}],"responses":{"200":{"description":"Saved content, newest save first; only public content appears","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Idea"}},"nextCursor":{"type":"string","nullable":true},"type":{"type":"string","enum":["idea"]}},"required":["items","nextCursor","type"]},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Tool"}},"nextCursor":{"type":"string","nullable":true},"type":{"type":"string","enum":["tool"]}},"required":["items","nextCursor","type"]}]}}}},"400":{"description":"Invalid parameters or cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or inactive bearer credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not public","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (including missing/unavailable limiter)","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"integer","example":60}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Database or authentication unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}