{"openapi":"3.0.0","paths":{"/api/models/compare":{"get":{"description":"Server-filtered model explorer with provider-attributed pricing, facets, pagination, coverage and freshness metadata.","operationId":"ModelsController_exploreComparison","parameters":[{"name":"metric","required":true,"in":"query","schema":{"type":"string"}},{"name":"view","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"developer","required":true,"in":"query","schema":{"type":"string"}},{"name":"family","required":true,"in":"query","schema":{"type":"string"}},{"name":"provider","required":true,"in":"query","schema":{"type":"string"}},{"name":"country","required":true,"in":"query","schema":{"type":"string"}},{"name":"openness","required":true,"in":"query","schema":{"type":"string"}},{"name":"commercialUse","required":true,"in":"query","schema":{"type":"string"}},{"name":"reasoning","required":true,"in":"query","schema":{"type":"string"}},{"name":"multimodal","required":true,"in":"query","schema":{"type":"string"}},{"name":"inputModalities","required":true,"in":"query","schema":{"type":"string"}},{"name":"outputModalities","required":true,"in":"query","schema":{"type":"string"}},{"name":"toolCalling","required":true,"in":"query","schema":{"type":"string"}},{"name":"structuredOutput","required":true,"in":"query","schema":{"type":"string"}},{"name":"localDeployment","required":true,"in":"query","schema":{"type":"string"}},{"name":"releasedAfter","required":true,"in":"query","schema":{"type":"string"}},{"name":"releasedBefore","required":true,"in":"query","schema":{"type":"string"}},{"name":"minContext","required":true,"in":"query","schema":{"type":"string"}},{"name":"maxInputPrice","required":true,"in":"query","schema":{"type":"string"}},{"name":"benchmark","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"sort","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"models","required":true,"in":"query","schema":{"type":"string"}},{"name":"openWeights","required":true,"in":"query","schema":{"type":"string"}},{"name":"modalities","required":true,"in":"query","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Comparison explorer response"}},"summary":"Explore and compare models","tags":["models"]}},"/api/models":{"get":{"description":"Returns a paginated list of canonical LLM models. Supports full-text search and filtering by capability or modality.","operationId":"ModelsController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Full-text search query against model name and description","schema":{"example":"deepseek","type":"string"}},{"name":"capability","required":false,"in":"query","description":"Filter by model capability","schema":{"enum":["chat","completion","function-calling","embeddings","fine-tuning","vision","audio","code-generation","reasoning"],"type":"string"}},{"name":"modality","required":false,"in":"query","description":"Filter by input/output modality","schema":{"enum":["text","image","audio","video","code"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"example":1,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (max 100)","schema":{"example":20,"type":"string"}},{"name":"sort","required":false,"in":"query","description":"Sort order for results","schema":{"enum":["name","recency","context_window","providers"],"type":"string"}},{"name":"country","required":false,"in":"query","description":"Filter by country of origin (ISO 3166-1 alpha-2 code)","schema":{"example":"us","type":"string"}},{"name":"licensing","required":false,"in":"query","description":"Filter by model license","schema":{"enum":["proprietary","apache-2.0","mit","gpl-3.0","bsd-3-clause","cc-by-4.0","cc-by-sa-4.0","other"],"type":"string"}},{"name":"context_min","required":false,"in":"query","description":"Minimum context window in tokens","schema":{"example":128000,"type":"string"}},{"name":"provider_count_min","required":false,"in":"query","description":"Minimum number of providers with mappings","schema":{"example":2,"type":"string"}},{"name":"price_max","required":false,"in":"query","description":"Maximum input price per 1M tokens across provider mappings","schema":{"example":1,"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of models","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedModelsDto"}}}}},"summary":"List all models","tags":["models"]}},"/api/models/popular":{"get":{"description":"Returns 8-12 models ranked by a relevance score combining recency and provider availability. Results are cached with a 5-minute TTL.","operationId":"ModelsController_getPopular","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of models to return (clamped to 8-12 range)","schema":{"example":12,"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of popular models sorted by relevance score","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ModelDto"}}}}}},"summary":"Get popular models","tags":["models"]}},"/api/models/{id}":{"get":{"description":"Returns detailed information about a specific canonical model.","operationId":"ModelsController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Model details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelDto"}}}},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get model by ID","tags":["models"]}},"/api/models/{id}/providers":{"get":{"description":"Returns all providers that offer the specified model, including pricing, rate limits, health status, and latency metrics.","operationId":"ModelsController_findProviders","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}}],"responses":{"200":{"description":"List of provider mappings with health and latency data","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderMappingDto"}}}}},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"List providers for a model","tags":["models"]}},"/api/models/{id}/pricing-history":{"get":{"description":"Every recorded price period for the model across providers, oldest first. The current price has effective_to = null.","operationId":"ModelsController_getPricingHistory","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}}],"responses":{"200":{"description":"Price periods per provider"},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Pricing history for a model","tags":["models"]}},"/api/models/{id}/benchmarks":{"get":{"description":"Published benchmark scores with the source of each result. Vendor-reported and independent results are labelled.","operationId":"ModelsController_getBenchmarks","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}}],"responses":{"200":{"description":"Benchmark results"},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Benchmark results for a model","tags":["models"]}},"/api/models/{id}/compare":{"get":{"description":"Returns a side-by-side comparison of all providers offering the specified model. Includes pricing, rate limits, context window, uptime, and latency. Highlights the lowest input and output prices across providers.","operationId":"ModelsController_compareProviders","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}},{"name":"sort_by","required":false,"in":"query","description":"Sort providers by a specific field","schema":{"enum":["price","rate_limit","context_window","latency","uptime"],"type":"string"}}],"responses":{"200":{"description":"Provider comparison data with lowest prices highlighted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderComparisonDto"}}}},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Compare providers for a model","tags":["models"]}},"/api/providers":{"get":{"description":"Returns a paginated list of all LLM inference providers in the registry.","operationId":"ProvidersController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"example":1,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (max 100)","schema":{"example":20,"type":"string"}}],"responses":{"200":{"description":"Paginated list of providers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProvidersDto"}}}}},"summary":"List all providers","tags":["providers"]}},"/api/providers/status":{"get":{"description":"Current health status and daily uptime history for every provider, based on synthetic health checks.","operationId":"ProvidersController_getStatus","parameters":[{"name":"days","required":false,"in":"query","description":"History window in days (7-90)","schema":{"example":30,"type":"string"}}],"responses":{"200":{"description":"Status of all providers"}},"summary":"Provider status overview","tags":["providers"]}},"/api/providers/{id}":{"get":{"description":"Returns detailed information about a specific provider, including the list of models it offers.","operationId":"ProvidersController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"Unique provider identifier (kebab-case)","schema":{"example":"openai","type":"string"}}],"responses":{"200":{"description":"Provider details including offered models","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDetailDto"}}}},"404":{"description":"Provider not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get provider by ID","tags":["providers"]}},"/api/providers/{id}/health":{"get":{"description":"Returns the current health status and uptime percentages for a provider over the last 24 hours and 7 days.","operationId":"ProvidersController_getHealth","parameters":[{"name":"id","required":true,"in":"path","description":"Unique provider identifier (kebab-case)","schema":{"example":"openai","type":"string"}}],"responses":{"200":{"description":"Provider health metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthMetricsDto"}}}},"404":{"description":"Provider not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get provider health status","tags":["providers"]}},"/api/providers/{id}/latency":{"get":{"description":"Returns latency statistics for a provider over the last 24 hours, including average TTFT and p50/p95/p99 percentiles.","operationId":"ProvidersController_getLatency","parameters":[{"name":"id","required":true,"in":"path","description":"Unique provider identifier (kebab-case)","schema":{"example":"openai","type":"string"}}],"responses":{"200":{"description":"Provider latency metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatencyMetricsDto"}}}},"404":{"description":"Provider not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get provider latency metrics","tags":["providers"]}},"/api/models/{id}/providers/ranked":{"get":{"description":"Returns providers for the specified model ranked by a composite performance score. The score is calculated from uptime (40%), latency (35%), and pricing (25%). Optionally filter providers by a minimum 24-hour uptime threshold.","operationId":"TelemetryController_getRankedProviders","parameters":[{"name":"id","required":true,"in":"path","description":"Unique model identifier (kebab-case)","schema":{"example":"deepseek-v3","type":"string"}},{"name":"min_uptime","required":false,"in":"query","description":"Minimum 24-hour uptime percentage threshold (0-100). Providers below this threshold are excluded.","schema":{"example":95,"type":"string"}}],"responses":{"200":{"description":"Providers ranked by composite performance score (highest score first)","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RankedProviderDto"}}}}},"404":{"description":"Model not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get ranked providers for a model","tags":["telemetry"]}},"/api/health":{"get":{"description":"Returns the overall health status of the platform, including individual checks for the database (PostgreSQL), cache (Redis), and disk space. Returns HTTP 200 when healthy, HTTP 503 when any check fails.","operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"All systems healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponseDto"}}}},"503":{"description":"One or more systems are unhealthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponseDto"}}}}},"summary":"System health check","tags":["health"]}},"/api/stats":{"get":{"description":"Returns total counts of models, providers, mappings, blended average USD pricing, and the last registry sync timestamp.","operationId":"StatsController_getStats","parameters":[],"responses":{"200":{"description":"Platform statistics"}},"summary":"Get platform statistics","tags":["stats"]}},"/api/search/index":{"get":{"description":"Returns a lightweight JSON payload of all model and provider names, IDs, capabilities, modalities, and compatibility. Designed for client-side filtering in the Command Palette. Cached in Redis with 5-min TTL.","operationId":"SearchController_getIndex","parameters":[{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Search index with all models and providers"}},"summary":"Get search index","tags":["search"]}},"/api/search":{"get":{"description":"Performs full-text search across models and providers using PostgreSQL ts_rank. Results are ranked: exact matches first, then prefix matches, then substring matches. Returns grouped results by type.","operationId":"SearchController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Search query string (minimum 1 character)","schema":{"example":"deepseek","type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter results by type","schema":{"enum":["models","providers"],"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum total results to return (split between models and providers)","schema":{"example":20,"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Grouped search results with models and providers"}},"summary":"Search models and providers","tags":["search"]}},"/api/skills":{"get":{"description":"Returns a paginated list of AI agent skills. Supports full-text search and filtering by category, complexity, tag, model, or tool.","operationId":"SkillsController_findAll","parameters":[{"name":"search","required":false,"in":"query","description":"Full-text search across skill name and description","schema":{"example":"code review","type":"string"}},{"name":"category","required":false,"in":"query","description":"Filter by skill category","schema":{"enum":["development","writing","data","research","creative","ops","testing","security","productivity"],"type":"string"}},{"name":"complexity","required":false,"in":"query","description":"Filter by complexity level","schema":{"enum":["beginner","intermediate","advanced"],"type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filter by tag (exact match)","schema":{"example":"code-quality","type":"string"}},{"name":"model","required":false,"in":"query","description":"Filter by recommended model ID","schema":{"example":"claude-opus-4-6","type":"string"}},{"name":"tool","required":false,"in":"query","description":"Filter by compatible tool","schema":{"enum":["claude-code","cursor","github-copilot","kiro","windsurf","opencode","gemini-cli","aider","continue","cody","any"],"type":"string"}},{"name":"sort","required":false,"in":"query","description":"Sort order for results","schema":{"enum":["name","recency","complexity","active","popular","trending"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"example":1,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (max 100)","schema":{"example":20,"type":"string"}},{"name":"verified","required":true,"in":"query","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of skills","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSkillsDto"}}}}},"summary":"List all skills","tags":["skills"]}},"/api/skills/facets":{"get":{"description":"Returns query-aware category, complexity, tool, contributor, and result counts for the Skills catalog.","operationId":"SkillsController_getFacets","parameters":[{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"complexity","required":true,"in":"query","schema":{"type":"string"}},{"name":"tag","required":true,"in":"query","schema":{"type":"string"}},{"name":"model","required":true,"in":"query","schema":{"type":"string"}},{"name":"tool","required":true,"in":"query","schema":{"type":"string"}},{"name":"verified","required":true,"in":"query","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get skill facets","tags":["skills"]}},"/api/skills/{id}":{"get":{"description":"Returns detailed information about a specific AI agent skill.","operationId":"SkillsController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"Unique skill identifier (kebab-case)","schema":{"example":"code-review","type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Skill details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDto"}}}},"404":{"description":"Skill not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get skill by ID","tags":["skills"]}},"/api/skills/{id}/events":{"post":{"description":"Increments a daily aggregate counter. No user, device, IP, or raw event record is stored.","operationId":"SkillsController_recordEvent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillEventDto"}}}},"responses":{"204":{"description":""}},"summary":"Record an aggregate skill interaction","tags":["skills"]}},"/api/v1/mcp/servers":{"get":{"description":"Returns a paginated list of MCP servers. Supports full-text search with relevance ranking and filtering by category and transport type.","operationId":"McpController_findAll","parameters":[{"name":"q","required":false,"in":"query","description":"Search query (minimum 2 characters). Searches across name, tags, tool names, and description with relevance ranking.","schema":{"example":"github","type":"string"}},{"name":"category","required":false,"in":"query","description":"Filter by category","schema":{"enum":["Development","Productivity","Database","DevOps","AI","Research","Browser Automation","Communication","Filesystem","Cloud","Security"],"type":"string"}},{"name":"transport","required":false,"in":"query","description":"Filter by transport type","schema":{"enum":["stdio","sse","http-streaming"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"example":1,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (min 1, max 100)","schema":{"example":20,"type":"string"}},{"name":"sort","required":false,"in":"query","description":"Sort order for results","schema":{"enum":["newest","stars","name","tools"],"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of MCP servers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMcpServersDto"}}}}},"summary":"List MCP servers","tags":["mcp"]}},"/api/v1/mcp/servers/{id}":{"get":{"description":"Returns detailed information about a specific MCP server.","operationId":"McpController_findById","parameters":[{"name":"id","required":true,"in":"path","description":"Unique MCP server identifier (kebab-case)","schema":{"example":"github","type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"MCP server details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerDto"}}}},"404":{"description":"MCP server not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Get MCP server by ID","tags":["mcp"]}},"/api/v1/mcp/servers/{id}/config/{ide}":{"get":{"description":"Generates an IDE-specific configuration snippet for connecting to the MCP server.","operationId":"McpController_getIdeConfig","parameters":[{"name":"id","required":true,"in":"path","description":"Unique MCP server identifier","schema":{"example":"github","type":"string"}},{"name":"ide","required":true,"in":"path","description":"Target IDE identifier","schema":{"enum":["claude-code","cursor","windsurf","gemini-cli","kiro","vscode-copilot"],"type":"string"}}],"responses":{"200":{"description":"IDE configuration snippet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpIdeConfigDto"}}}},"400":{"description":"Unsupported IDE","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}},"404":{"description":"MCP server not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseDto"}}}}},"summary":"Generate IDE configuration","tags":["mcp"]}},"/api/v1/mcp/categories":{"get":{"description":"Returns all categories with the number of servers in each.","operationId":"McpController_getCategories","parameters":[],"responses":{"200":{"description":"List of categories with server counts","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/McpCategoryDto"}}}}}},"summary":"List MCP categories","tags":["mcp"]}},"/api/v1/mcp/stats":{"get":{"description":"Returns aggregate statistics about the MCP server registry.","operationId":"McpController_getStats","parameters":[],"responses":{"200":{"description":"MCP registry statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpStatsDto"}}}}},"summary":"Get MCP statistics","tags":["mcp"]}}},"info":{"title":"OpenModels Platform API","description":"REST API for discovering, comparing, and monitoring LLM models and inference providers. Browse canonical models, compare provider pricing and rate limits, and track provider health and latency.","version":"0.2.0","contact":{}},"tags":[{"name":"models","description":"Canonical LLM model discovery and comparison"},{"name":"providers","description":"LLM inference provider information and health"},{"name":"telemetry","description":"Provider performance ranking and metrics"},{"name":"health","description":"System health and readiness checks"}],"servers":[],"components":{"schemas":{"ModelDto":{"type":"object","properties":{"id":{"type":"string","example":"deepseek-v3","description":"Unique model identifier (kebab-case)"},"name":{"type":"string","example":"DeepSeek V3","description":"Human-readable display name"},"description":{"type":"string","example":"A powerful mixture-of-experts language model with strong reasoning capabilities.","description":"Human-readable description of the model"},"capabilities":{"type":"array","example":["chat","completion","function-calling"],"description":"List of capabilities supported by this model","items":{"type":"string","enum":["chat","completion","function-calling","embeddings","fine-tuning","vision","audio","code-generation","reasoning"]}},"modalities":{"type":"array","example":["text","code"],"description":"List of input/output modalities supported by this model","items":{"type":"string","enum":["text","image","audio","video","code"]}},"context_window":{"type":"number","example":128000,"description":"Maximum context window size in tokens"},"licensing":{"type":"string","example":"mit","description":"License type for this model","enum":["proprietary","apache-2.0","mit","gpl-3.0","bsd-3-clause","cc-by-4.0","cc-by-sa-4.0","other"]},"created_at":{"type":"string","example":"2024-01-15T00:00:00.000Z","description":"ISO 8601 creation timestamp"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z","description":"ISO 8601 last update timestamp"}},"required":["id","name","description","capabilities","modalities","context_window","licensing","created_at","updated_at"]},"PaginationDto":{"type":"object","properties":{"total":{"type":"number","example":42,"description":"Total number of items"},"page":{"type":"number","example":1,"description":"Current page number (1-indexed)"},"limit":{"type":"number","example":20,"description":"Number of items per page"},"total_pages":{"type":"number","example":3,"description":"Total number of pages"}},"required":["total","page","limit","total_pages"]},"PaginatedModelsDto":{"type":"object","properties":{"items":{"description":"List of models for the current page","type":"array","items":{"$ref":"#/components/schemas/ModelDto"}},"pagination":{"$ref":"#/components/schemas/PaginationDto"}},"required":["items","pagination"]},"ErrorResponseDto":{"type":"object","properties":{"error":{"type":"string","example":"Not Found","description":"Short error type"},"message":{"type":"string","example":"Model with id 'unknown-model' not found","description":"Detailed error message"},"status_code":{"type":"number","example":404,"description":"HTTP status code"},"timestamp":{"type":"string","example":"2024-06-01T12:00:00.000Z","description":"ISO 8601 timestamp of the error"}},"required":["error","message","status_code","timestamp"]},"PricingDto":{"type":"object","properties":{"input_per_million":{"type":"number","example":0.27,"description":"Price per 1 million input tokens (USD)"},"output_per_million":{"type":"number","example":1.1,"description":"Price per 1 million output tokens (USD)"},"currency":{"type":"string","example":"USD","description":"ISO 4217 currency code"},"cache_write_per_million":{"type":"number","example":1,"description":"Price per 1 million cache write tokens"},"cache_read_per_million":{"type":"number","example":0.27,"description":"Price per 1 million cache read tokens"},"image_per_unit":{"type":"number","example":0.01,"description":"Price per image unit (vision models)"},"audio_per_second":{"type":"number","example":0.001,"description":"Price per second of audio"},"reasoning_tokens_per_million":{"type":"number","example":3.5,"description":"Price per 1 million reasoning tokens"},"search_grounding_per_query":{"type":"number","example":0.035,"description":"Price per search grounding query"}},"required":["input_per_million","output_per_million","currency"]},"RateLimitsDto":{"type":"object","properties":{"requests_per_minute":{"type":"number","nullable":true,"example":1000,"description":"Maximum requests per minute; null when unpublished or account-specific"},"tokens_per_minute":{"type":"number","nullable":true,"example":100000,"description":"Maximum tokens per minute; null when unpublished or account-specific"}},"required":["requests_per_minute","tokens_per_minute"]},"HealthMetricsDto":{"type":"object","properties":{"provider_id":{"type":"string","example":"openai","description":"Provider identifier"},"status":{"type":"string","example":"healthy","description":"Current health status","enum":["healthy","unhealthy","unknown"]},"uptime_24h":{"type":"number","example":99.5,"description":"Uptime percentage over the last 24 hours (0-100); null without observations","nullable":true},"uptime_7d":{"type":"number","example":98.2,"description":"Uptime percentage over the last 7 days (0-100); null without observations","nullable":true},"last_checked_at":{"type":"object","example":"2024-06-01T12:00:00.000Z","description":"ISO 8601 timestamp of the last health check, null when no data","nullable":true}},"required":["provider_id","status","uptime_24h","uptime_7d","last_checked_at"]},"LatencyMetricsDto":{"type":"object","properties":{"provider_id":{"type":"string","example":"openai","description":"Provider identifier"},"model_id":{"type":"string","example":"deepseek-v3","description":"Model identifier"},"avg_ttft_ms":{"type":"number","example":320,"description":"Average time-to-first-token in milliseconds; null without observations","nullable":true},"avg_total_time_ms":{"type":"number","example":2100,"description":"Average total response time in milliseconds","nullable":true},"p50_ms":{"type":"number","example":300,"description":"Median (p50) TTFT in milliseconds","nullable":true},"p95_ms":{"type":"number","example":600,"description":"95th percentile TTFT in milliseconds","nullable":true},"p99_ms":{"type":"number","example":900,"description":"99th percentile TTFT in milliseconds","nullable":true}},"required":["provider_id","model_id","avg_ttft_ms","avg_total_time_ms","p50_ms","p95_ms","p99_ms"]},"ProviderMappingDto":{"type":"object","properties":{"id":{"type":"number","example":1,"description":"Unique mapping identifier"},"model_id":{"type":"string","example":"deepseek-v3","description":"Reference to the canonical model ID"},"provider_id":{"type":"string","example":"openai","description":"Reference to the provider ID"},"provider_model_name":{"type":"string","example":"deepseek-chat","description":"Provider's internal model name"},"pricing":{"$ref":"#/components/schemas/PricingDto"},"rate_limits":{"$ref":"#/components/schemas/RateLimitsDto"},"context_window_override":{"type":"object","example":64000,"description":"Override for the model context window at this provider","nullable":true},"available_regions":{"example":["us-east-1"],"description":"Regions where this mapping is available","type":"array","items":{"type":"array"}},"created_at":{"type":"string","example":"2024-01-15T00:00:00.000Z"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z"},"provider_name":{"type":"string","example":"OpenAI","description":"Human-readable provider name"},"health":{"$ref":"#/components/schemas/HealthMetricsDto"},"latency":{"$ref":"#/components/schemas/LatencyMetricsDto"}},"required":["id","model_id","provider_id","provider_model_name","pricing","rate_limits","available_regions","created_at","updated_at","provider_name","health","latency"]},"ComparisonRowDto":{"type":"object","properties":{"provider_id":{"type":"string","example":"openai"},"provider_name":{"type":"string","example":"OpenAI"},"pricing":{"$ref":"#/components/schemas/PricingDto"},"rate_limits":{"$ref":"#/components/schemas/RateLimitsDto"},"context_window":{"type":"number","example":128000,"description":"Effective context window (override or model default)"},"uptime_24h":{"type":"number","example":99.5,"description":"24-hour observed provider reachability; null without observations","nullable":true},"avg_ttft_ms":{"type":"number","example":320,"description":"Average TTFT for this provider and model in milliseconds; null without observations","nullable":true},"total_cost_estimate":{"type":"number","example":1.37,"description":"Estimated cost for 1M input + 1M output tokens"}},"required":["provider_id","provider_name","pricing","rate_limits","context_window","uptime_24h","avg_ttft_ms","total_cost_estimate"]},"ProviderComparisonDto":{"type":"object","properties":{"model_id":{"type":"string","example":"deepseek-v3"},"model_name":{"type":"string","example":"DeepSeek V3"},"providers":{"type":"array","items":{"$ref":"#/components/schemas/ComparisonRowDto"}},"lowest_input_price":{"type":"number","example":0.27,"description":"Lowest input price per 1M tokens across all providers"},"lowest_output_price":{"type":"number","example":1.1,"description":"Lowest output price per 1M tokens across all providers"}},"required":["model_id","model_name","providers","lowest_input_price","lowest_output_price"]},"ProviderDto":{"type":"object","properties":{"id":{"type":"string","example":"openai","description":"Unique provider identifier (kebab-case)"},"name":{"type":"string","example":"OpenAI","description":"Human-readable display name"},"description":{"type":"string","example":"Leading AI research company offering GPT-4 and other frontier models.","description":"Human-readable description of the provider"},"api_base_url":{"type":"string","example":"https://api.openai.com/v1","description":"Base URL for API requests"},"auth_type":{"type":"string","example":"bearer","description":"Authentication type required by this provider","enum":["bearer","api-key","oauth2","basic","none"]},"regions":{"example":["us-east-1","eu-west-1"],"description":"List of supported deployment regions","type":"array","items":{"type":"array"}},"compatibility":{"type":"string","example":"openai","description":"API compatibility standard","enum":["openai","anthropic","google","cohere","custom"]},"created_at":{"type":"string","example":"2023-03-01T00:00:00.000Z","description":"ISO 8601 creation timestamp"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z","description":"ISO 8601 last update timestamp"}},"required":["id","name","description","api_base_url","auth_type","regions","compatibility","created_at","updated_at"]},"PaginatedProvidersDto":{"type":"object","properties":{"items":{"description":"List of providers for the current page","type":"array","items":{"$ref":"#/components/schemas/ProviderDto"}},"pagination":{"$ref":"#/components/schemas/PaginationDto"}},"required":["items","pagination"]},"MappingWithModelDto":{"type":"object","properties":{"id":{"type":"number","example":1},"model_id":{"type":"string","example":"deepseek-v3"},"provider_id":{"type":"string","example":"openai"},"provider_model_name":{"type":"string","example":"deepseek-chat"},"pricing":{"$ref":"#/components/schemas/PricingDto"},"rate_limits":{"$ref":"#/components/schemas/RateLimitsDto"},"context_window_override":{"type":"object","example":null,"nullable":true},"available_regions":{"example":["us-east-1"],"type":"array","items":{"type":"array"}},"created_at":{"type":"string","example":"2024-01-15T00:00:00.000Z"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z"},"model_name":{"type":"string","example":"DeepSeek V3","description":"Human-readable model name"}},"required":["id","model_id","provider_id","provider_model_name","pricing","rate_limits","available_regions","created_at","updated_at","model_name"]},"ProviderDetailDto":{"type":"object","properties":{"id":{"type":"string","example":"openai","description":"Unique provider identifier (kebab-case)"},"name":{"type":"string","example":"OpenAI","description":"Human-readable display name"},"description":{"type":"string","example":"Leading AI research company offering GPT-4 and other frontier models.","description":"Human-readable description of the provider"},"api_base_url":{"type":"string","example":"https://api.openai.com/v1","description":"Base URL for API requests"},"auth_type":{"type":"string","example":"bearer","description":"Authentication type required by this provider","enum":["bearer","api-key","oauth2","basic","none"]},"regions":{"example":["us-east-1","eu-west-1"],"description":"List of supported deployment regions","type":"array","items":{"type":"array"}},"compatibility":{"type":"string","example":"openai","description":"API compatibility standard","enum":["openai","anthropic","google","cohere","custom"]},"created_at":{"type":"string","example":"2023-03-01T00:00:00.000Z","description":"ISO 8601 creation timestamp"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z","description":"ISO 8601 last update timestamp"},"models":{"description":"Models offered by this provider","type":"array","items":{"$ref":"#/components/schemas/MappingWithModelDto"}}},"required":["id","name","description","api_base_url","auth_type","regions","compatibility","created_at","updated_at","models"]},"RankedProviderDto":{"type":"object","properties":{"id":{"type":"number","example":1,"description":"Unique mapping identifier"},"model_id":{"type":"string","example":"deepseek-v3","description":"Reference to the canonical model ID"},"provider_id":{"type":"string","example":"openai","description":"Reference to the provider ID"},"provider_model_name":{"type":"string","example":"deepseek-chat","description":"Provider's internal model name"},"pricing":{"$ref":"#/components/schemas/PricingDto"},"rate_limits":{"$ref":"#/components/schemas/RateLimitsDto"},"context_window_override":{"type":"object","example":64000,"description":"Override for the model context window at this provider","nullable":true},"available_regions":{"example":["us-east-1"],"description":"Regions where this mapping is available","type":"array","items":{"type":"array"}},"created_at":{"type":"string","example":"2024-01-15T00:00:00.000Z"},"updated_at":{"type":"string","example":"2024-06-01T00:00:00.000Z"},"provider_name":{"type":"string","example":"OpenAI","description":"Human-readable provider name"},"health":{"$ref":"#/components/schemas/HealthMetricsDto"},"latency":{"$ref":"#/components/schemas/LatencyMetricsDto"},"rank":{"type":"number","example":1,"description":"Rank position (1 = best)"},"score":{"type":"number","example":87.42,"description":"Composite performance score (0-100)"}},"required":["id","model_id","provider_id","provider_model_name","pricing","rate_limits","available_regions","created_at","updated_at","provider_name","health","latency","rank","score"]},"CheckResultDto":{"type":"object","properties":{"status":{"type":"string","example":"healthy","enum":["healthy","unhealthy"]},"message":{"type":"string","example":"Low disk space: 8% free"},"freePercent":{"type":"number","example":45,"description":"Free disk space percentage"}},"required":["status"]},"HealthChecksDto":{"type":"object","properties":{"database":{"$ref":"#/components/schemas/CheckResultDto"},"redis":{"$ref":"#/components/schemas/CheckResultDto"},"disk":{"$ref":"#/components/schemas/CheckResultDto"}},"required":["database","redis","disk"]},"HealthCheckResponseDto":{"type":"object","properties":{"status":{"type":"string","example":"healthy","enum":["healthy","unhealthy"]},"checks":{"$ref":"#/components/schemas/HealthChecksDto"}},"required":["status","checks"]},"SkillAuthorDto":{"type":"object","properties":{"name":{"type":"string","example":"OpenModels Community","description":"Author display name"},"github":{"type":"string","example":"openmodelsrun","description":"GitHub username or organization"},"url":{"type":"string","example":"https://openmodels.run","description":"Author website URL"}},"required":["name"]},"SkillModalitiesDto":{"type":"object","properties":{"input":{"example":["code","text"],"description":"Required input modalities","type":"array","items":{"type":"array"}},"output":{"example":["text","code"],"description":"Expected output modalities","type":"array","items":{"type":"array"}}},"required":["input","output"]},"SkillDto":{"type":"object","properties":{"id":{"type":"string","example":"code-review","description":"Unique skill identifier (kebab-case)"},"name":{"type":"string","example":"Code Review","description":"Human-readable display name"},"description":{"type":"string","example":"Automated code review with actionable feedback on code quality, bugs, and performance.","description":"Detailed description of the skill"},"category":{"type":"string","example":"development","description":"Primary category","enum":["development","writing","data","research","creative","ops","testing","security","productivity"]},"tags":{"example":["code-quality","automation"],"description":"Searchable tags","type":"array","items":{"type":"array"}},"author":{"$ref":"#/components/schemas/SkillAuthorDto"},"source_url":{"type":"string","example":"https://github.com/openmodelsrun/skills","description":"Source URL"},"recommended_models":{"example":["claude-opus-4-6","gpt-5"],"description":"Recommended model IDs","type":"array","items":{"type":"array"}},"min_context_window":{"type":"number","example":32000,"description":"Minimum context window in tokens"},"modalities":{"$ref":"#/components/schemas/SkillModalitiesDto"},"complexity":{"type":"string","example":"intermediate","description":"Complexity level","enum":["beginner","intermediate","advanced"]},"use_cases":{"example":["PR review automation","Code quality gates"],"description":"Use cases","type":"array","items":{"type":"array"}},"example_prompt":{"type":"string","example":"Review the following code for bugs and performance issues...","description":"Example prompt"},"related_skills":{"example":["unit-test-generation","security-audit"],"description":"Related skill IDs","type":"array","items":{"type":"array"}},"compatible_tools":{"example":["claude-code","cursor","kiro"],"description":"Compatible tools","type":"array","items":{"type":"array"}},"created_at":{"type":"string","example":"2026-05-24T10:00:00.000Z","description":"ISO 8601 creation timestamp"},"updated_at":{"type":"string","example":"2026-05-24T10:00:00.000Z","description":"ISO 8601 last update timestamp"}},"required":["id","name","description","category","tags","author","recommended_models","modalities","complexity","use_cases","example_prompt","created_at","updated_at"]},"PaginatedSkillsDto":{"type":"object","properties":{"items":{"description":"List of skills for the current page","type":"array","items":{"$ref":"#/components/schemas/SkillDto"}},"pagination":{"$ref":"#/components/schemas/PaginationDto"}},"required":["items","pagination"]},"SkillEventDto":{"type":"object","properties":{}},"McpAuthorDto":{"type":"object","properties":{"name":{"type":"string","example":"Anthropic","description":"Author name"},"github":{"type":"string","example":"anthropics","description":"GitHub username"}},"required":["name","github"]},"McpToolDto":{"type":"object","properties":{"name":{"type":"string","example":"run_tests","description":"Tool name"},"description":{"type":"string","example":"Runs the project test suite","description":"Tool description"},"input_schema":{"type":"object","description":"JSON Schema for tool input parameters"}},"required":["name","description","input_schema"]},"McpResourceDto":{"type":"object","properties":{"uri_template":{"type":"string","example":"file:///{path}","description":"URI template for the resource"},"description":{"type":"string","example":"Access to project files","description":"Resource description"}},"required":["uri_template","description"]},"McpPromptArgumentDto":{"type":"object","properties":{"name":{"type":"string","example":"file_path","description":"Argument name"},"description":{"type":"string","example":"Path to the file to review","description":"Argument description"}},"required":["name","description"]},"McpPromptDto":{"type":"object","properties":{"name":{"type":"string","example":"review_code","description":"Prompt name"},"description":{"type":"string","example":"Reviews code for quality issues","description":"Prompt description"},"arguments":{"description":"Prompt arguments","type":"array","items":{"$ref":"#/components/schemas/McpPromptArgumentDto"}}},"required":["name","description","arguments"]},"McpInstallDto":{"type":"object","properties":{"npm":{"type":"string","example":"@org/example-server","description":"npm package name"},"command":{"type":"string","example":"npx","description":"Command to run"},"args":{"example":["-y","@org/example-server"],"description":"Command arguments","type":"array","items":{"type":"string"}}}},"McpEnvVarDto":{"type":"object","properties":{"name":{"type":"string","example":"API_KEY","description":"Environment variable name"},"description":{"type":"string","example":"API key for authentication","description":"Variable description"},"required":{"type":"boolean","example":true,"description":"Whether the variable is required"}},"required":["name","description","required"]},"McpServerDto":{"type":"object","properties":{"id":{"type":"string","example":"github","description":"Unique MCP server identifier (kebab-case)"},"name":{"type":"string","example":"GitHub MCP Server","description":"Human-readable display name"},"description":{"type":"string","example":"MCP server for GitHub API integration","description":"Server description"},"author":{"$ref":"#/components/schemas/McpAuthorDto"},"repository":{"type":"string","example":"https://github.com/modelcontextprotocol/servers","description":"Repository URL"},"license":{"type":"string","example":"MIT","description":"License type"},"version":{"type":"string","example":"1.0.0","description":"Server version"},"transport":{"type":"array","example":["stdio","sse"],"description":"Supported transport types","items":{"type":"string","enum":["stdio","sse","http-streaming"]}},"category":{"type":"string","example":"Development","description":"Server category","enum":["Development","Productivity","Database","DevOps","AI","Research","Browser Automation","Communication","Filesystem","Cloud","Security"]},"tags":{"example":["github","version-control"],"description":"Searchable tags","type":"array","items":{"type":"array"}},"tools":{"description":"Tools exposed by the server","type":"array","items":{"$ref":"#/components/schemas/McpToolDto"}},"resources":{"description":"Resources exposed by the server","type":"array","items":{"$ref":"#/components/schemas/McpResourceDto"}},"prompts":{"description":"Prompts exposed by the server","type":"array","items":{"$ref":"#/components/schemas/McpPromptDto"}},"install":{"description":"Installation configuration","allOf":[{"$ref":"#/components/schemas/McpInstallDto"}]},"env_vars":{"description":"Required environment variables","type":"array","items":{"$ref":"#/components/schemas/McpEnvVarDto"}},"stars":{"type":"number","example":1250,"description":"GitHub star count"},"created_at":{"type":"string","example":"2025-01-15T10:00:00.000Z","description":"ISO 8601 creation timestamp"},"updated_at":{"type":"string","example":"2025-06-01T12:00:00.000Z","description":"ISO 8601 last update timestamp"}},"required":["id","name","description","author","repository","license","version","transport","category","tags","tools","resources","prompts","install","env_vars","stars","created_at","updated_at"]},"PaginatedMcpServersDto":{"type":"object","properties":{"items":{"description":"List of MCP servers for the current page","type":"array","items":{"$ref":"#/components/schemas/McpServerDto"}},"pagination":{"$ref":"#/components/schemas/PaginationDto"}},"required":["items","pagination"]},"McpIdeConfigDto":{"type":"object","properties":{"ide":{"type":"string","example":"cursor","description":"Target IDE identifier"},"file_location":{"type":"string","example":".cursor/mcp.json","description":"File location for the config"},"config":{"type":"object","description":"IDE configuration object","example":{"mcpServers":{"github":{"command":"npx","args":["-y","@modelcontextprotocol/server-github"],"env":{"GITHUB_TOKEN":"<YOUR_GITHUB_TOKEN>"}}}}}},"required":["ide","file_location","config"]},"McpCategoryDto":{"type":"object","properties":{"category":{"type":"string","example":"Development","description":"Category name"},"count":{"type":"number","example":12,"description":"Number of servers in this category"}},"required":["category","count"]},"McpStatsDto":{"type":"object","properties":{"total_servers":{"type":"number","example":42,"description":"Total number of registered MCP servers"},"total_tools":{"type":"number","example":156,"description":"Total number of tools across all servers"},"total_categories":{"type":"number","example":11,"description":"Total number of categories with servers"},"total_contributors":{"type":"number","example":28,"description":"Total number of unique contributors"}},"required":["total_servers","total_tools","total_categories","total_contributors"]}}}}