{"openapi":"3.0.0","info":{"title":"NexoDash API","version":"1.0.0","description":"\n# NexoDash API Documentation\n\nComprehensive API documentation for NexoDash - A modern business management platform.\n\n## Features\n- 🏢 Business management and directory\n- 📦 Product and service catalogs\n- ⭐ Review and rating system\n- 📊 Analytics and monitoring\n- 🔐 Secure authentication\n\n## Rate Limiting\nAll public endpoints are rate-limited to prevent abuse:\n- **100 requests per 15 minutes** per IP address\n- Rate limit headers are included in responses\n\n## Response Codes\n- `200` - Success\n- `400` - Bad Request (validation error)\n- `401` - Unauthorized (authentication required)\n- `403` - Forbidden (insufficient permissions)\n- `404` - Not Found\n- `429` - Too Many Requests (rate limit exceeded)\n- `500` - Internal Server Error\n- `503` - Service Unavailable\n\n## Support\nFor API support, contact: support@nexodash.com\n    ","contact":{"name":"NexoDash Support","email":"support@nexodash.com"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://nexodash.com","description":"Production server"},{"url":"http://localhost:3002","description":"Development server"}],"tags":[{"name":"Health","description":"System health and monitoring endpoints"},{"name":"Businesses","description":"Business directory and information"},{"name":"Reviews","description":"Customer reviews and ratings"},{"name":"Products","description":"Product catalog management"},{"name":"Services","description":"Service offerings"},{"name":"Categories","description":"Business and product categories"}],"paths":{"/api/health":{"get":{"tags":["Health"],"summary":"System health check","description":"Returns comprehensive system health status including database, Redis, memory, and environment checks","operationId":"getHealth","responses":{"200":{"description":"System is healthy or degraded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"503":{"description":"System is unhealthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/monitoring":{"get":{"tags":["Health"],"summary":"Monitoring metrics","description":"Returns detailed monitoring metrics including cache statistics, performance data, and request logs","operationId":"getMonitoring","parameters":[{"name":"timeWindow","in":"query","description":"Time window in minutes for metrics aggregation","required":false,"schema":{"type":"integer","default":60,"minimum":1,"maximum":1440}}],"responses":{"200":{"description":"Monitoring metrics retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitoringResponse"}}}}}}},"/api/public/businesses":{"get":{"tags":["Businesses"],"summary":"List all businesses","description":"Returns a paginated list of active businesses with optional filtering and sorting","operationId":"listBusinesses","parameters":[{"name":"page","in":"query","description":"Page number (0-based)","required":false,"schema":{"type":"integer","default":0,"minimum":0}},{"name":"limit","in":"query","description":"Items per page","required":false,"schema":{"type":"integer","default":24,"minimum":1,"maximum":100}},{"name":"category","in":"query","description":"Filter by category slug or business type","required":false,"schema":{"type":"string"}},{"name":"city","in":"query","description":"Filter by city slug or name","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Search businesses by name, description or city","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of businesses retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessListResponse"}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/public/business/{slug}":{"get":{"tags":["Businesses"],"summary":"Get business by slug","description":"Returns detailed information about a specific business","operationId":"getBusinessBySlug","parameters":[{"name":"slug","in":"path","description":"Business slug (URL-friendly identifier)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Business details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessDetail"}}}},"404":{"description":"Business not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/public/reviews":{"get":{"tags":["Reviews"],"summary":"List reviews","description":"Returns a paginated list of reviews for a specific business","operationId":"listReviews","parameters":[{"name":"businessId","in":"query","description":"Business ID to get reviews for","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Number of reviews to return","required":false,"schema":{"type":"integer","default":10,"minimum":1,"maximum":100}},{"name":"page","in":"query","description":"One-based results page; values beyond the result set use the last page","required":false,"schema":{"type":"integer","default":1,"minimum":1,"maximum":10000}},{"name":"rating","in":"query","description":"Exact star rating to include","required":false,"schema":{"type":"integer","minimum":1,"maximum":5}},{"name":"sortBy","in":"query","description":"Review ordering","required":false,"schema":{"type":"string","default":"date-desc","enum":["date-desc","date-asc","rating-desc","rating-asc"]}}],"responses":{"200":{"description":"Reviews retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewListResponse"}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Tenant or business not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Reviews could not be retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Tenant context is temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"],"description":"Overall system health status"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp of health check"},"version":{"type":"string","description":"Application version"},"environment":{"type":"string","description":"Deployment environment"},"uptime":{"type":"number","description":"System uptime in seconds"},"checks":{"type":"object","properties":{"database":{"$ref":"#/components/schemas/HealthCheck"},"redis":{"$ref":"#/components/schemas/HealthCheck"},"memory":{"$ref":"#/components/schemas/HealthCheck"},"environment":{"$ref":"#/components/schemas/HealthCheck"}}},"duration":{"type":"number","description":"Health check duration in milliseconds"}}},"HealthCheck":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"responseTime":{"type":"number","description":"Response time in milliseconds"},"error":{"type":"string","description":"Error message if unhealthy"},"details":{"type":"object","additionalProperties":true}}},"MonitoringResponse":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"timeWindow":{"type":"object","properties":{"minutes":{"type":"integer"},"description":{"type":"string"}}},"metrics":{"type":"object","properties":{"cacheHitRate":{"type":"number","description":"Cache hit rate percentage"},"avgResponseTime":{"type":"number","description":"Average response time in milliseconds"},"activeConnections":{"type":"integer","description":"Number of active connections"}}},"endpoints":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string"},"responseTime":{"type":"number"}}}}}},"BusinessListResponse":{"type":"object","properties":{"businesses":{"type":"array","items":{"$ref":"#/components/schemas/BusinessSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"BusinessSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"logo":{"type":"string","nullable":true},"rating":{"type":"number","format":"float","minimum":0,"maximum":5},"reviewCount":{"type":"integer"},"category":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}}}},"BusinessDetail":{"allOf":[{"$ref":"#/components/schemas/BusinessSummary"},{"type":"object","properties":{"address":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"website":{"type":"string","format":"uri"},"hours":{"type":"object","additionalProperties":{"type":"string"}},"socialLinks":{"type":"object","properties":{"facebook":{"type":"string"},"instagram":{"type":"string"},"twitter":{"type":"string"},"linkedin":{"type":"string"}}},"products":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}]},"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"price":{"type":"number","format":"decimal"},"image":{"type":"string","nullable":true},"stock":{"type":"integer"}}},"Service":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"price":{"type":"number","format":"decimal"},"duration":{"type":"integer","description":"Duration in minutes"}}},"ReviewListResponse":{"type":"object","required":["reviews","stats","pagination"],"properties":{"reviews":{"type":"array","items":{"$ref":"#/components/schemas/Review"}},"stats":{"type":"object","required":["total","average","distribution"],"properties":{"total":{"type":"integer","minimum":0},"average":{"type":"number","format":"float","minimum":0,"maximum":5},"distribution":{"type":"object","required":["1","2","3","4","5"],"properties":{"1":{"type":"integer","minimum":0},"2":{"type":"integer","minimum":0},"3":{"type":"integer","minimum":0},"4":{"type":"integer","minimum":0},"5":{"type":"integer","minimum":0}}}}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Review":{"type":"object","required":["id","rating","comment","response","respondedAt","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"rating":{"type":"integer","minimum":1,"maximum":5},"comment":{"type":"string","nullable":true},"response":{"type":"string","nullable":true},"respondedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"customer":{"type":"object","nullable":true,"required":["name"],"properties":{"name":{"type":"string"},"avatar":{"type":"string","nullable":true}}}}},"Pagination":{"type":"object","properties":{"page":{"type":"integer","minimum":1},"limit":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","description":"Error message"},"code":{"type":"string","description":"Error code"},"details":{"type":"object","additionalProperties":true,"description":"Additional error details"}}}}}}