{ "tags": [ { "name": "health", "description": "Health operations", "endpoints": [ { "operationId": "healthCheck", "method": "GET", "path": "/healthz", "summary": "Health check", "description": "Returns server health status", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Healthy", "schema": { "kind": "ref", "value": "HealthStatus" } } ] }, { "operationId": "getVersion", "method": "GET", "path": "/version", "summary": "Build version information", "description": "Returns the running build version, commit SHA and build date", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Version information", "schema": { "kind": "ref", "value": "VersionInfo" } } ] } ] }, { "name": "tools", "description": "Tool management", "endpoints": [ { "operationId": "listTools", "method": "GET", "path": "/tools", "summary": "List all tools", "description": "", "parameters": [ { "name": "category", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "" }, { "name": "search", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "" }, { "name": "sort", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "newest, top_rated, most_reviewed, name_asc, name_desc, recently_updated" }, { "name": "tags", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "Comma-separated tags; tool must include all of them", "constraints": "" }, { "name": "features", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "Comma-separated features; tool must include all of them", "constraints": "" }, { "name": "minRating", "in": "query", "required": false, "type": { "kind": "type", "value": "number" }, "description": "Minimum average combined rating (0-5)", "constraints": "0–5" } ], "requestBody": null, "responses": [ { "status": "200", "description": "List of tools", "schema": { "kind": "array", "value": "ToolWithStats" } } ] }, { "operationId": "createTool", "method": "POST", "path": "/tools", "summary": "Create a new tool", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "ToolInput" } }, "responses": [ { "status": "201", "description": "Created tool", "schema": { "kind": "ref", "value": "Tool" } }, { "status": "400", "description": "Validation error", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "listCompareTools", "method": "GET", "path": "/compare", "summary": "Compare tools side by side (premium)", "description": "", "parameters": [ { "name": "ids", "in": "query", "required": true, "type": { "kind": "type", "value": "string" }, "description": "Comma-separated tool ids", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Tools in requested order", "schema": { "kind": "array", "value": "ToolWithStats" } }, { "status": "401", "description": "Authentication required", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "403", "description": "Premium feature required", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "getToolRatingHistory", "method": "GET", "path": "/tools/{id}/rating-history", "summary": "Get a tool's rating history over time", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Rating history", "schema": { "kind": "array", "value": "RatingHistoryItem" } }, { "status": "400", "description": "Invalid id", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "getTool", "method": "GET", "path": "/tools/{id}", "summary": "Get a tool by ID", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Tool details", "schema": { "kind": "ref", "value": "ToolWithStats" } }, { "status": "404", "description": "Not found", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "updateTool", "method": "PATCH", "path": "/tools/{id}", "summary": "Update a tool", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "ToolUpdate" } }, "responses": [ { "status": "200", "description": "Updated tool", "schema": { "kind": "ref", "value": "Tool" } }, { "status": "404", "description": "Not found", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "deleteTool", "method": "DELETE", "path": "/tools/{id}", "summary": "Delete a tool", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "204", "description": "Deleted", "schema": { "kind": "type", "value": "any" } }, { "status": "404", "description": "Not found", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "listTrashedTools", "method": "GET", "path": "/tools/trash", "summary": "List trashed (soft-deleted) tools", "description": "", "parameters": [ { "name": "search", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "List of trashed tools", "schema": { "kind": "array", "value": "Tool" } }, { "status": "403", "description": "Feature \"trash\" requires a higher tier", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "trashTools", "method": "POST", "path": "/tools/trash", "summary": "Move tools to trash (admin)", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "TrashToolsInput" } }, "responses": [ { "status": "200", "description": "Tools trashed", "schema": { "kind": "type", "value": "object" } }, { "status": "403", "description": "Admin required", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "deleteTrashedTools", "method": "DELETE", "path": "/tools/trash", "summary": "Permanently delete trashed tools (admin)", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "TrashToolsInput" } }, "responses": [ { "status": "204", "description": "Deleted", "schema": { "kind": "type", "value": "any" } }, { "status": "403", "description": "Admin required", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "restoreTools", "method": "POST", "path": "/tools/trash/restore", "summary": "Restore trashed tools", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "TrashToolsInput" } }, "responses": [ { "status": "200", "description": "Tools restored", "schema": { "kind": "type", "value": "object" } }, { "status": "403", "description": "Feature \"trash\" requires a higher tier", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "emptyTrash", "method": "POST", "path": "/tools/trash/empty", "summary": "Permanently delete all trashed tools (admin)", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Trash emptied", "schema": { "kind": "type", "value": "object" } }, { "status": "403", "description": "Admin required", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "listCategories", "method": "GET", "path": "/categories", "summary": "List all distinct tool categories", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Categories list", "schema": { "kind": "array", "value": "string" } } ] }, { "operationId": "listAllFeatures", "method": "GET", "path": "/features/all", "summary": "List all distinct feature strings across all tools", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "All known features", "schema": { "kind": "array", "value": "string" } } ] }, { "operationId": "listAllTags", "method": "GET", "path": "/tags/all", "summary": "List all distinct tag strings across all tools", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "All known tags", "schema": { "kind": "array", "value": "string" } } ] } ] }, { "name": "ratings", "description": "Tool ratings", "endpoints": [ { "operationId": "listToolRatings", "method": "GET", "path": "/tools/{id}/ratings", "summary": "List ratings for a tool", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Ratings list", "schema": { "kind": "array", "value": "Rating" } } ] }, { "operationId": "createRating", "method": "POST", "path": "/tools/{id}/ratings", "summary": "Submit a rating for a tool", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "RatingInput" } }, "responses": [ { "status": "201", "description": "Created rating", "schema": { "kind": "ref", "value": "Rating" } }, { "status": "400", "description": "Validation error", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "404", "description": "Tool not found", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] } ] }, { "name": "analytics", "description": "Analytics and aggregated statistics", "endpoints": [ { "operationId": "getAnalyticsSummary", "method": "GET", "path": "/analytics/summary", "summary": "Overall platform statistics", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Platform-level summary stats", "schema": { "kind": "ref", "value": "AnalyticsSummary" } } ] }, { "operationId": "getTopTools", "method": "GET", "path": "/analytics/top-tools", "summary": "Top-rated tools", "description": "", "parameters": [ { "name": "limit", "in": "query", "required": false, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" }, { "name": "metric", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "usefulness, usability, combined" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Top tools list", "schema": { "kind": "array", "value": "TopToolEntry" } } ] }, { "operationId": "getAnalyticsByCategory", "method": "GET", "path": "/analytics/by-category", "summary": "Rating statistics grouped by category", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Per-category statistics", "schema": { "kind": "array", "value": "CategoryStats" } } ] }, { "operationId": "getRatingDistribution", "method": "GET", "path": "/analytics/rating-distribution", "summary": "Distribution of rating scores across the platform", "description": "", "parameters": [ { "name": "toolId", "in": "query", "required": false, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Rating score distribution", "schema": { "kind": "ref", "value": "RatingDistribution" } } ] } ] }, { "name": "auth", "description": "Authentication", "endpoints": [ { "operationId": "getAuthMode", "method": "GET", "path": "/auth/mode", "summary": "Get authentication mode (oidc or local)", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Auth mode", "schema": { "kind": "ref", "value": "AuthMode" } } ] }, { "operationId": "getCsrfToken", "method": "GET", "path": "/auth/csrf", "summary": "Get a CSRF token for state-changing requests", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "CSRF token", "schema": { "kind": "ref", "value": "CsrfToken" } } ] }, { "operationId": "localLogin", "method": "POST", "path": "/auth/login", "summary": "Local username/password login", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "LocalLoginInput" } }, "responses": [ { "status": "200", "description": "Logged in successfully", "schema": { "kind": "ref", "value": "AuthUser" } }, { "status": "401", "description": "Invalid credentials", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "getMe", "method": "GET", "path": "/auth/me", "summary": "Get current authenticated user", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Current user info", "schema": { "kind": "ref", "value": "AuthUser" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "changeMyPassword", "method": "POST", "path": "/auth/me/password", "summary": "Change own password (local users only)", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "ChangePasswordInput" } }, "responses": [ { "status": "204", "description": "Password changed", "schema": { "kind": "type", "value": "any" } }, { "status": "400", "description": "Invalid input or wrong current password", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "422", "description": "OIDC user - password is managed by the identity provider", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "429", "description": "Too many attempts", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "getPasswordRedirect", "method": "GET", "path": "/auth/password-redirect", "summary": "Get redirect URL for managing credentials in the identity provider", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Redirect URL (null in local mode)", "schema": { "kind": "ref", "value": "PasswordRedirect" } } ] }, { "operationId": "getMePreferences", "method": "GET", "path": "/auth/me/preferences", "summary": "Get current user's browse preferences", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "User preferences", "schema": { "kind": "ref", "value": "UserPreferences" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "updateMePreferences", "method": "PUT", "path": "/auth/me/preferences", "summary": "Update current user's browse preferences", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "UserPreferences" } }, "responses": [ { "status": "200", "description": "Updated preferences", "schema": { "kind": "ref", "value": "UserPreferences" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "getMeWatchlist", "method": "GET", "path": "/auth/me/watchlist", "summary": "Get current user's watchlist tools (premium)", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "Watchlist tools in saved order", "schema": { "kind": "array", "value": "ToolWithStats" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "403", "description": "Premium feature required", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] } ] }, { "name": "users", "description": "User management (admin only)", "endpoints": [ { "operationId": "listUsers", "method": "GET", "path": "/users", "summary": "List all local users (admin only)", "description": "", "parameters": [], "requestBody": null, "responses": [ { "status": "200", "description": "User list", "schema": { "kind": "array", "value": "User" } }, { "status": "401", "description": "Not authenticated", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "403", "description": "Forbidden", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "createUser", "method": "POST", "path": "/users", "summary": "Create a new local user (admin only)", "description": "", "parameters": [], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "UserCreateInput" } }, "responses": [ { "status": "201", "description": "Created user", "schema": { "kind": "ref", "value": "User" } }, { "status": "400", "description": "Validation error", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "409", "description": "Username already exists", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "updateUser", "method": "PATCH", "path": "/users/{id}", "summary": "Update user role (admin only)", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "UserRoleUpdate" } }, "responses": [ { "status": "200", "description": "Updated user", "schema": { "kind": "ref", "value": "User" } }, { "status": "404", "description": "User not found", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] }, { "operationId": "deleteUser", "method": "DELETE", "path": "/users/{id}", "summary": "Delete a user (admin only)", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "204", "description": "Deleted", "schema": { "kind": "type", "value": "any" } } ] }, { "operationId": "setUserPassword", "method": "PATCH", "path": "/users/{id}/password", "summary": "Set/reset a user's password (admin only, local users only)", "description": "", "parameters": [ { "name": "id", "in": "path", "required": true, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": { "required": true, "schema": { "kind": "ref", "value": "SetPasswordInput" } }, "responses": [ { "status": "204", "description": "Password updated", "schema": { "kind": "type", "value": "any" } }, { "status": "400", "description": "Validation error", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "404", "description": "User not found", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "422", "description": "OIDC user - password is managed by the identity provider", "schema": { "kind": "ref", "value": "ErrorResponse" } }, { "status": "429", "description": "Too many attempts", "schema": { "kind": "ref", "value": "ErrorResponse" } } ] } ] }, { "name": "audit", "description": "Audit log", "endpoints": [ { "operationId": "listAuditLogs", "method": "GET", "path": "/audit-logs", "summary": "List audit log entries (admin only)", "description": "", "parameters": [ { "name": "entityType", "in": "query", "required": false, "type": { "kind": "type", "value": "string" }, "description": "", "constraints": "" }, { "name": "entityId", "in": "query", "required": false, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" }, { "name": "limit", "in": "query", "required": false, "type": { "kind": "type", "value": "integer" }, "description": "", "constraints": "" } ], "requestBody": null, "responses": [ { "status": "200", "description": "Audit log entries", "schema": { "kind": "array", "value": "AuditLog" } } ] } ] } ], "schemas": [ { "name": "HealthStatus", "description": "", "fields": [ { "name": "status", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "VersionInfo", "description": "", "fields": [ { "name": "version", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "commitSha", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "buildDate", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "trashRetentionDays", "type": { "kind": "type", "value": "integer" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "AuthMode", "description": "", "fields": [ { "name": "mode", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "oidc, local" } ] }, { "name": "CsrfToken", "description": "", "fields": [ { "name": "token", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "LocalLoginInput", "description": "", "fields": [ { "name": "username", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "password", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "User", "description": "", "fields": [ { "name": "id", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "username", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "email", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "role", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "admin, user" }, { "name": "tier", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "free, premium, enterprise" }, { "name": "authProvider", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "local, oidc" }, { "name": "createdAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" } ] }, { "name": "UserCreateInput", "description": "", "fields": [ { "name": "username", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 2 chars" }, { "name": "password", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 6 chars" }, { "name": "email", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "role", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "admin, user" }, { "name": "tier", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "free, premium, enterprise" } ] }, { "name": "UserRoleUpdate", "description": "", "fields": [ { "name": "role", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "admin, user" }, { "name": "tier", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "free, premium, enterprise" } ] }, { "name": "ChangePasswordInput", "description": "", "fields": [ { "name": "currentPassword", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 1 chars" }, { "name": "newPassword", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 6 chars" } ] }, { "name": "SetPasswordInput", "description": "", "fields": [ { "name": "password", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 6 chars" } ] }, { "name": "PasswordRedirect", "description": "", "fields": [ { "name": "url", "type": { "kind": "type", "value": "string | null" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "AuditLog", "description": "", "fields": [ { "name": "id", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "entityType", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "entityId", "type": { "kind": "type", "value": "integer | null" }, "required": false, "description": "", "constraints": "" }, { "name": "action", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "userId", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "username", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "changes", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "createdAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" } ] }, { "name": "Tool", "description": "", "fields": [ { "name": "id", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "name", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "description", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "category", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "websiteUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "iconUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "createdBy", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "features", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "tags", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "createdAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" }, { "name": "updatedAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" }, { "name": "deletedAt", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "date-time" }, { "name": "deletedBy", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "RatingHistoryItem", "description": "", "fields": [ { "name": "date", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" }, { "name": "usefulness", "type": { "kind": "type", "value": "number" }, "required": true, "description": "", "constraints": "" }, { "name": "usability", "type": { "kind": "type", "value": "number" }, "required": true, "description": "", "constraints": "" }, { "name": "combined", "type": { "kind": "type", "value": "number" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "ToolWithStats", "description": "", "fields": [ { "name": "id", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "name", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "description", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "category", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "websiteUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "iconUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "createdBy", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "features", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "tags", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "createdAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" }, { "name": "updatedAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" }, { "name": "ratingCount", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsefulness", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsability", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "avgCombined", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "ToolInput", "description": "", "fields": [ { "name": "name", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 1 chars" }, { "name": "description", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 1 chars" }, { "name": "category", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "min 1 chars" }, { "name": "websiteUrl", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "iconUrl", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "features", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "tags", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "ToolImportBody", "description": "", "fields": [ { "name": "format", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "auto, csv, json, yaml" }, { "name": "delimiter", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "auto, comma, semicolon, tab" }, { "name": "data", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "ToolImportResponse", "description": "", "fields": [ { "name": "imported", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "total", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "errors", "type": { "kind": "array", "value": "object" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "ToolUpdate", "description": "", "fields": [ { "name": "name", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "min 1 chars" }, { "name": "description", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "category", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "websiteUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "iconUrl", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "features", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "tags", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "TrashToolsInput", "description": "", "fields": [ { "name": "ids", "type": { "kind": "array", "value": "integer" }, "required": true, "description": "", "constraints": "min 1 items, max 500 items" } ] }, { "name": "Rating", "description": "", "fields": [ { "name": "id", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "toolId", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "usefulness", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "1–5" }, { "name": "usability", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "1–5" }, { "name": "comment", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "reviewerName", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "createdAt", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "date-time" } ] }, { "name": "RatingInput", "description": "", "fields": [ { "name": "usefulness", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "1–5" }, { "name": "usability", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "1–5" }, { "name": "comment", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "reviewerName", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "AnalyticsSummary", "description": "", "fields": [ { "name": "totalTools", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "totalRatings", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsefulness", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsability", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "avgCombined", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "categoriesCount", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "mostRatedTool", "type": { "kind": "ref", "value": "ToolWithStats" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "TopToolEntry", "description": "", "fields": [ { "name": "tool", "type": { "kind": "ref", "value": "ToolWithStats" }, "required": true, "description": "", "constraints": "" }, { "name": "score", "type": { "kind": "type", "value": "number" }, "required": true, "description": "", "constraints": "" }, { "name": "ratingCount", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "CategoryStats", "description": "", "fields": [ { "name": "category", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "toolCount", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "totalRatings", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsefulness", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" }, { "name": "avgUsability", "type": { "kind": "type", "value": "number | null" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "RatingDistribution", "description": "", "fields": [ { "name": "usefulness", "type": { "kind": "array", "value": "ScoreBucket" }, "required": true, "description": "", "constraints": "" }, { "name": "usability", "type": { "kind": "array", "value": "ScoreBucket" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "ScoreBucket", "description": "", "fields": [ { "name": "score", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" }, { "name": "count", "type": { "kind": "type", "value": "integer" }, "required": true, "description": "", "constraints": "" } ] }, { "name": "AuthUser", "description": "", "fields": [ { "name": "sub", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" }, { "name": "email", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "name", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "preferredUsername", "type": { "kind": "type", "value": "string | null" }, "required": false, "description": "", "constraints": "" }, { "name": "role", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "admin, user" }, { "name": "tier", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "free, premium, enterprise" }, { "name": "entitlements", "type": { "kind": "array", "value": "string" }, "required": false, "description": "", "constraints": "" }, { "name": "isLocal", "type": { "kind": "type", "value": "boolean" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "UserPreferences", "description": "", "fields": [ { "name": "view", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "grid, table, rows" }, { "name": "density", "type": { "kind": "type", "value": "string" }, "required": false, "description": "", "constraints": "cozy, compact" }, { "name": "watchlist", "type": { "kind": "array", "value": "integer" }, "required": false, "description": "", "constraints": "" } ] }, { "name": "ErrorResponse", "description": "", "fields": [ { "name": "error", "type": { "kind": "type", "value": "string" }, "required": true, "description": "", "constraints": "" } ] } ] }