{"openapi":"3.1.1","info":{"title":"DushiDesk Public API","version":"1.0.0","description":"Vind en reserveer remote-work plekken op Curaçao, van coworking spaces en hotels tot cafés, restaurants en strandclubs. This public API is read-only and exposes only published public discovery content.","contact":{"name":"DushiDesk","url":"https://www.dushidesk.com"}},"servers":[{"url":"https://www.dushidesk.com","description":"Production"}],"tags":[{"name":"Discovery","description":"API and agent discovery endpoints."},{"name":"MCP","description":"Read-only JSON-RPC resources for AI agents."},{"name":"Workspaces","description":"Published public DushiDesk workspace listings."}],"paths":{"/api/v1":{"get":{"tags":["Discovery"],"operationId":"getApiInfo","summary":"Get public API information","responses":{"200":{"description":"Public API information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiInfo"}}}}}}},"/openapi.json":{"get":{"tags":["Discovery"],"operationId":"getOpenApiDocument","summary":"Get the public OpenAPI document","responses":{"200":{"description":"OpenAPI 3.1.1 document for public read-only endpoints.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/mcp":{"get":{"tags":["MCP"],"operationId":"getPublicMcpDiscovery","summary":"Get public MCP discovery metadata","responses":{"200":{"description":"Read-only public MCP discovery metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMcpDiscovery"}}}}}},"post":{"tags":["MCP"],"operationId":"callPublicMcpJsonRpc","summary":"Call the read-only public JSON-RPC MCP endpoint","description":"Supports initialize, server/discover, resources/list, resources/read and tools/list. The public endpoint has no write tools.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"400":{"$ref":"#/components/responses/InvalidJsonRpc"}}}},"/api/v1/workspaces":{"get":{"tags":["Workspaces"],"operationId":"listWorkspaces","summary":"List published workspaces","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Workspace type filter, for example Hotel, Cafe, Coworking, Restaurant, Strandclub or Villa."},{"name":"search","in":"query","required":false,"schema":{"type":"string"},"description":"Case-insensitive search over workspace names."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Published workspace list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceListResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/workspaces/{slug}":{"get":{"tags":["Workspaces"],"operationId":"getWorkspaceBySlug","summary":"Get one published workspace by slug","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Published workspace detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceDetailResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"responses":{"NotFound":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"RateLimited":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"InvalidJsonRpc":{"description":"Invalid JSON-RPC request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}}},"schemas":{"ApiInfo":{"type":"object","required":["name","version","endpoints","documentation"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}}}},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"}}},"PublicMcpDiscovery":{"type":"object","required":["name","description","homepage","constraints","capabilities","methods"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"homepage":{"type":"string","format":"uri"},"protocol":{"type":"string"},"serverInfo":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}}},"capabilities":{"type":"object","properties":{"resources":{"type":"object","additionalProperties":true},"tools":{"type":"object","additionalProperties":true},"prompts":{"type":"object","additionalProperties":true}}},"methods":{"type":"array","items":{"type":"string"}},"constraints":{"type":"object","required":["readOnly","publicContentOnly","noAuthRequired"],"properties":{"readOnly":{"type":"boolean"},"publicContentOnly":{"type":"boolean"},"noAuthRequired":{"type":"boolean"}}}},"additionalProperties":true},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"method":{"type":"string","enum":["initialize","server/discover","resources/list","resources/read","tools/list"]},"params":{"type":"object","properties":{"uri":{"type":"string","examples":["dushidesk://workspaces"]}},"additionalProperties":true}},"additionalProperties":false},"JsonRpcResponse":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]},"JsonRpcSuccessResponse":{"type":"object","required":["jsonrpc","id","result"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"result":{"type":"object","additionalProperties":true}}},"JsonRpcErrorResponse":{"type":"object","required":["jsonrpc","id","error"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"WorkspaceListResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicWorkspace"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}},"WorkspaceDetailResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PublicWorkspaceDetail"}}},"PaginationMeta":{"type":"object","required":["total","limit","offset"],"properties":{"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1},"offset":{"type":"integer","minimum":0}}},"PublicWorkspace":{"type":"object","required":["id","name","slug","type","location","pricePerDay","rating","reviewCount","amenities","capacity","wifiType","featured","paymentMethods"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"type":{"type":"string"},"location":{"type":"string"},"pricePerDay":{"type":"integer","description":"Stored in EUR cents for internal compatibility; display may convert to XCG."},"rating":{"type":"string"},"reviewCount":{"type":"integer"},"image":{"type":["string","null"],"format":"uri-reference"},"latitude":{"type":["string","null"]},"longitude":{"type":["string","null"]},"amenities":{"type":"array","items":{"type":"string"}},"capacity":{"type":"integer"},"wifiType":{"type":"string"},"featured":{"type":"boolean"},"externalBookingUrl":{"type":["string","null"],"format":"uri"},"priceRange":{"type":["string","null"],"enum":["$","$$","$$$",null]},"consumptionRequired":{"type":["boolean","null"]},"paymentMethods":{"type":"array","items":{"type":"string"}}}},"PublicWorkspaceDetail":{"allOf":[{"$ref":"#/components/schemas/PublicWorkspace"},{"type":"object","properties":{"descriptionNl":{"type":["string","null"]},"descriptionEn":{"type":["string","null"]},"descriptionPap":{"type":["string","null"]},"cancellationPolicy":{"type":"string"},"bookingMode":{"type":"string"},"isVerified":{"type":["boolean","null"]},"options":{"type":"array","items":{"$ref":"#/components/schemas/WorkspaceOption"}},"meetingRooms":{"type":"array","items":{"$ref":"#/components/schemas/MeetingRoom"}},"reviews":{"type":"array","items":{"$ref":"#/components/schemas/PublicReview"}}}}]},"WorkspaceOption":{"type":"object","required":["id","nameNl","nameEn","namePap","pricePerDay","sortOrder"],"properties":{"id":{"type":"string","format":"uuid"},"nameNl":{"type":"string"},"nameEn":{"type":"string"},"namePap":{"type":"string"},"descriptionNl":{"type":["string","null"]},"descriptionEn":{"type":["string","null"]},"descriptionPap":{"type":["string","null"]},"pricePerDay":{"type":"integer"},"sortOrder":{"type":"integer"}}},"MeetingRoom":{"type":"object","required":["id","nameNl","nameEn","namePap","capacity","pricePerHour"],"properties":{"id":{"type":"string","format":"uuid"},"nameNl":{"type":"string"},"nameEn":{"type":"string"},"namePap":{"type":"string"},"capacity":{"type":"integer"},"pricePerHour":{"type":"integer"}}},"PublicReview":{"type":"object","required":["id","authorName","rating","text","photos","date"],"properties":{"id":{"type":"string","format":"uuid"},"authorName":{"type":"string"},"rating":{"type":"integer","minimum":1,"maximum":5},"text":{"type":"string"},"photos":{"type":"array","items":{"type":"string"}},"date":{"type":"string","format":"date"},"hostReply":{"type":["string","null"]}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}}}},"externalDocs":{"description":"Human and AI-readable discovery index","url":"https://www.dushidesk.com/llms.txt"}}