{"openapi":"3.1.0","info":{"title":"Neblla public API","version":"1.0.0","description":"Public HTTP surface of Neblla. Building and managing apps is done through the MCP server (https://neblla.com/mcp, OAuth 2.1, see /.well-known/mcp.json); in-game features through the JavaScript SDK (https://neblla.com/connect/app/{appId}). Docs: https://neblla.com/docs","contact":{"email":"hello@neblla.com","url":"https://neblla.com"}},"servers":[{"url":"https://neblla.com"}],"externalDocs":{"url":"https://neblla.com/docs","description":"Developer docs"},"paths":{"/api/gallery/items":{"get":{"summary":"List published apps in the gallery","operationId":"listGalleryItems","parameters":[{"name":"search","in":"query","schema":{"type":"string"},"description":"Text search over name, gallery titles/descriptions (all languages) and exact tags"},{"name":"category","in":"query","schema":{"type":"string","enum":["all","game","app","web","singleplayer","multiplayer"]},"description":"What it is: game, app or web. singleplayer and multiplayer are the old names of game + solo / game + online"},{"name":"mode","in":"query","schema":{"type":"string","enum":["solo","online","party","coop","world","personal","live","community","business","showcase","shop","booking","members"]},"description":"How it is played or used (depends on the kind)"},{"name":"theme","in":"query","schema":{"type":"string","enum":["strategy","puzzle","obby","action","adventure","cards","words","party","sports","building","productivity","creativity","social","utilities","commerce","food","wellbeing","clubs","culture","professionals","education","music","health"]},"description":"What it is about"},{"name":"best_on","in":"query","schema":{"type":"string","enum":["all","mobile","desktop"]}},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string","example":"en"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"A page of gallery items","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/gallery/items/{id}":{"get":{"summary":"One published app with its reviews","operationId":"getGalleryItem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Gallery id, app id or slug"}],"responses":{"200":{"description":"The item","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Not found / not published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/stripe/products/public/{appId}":{"get":{"summary":"Products an app sells (only published ones)","operationId":"listPublicProducts","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Products","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/connect/app/{appId}":{"get":{"summary":"The JavaScript SDK for an app (load it with a <script> tag)","operationId":"getSdk","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"To the SDK file for the app's modules (/connect/sdk/<modules>.<hash>.js), cached for good. The SDK then asks /connect/live for the app's config."}}}},"/connect/live":{"post":{"summary":"Called by the SDK when it starts: the app (from the page's Origin, or the id in the SDK tag) and its config. Charged once per visit let in.","operationId":"sdkLive","requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"JSON: { app?: appId }"}}}},"responses":{"200":{"description":"The app's config","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No app at this origin"},"429":{"description":"The app is out of daily credits, or too many calls from this address"}}}},"/connect/handover":{"post":{"summary":"Used by the page an app's old address answers with: leaves what the browser kept there for the app (its session, login, community keys) for two minutes under a one-time code, for the app's own address to claim","operationId":"handoverStore","requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"JSON: { app: appId, keys: { name: value } }"}}}},"responses":{"200":{"description":"{ code }","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not that app's keys, or no such app"},"403":{"description":"Not from a Neblla address"},"429":{"description":"Too many calls from this address"},"503":{"description":"Too many hand-overs held right now"}}}},"/connect/handover/claim":{"post":{"summary":"Called by the SDK at the app's own address with the code from #nbla_ho=: what was left there, once, from the same browser","operationId":"handoverClaim","requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"JSON: { code }"}}}},"responses":{"200":{"description":"{ appId, keys }","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No such code, or not for this app"}}}},"/mcp":{"post":{"summary":"MCP server (streamable HTTP, JSON-RPC). OAuth 2.1 bearer token except for 3 discovery tools.","operationId":"mcp","security":[{"oauth2":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON-RPC 2.0 message"}}}},"responses":{"200":{"description":"JSON-RPC response"},"401":{"description":"Authentication required (see WWW-Authenticate / protected resource metadata)"}}}},"/llms.txt":{"get":{"summary":"Guide for LLMs (index)","operationId":"llmsIndex","responses":{"200":{"description":"text/plain","content":{"text/plain":{}}}}}},"/llms/{chapter}.txt":{"get":{"summary":"One chapter of the guide","operationId":"llmsChapter","parameters":[{"name":"chapter","in":"path","required":true,"schema":{"type":"string","enum":["empezar","core","salas","servidor","identidad","social","comunidad","pagos","ia","mundo","sonido","creator","publicar","referencia","mcp"]}}],"responses":{"200":{"description":"text/plain","content":{"text/plain":{}}}}}},"/llms-full.txt":{"get":{"summary":"The whole guide in one file","operationId":"llmsFull","responses":{"200":{"description":"text/plain","content":{"text/plain":{}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}},"securitySchemes":{"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://developers.neblla.com/oauth/authorize","tokenUrl":"https://developers.neblla.com/oauth/token","scopes":{}}}}}}}