{"openapi":"3.1.0","info":{"title":"EnsemblAI Data API","description":"Download history, growth, dependency structure, corporate ownership and package classification for PyPI and npm: 5.3M packages and 1.1 billion stored download-history rows back to 2015, in one schema with identical fields for both ecosystems. Includes pre-computed segment aggregates (totals, growth and leaders for an entire industry domain or technology category in one call), corporate-ownership attribution across 2,800+ companies and 42,312 GitHub orgs, 3.2M dependency edges, and per-version adoption. Downloads count distribution files only (.whl / .tar.gz / .zip), i.e. actual package fetches. PyPI additionally logged PEP 658 metadata-sidecar fetches from mid-July 2023 until 2026-08-24; those are not downloads, and they reached ~40% of logged rows. EnsemblAI re-derived 2023-07 onward to exclude them and nothing earlier needed changing, so every series has one basis end to end and no step at any date. A source counting raw log rows is inflated over 2023-2026 and drops ~35% on 2026-08-24. Details: https://www.ensemblai.com/methodology/downloads. Changelog (breaking changes are announced there): https://www.ensemblai.com/docs/changelog","version":"1.91.0"},"paths":{"/v1/health":{"get":{"summary":"Health check","description":"Simple health check endpoint","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/status":{"get":{"summary":"System status","description":"Detailed system status with data freshness info","operationId":"status_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/packages":{"get":{"summary":"Search packages","description":"Search and filter packages with pagination","operationId":"packages_search_v1_packages_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search. Matches package names containing the text, packages whose name or summary contains every word (stemmed; \"quoted phrase\" and -word work), and packages in a category or domain the text names. Ranked exact name, then name prefix, then the rest. A query without a run of 3+ letters or digits (e.g. 'js', 'c++') matches names only among the ~100K most-downloaded packages of the ecosystem; word matches still cover every package.","title":"Q"},"description":"Search. Matches package names containing the text, packages whose name or summary contains every word (stemmed; \"quoted phrase\" and -word work), and packages in a category or domain the text names. Ranked exact name, then name prefix, then the rest. A query without a run of 3+ letters or digits (e.g. 'js', 'c++') matches names only among the ~100K most-downloaded packages of the ecosystem; word matches still cover every package."},{"name":"use_case_tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Use-case tags, comma-separated, any-of; each term matches anywhere in a package's tags","title":"Use Case Tags"},"description":"Use-case tags, comma-separated, any-of; each term matches anywhere in a package's tags"},{"name":"industry_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by industry domain","title":"Industry Domain"},"description":"Filter by industry domain"},{"name":"technology_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by technology category","title":"Technology Category"},"description":"Filter by technology category"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"license","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by license","title":"License"},"description":"Filter by license"},{"name":"corporate_owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by corporate owner (supports * wildcard)","title":"Corporate Owner"},"description":"Filter by corporate owner (supports * wildcard)"},{"name":"ownership_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ownership confidence level","title":"Ownership Confidence"},"description":"Filter by ownership confidence level"},{"name":"github_org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by GitHub organization (supports * wildcard)","title":"Github Org"},"description":"Filter by GitHub organization (supports * wildcard)"},{"name":"integrates_with","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by integration (supports * wildcard)","title":"Integrates With"},"description":"Filter by integration (supports * wildcard)"},{"name":"github_org_verified","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by GitHub org verified status. PyPI only (400 on npm).","title":"Github Org Verified"},"description":"Filter by GitHub org verified status. PyPI only (400 on npm)."},{"name":"github_org_company","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by GitHub org company name","title":"Github Org Company"},"description":"Filter by GitHub org company name"},{"name":"github_primary_language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by primary language","title":"Github Primary Language"},"description":"Filter by primary language"},{"name":"author","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by author","title":"Author"},"description":"Filter by author"},{"name":"author_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by author email","title":"Author Email"},"description":"Filter by author email"},{"name":"maintainer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by maintainer","title":"Maintainer"},"description":"Filter by maintainer"},{"name":"maintainer_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by maintainer email","title":"Maintainer Email"},"description":"Filter by maintainer email"},{"name":"github_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by archived status","title":"Github Archived"},"description":"Filter by archived status"},{"name":"github_is_fork","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by fork status","title":"Github Is Fork"},"description":"Filter by fork status"},{"name":"npm_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"npm: filter by scope(s), comma-separated, case-insensitive (e.g. @aws-sdk,@types). NULL npm_scope on pypi rows means this matches nothing outside npm.","title":"Npm Scope"},"description":"npm: filter by scope(s), comma-separated, case-insensitive (e.g. @aws-sdk,@types). NULL npm_scope on pypi rows means this matches nothing outside npm."},{"name":"npm_keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"npm: filter by package.json keyword(s), comma-separated, any-of match","title":"Npm Keyword"},"description":"npm: filter by package.json keyword(s), comma-separated, any-of match"},{"name":"npm_deprecated","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"npm: true = only packages whose latest version is deprecated; false = exclude them","title":"Npm Deprecated"},"description":"npm: true = only packages whose latest version is deprecated; false = exclude them"},{"name":"npm_has_install_script","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"npm: true = latest version declares an install script","title":"Npm Has Install Script"},"description":"npm: true = latest version declares an install script"},{"name":"min_stars","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum GitHub stars","title":"Min Stars"},"description":"Minimum GitHub stars"},{"name":"max_stars","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum GitHub stars","title":"Max Stars"},"description":"Maximum GitHub stars"},{"name":"min_forks","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum GitHub forks","title":"Min Forks"},"description":"Minimum GitHub forks"},{"name":"max_forks","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum GitHub forks","title":"Max Forks"},"description":"Maximum GitHub forks"},{"name":"min_contributors","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum contributors","title":"Min Contributors"},"description":"Minimum contributors"},{"name":"max_contributors","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum contributors","title":"Max Contributors"},"description":"Maximum contributors"},{"name":"min_open_issues","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum open issues","title":"Min Open Issues"},"description":"Minimum open issues"},{"name":"max_open_issues","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum open issues","title":"Max Open Issues"},"description":"Maximum open issues"},{"name":"min_quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"description":"Minimum quality score","title":"Min Quality Score"},"description":"Minimum quality score"},{"name":"max_quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"description":"Maximum quality score","title":"Max Quality Score"},"description":"Maximum quality score"},{"name":"min_contributor_concentration","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Min contributor concentration","title":"Min Contributor Concentration"},"description":"Min contributor concentration"},{"name":"max_contributor_concentration","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Max contributor concentration","title":"Max Contributor Concentration"},"description":"Max contributor concentration"},{"name":"min_python_percentage","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"description":"Minimum Python percentage","title":"Min Python Percentage"},"description":"Minimum Python percentage"},{"name":"max_python_percentage","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"description":"Maximum Python percentage","title":"Max Python Percentage"},"description":"Maximum Python percentage"},{"name":"max_days_since_push","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum days since last push","title":"Max Days Since Push"},"description":"Maximum days since last push"},{"name":"min_days_since_push","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum days since last push","title":"Min Days Since Push"},"description":"Minimum days since last push"},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Created after date (YYYY-MM-DD)","title":"Created After"},"description":"Created after date (YYYY-MM-DD)"},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Created before date (YYYY-MM-DD)","title":"Created Before"},"description":"Created before date (YYYY-MM-DD)"},{"name":"pushed_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pushed after date (YYYY-MM-DD)","title":"Pushed After"},"description":"Pushed after date (YYYY-MM-DD)"},{"name":"pushed_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pushed before date (YYYY-MM-DD)","title":"Pushed Before"},"description":"Pushed before date (YYYY-MM-DD)"},{"name":"country_grouping","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country grouping for download metrics: ALL, US, ALL_EX_US","default":"ALL","title":"Country Grouping"},"description":"Country grouping for download metrics: ALL, US, ALL_EX_US"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. github_stars/github_forks are coerced to total_downloads (inherited, gameable — see star-farm guard); available: total_downloads, ci_downloads, non_ci_downloads, ci_percentage, unique_countries, github_quality_score, github_pushed_at, package_name","default":"total_downloads","title":"Sort"},"description":"Sort field. github_stars/github_forks are coerced to total_downloads (inherited, gameable — see star-farm guard); available: total_downloads, ci_downloads, non_ci_downloads, ci_percentage, unique_countries, github_quality_score, github_pushed_at, package_name"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort order (asc/desc)","default":"desc","title":"Order"},"description":"Sort order (asc/desc)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Limit"},"description":"Results per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/suggest":{"get":{"summary":"Typeahead package suggestions","description":"Fast popularity-ranked package name suggestions for pickers","operationId":"packages_suggest_v1_packages_suggest_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":214},{"type":"null"}],"description":"Name fragment; empty returns the most-downloaded packages","title":"Q"},"description":"Name fragment; empty returns the most-downloaded packages"},{"name":"industry_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional industry_domain filter","title":"Industry Domain"},"description":"Optional industry_domain filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":15,"title":"Limit"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}":{"get":{"summary":"Get package details","description":"Get full details for a specific package","operationId":"get_package_v1_packages__package_name__get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/dependencies":{"get":{"summary":"Direct package dependencies","description":"The package's direct (first-degree) required dependencies, with summary, stars and quality score for each one that is indexed. Parsed from PEP-508 requires_dist (pypi; names in PEP 503 form) or the latest version's runtime dependencies (npm). A pypi dependency that applies only on some interpreters or platforms carries its `marker`; ones that apply only with an optional extra are listed separately in `optional_dependencies` with the `extra`. For deps-of-deps and health flags use /depgraph?depth=2.","operationId":"package_dependencies_v1_packages__package_name__dependencies_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/batch":{"post":{"summary":"Batch package lookup","description":"Get details for multiple packages in one request (max 100)","operationId":"batch_packages_v1_packages_batch_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPackagesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/metrics":{"get":{"summary":"Package metrics","description":"Get download metrics time series for a package","operationId":"package_metrics_v1_packages__package_name__metrics_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","pattern":"^(monthly|weekly)$","description":"Time granularity: 'monthly' (all tiers) or 'weekly' (Pro+ only)","default":"monthly","title":"Granularity"},"description":"Time granularity: 'monthly' (all tiers) or 'weekly' (Pro+ only)"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Start Date"},"description":"Start date (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"End Date"},"description":"End date (YYYY-MM-DD)"},{"name":"country_grouping","in":"query","required":false,"schema":{"type":"string","pattern":"^(ALL|US|ALL_EX_US)$","description":"Country grouping","default":"ALL","title":"Country Grouping"},"description":"Country grouping"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields","title":"Fields"},"description":"Comma-separated list of fields"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/time-series":{"get":{"summary":"Analytics time series","description":"Get time series analytics for packages selected by name or filters","operationId":"analytics_time_series_v1_analytics_time_series_get","parameters":[{"name":"packages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated package names (1-25). If not provided, use filters.","title":"Packages"},"description":"Comma-separated package names (1-25). If not provided, use filters."},{"name":"industry_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain","title":"Industry Domain"},"description":"Filter by domain"},{"name":"technology_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category","title":"Technology Category"},"description":"Filter by category"},{"name":"corporate_owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by owner","title":"Corporate Owner"},"description":"Filter by owner"},{"name":"github_org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by GitHub org","title":"Github Org"},"description":"Filter by GitHub org"},{"name":"integrates_with","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by integration","title":"Integrates With"},"description":"Filter by integration"},{"name":"use_case_tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag","title":"Use Case Tags"},"description":"Filter by tag"},{"name":"license","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by license","title":"License"},"description":"Filter by license"},{"name":"author","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by author","title":"Author"},"description":"Filter by author"},{"name":"github_org_company","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by org company","title":"Github Org Company"},"description":"Filter by org company"},{"name":"github_primary_language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by language","title":"Github Primary Language"},"description":"Filter by language"},{"name":"min_quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"description":"Min quality score","title":"Min Quality Score"},"description":"Min quality score"},{"name":"max_quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"description":"Max quality score","title":"Max Quality Score"},"description":"Max quality score"},{"name":"min_python_percentage","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"description":"Min Python %","title":"Min Python Percentage"},"description":"Min Python %"},{"name":"max_python_percentage","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"description":"Max Python %","title":"Max Python Percentage"},"description":"Max Python %"},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Top N packages to select","default":10,"title":"Top"},"description":"Top N packages to select"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort by: total_downloads, github_stars, github_quality_score","default":"total_downloads","title":"Sort By"},"description":"Sort by: total_downloads, github_stars, github_quality_score"},{"name":"ranking_period","in":"query","required":false,"schema":{"type":"string","description":"Period for ranking: 30d, 90d, 365d","default":"30d","title":"Ranking Period"},"description":"Period for ranking: 30d, 90d, 365d"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for time series","title":"Start Date"},"description":"Start date for time series"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for time series","title":"End Date"},"description":"End date for time series"},{"name":"country_grouping","in":"query","required":false,"schema":{"type":"string","description":"Country grouping: ALL, US, ALL_EX_US","default":"ALL","title":"Country Grouping"},"description":"Country grouping: ALL, US, ALL_EX_US"},{"name":"breakdown","in":"query","required":false,"schema":{"enum":["none","ci","os","os_simple","arch","tls","format","installers","interpreters","diversity","linux","full"],"type":"string","description":"Breakdown: which download fields each series carries. arch: x86_64_downloads and arm_downloads are Linux and macOS hardware; Windows (AMD64/ARM64), clients that report no CPU and rarer chips are in neither (6.2% of PyPI downloads in August 2026) and are counted in other_arch_downloads, so the three add up to total_downloads. See https://www.ensemblai.com/methodology/downloads","default":"none","title":"Breakdown"},"description":"Breakdown: which download fields each series carries. arch: x86_64_downloads and arm_downloads are Linux and macOS hardware; Windows (AMD64/ARM64), clients that report no CPU and rarer chips are in neither (6.2% of PyPI downloads in August 2026) and are counted in other_arch_downloads, so the three add up to total_downloads. See https://www.ensemblai.com/methodology/downloads"},{"name":"metrics","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom metrics list","title":"Metrics"},"description":"Custom metrics list"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","pattern":"^(monthly|weekly)$","description":"Time granularity: 'monthly' (all tiers) or 'weekly' (Pro+ only). PG path only.","default":"monthly","title":"Granularity"},"description":"Time granularity: 'monthly' (all tiers) or 'weekly' (Pro+ only). PG path only."},{"name":"aggregates","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Aggregate series alongside `packages`. Comma-separated, each item either `total` or `<kind>:<value>` where kind ∈ domain|category|owner|tag. At most 10 per request; extra or unrecognized items are skipped and listed in `warnings`. Tags match whole tags exactly (case-insensitive). For a union of tags use '|' (URL-encoded %7C): 'tag:ai-agents|mcp-server'. '+' is also accepted but must be sent as %2B, because a bare '+' in a query string decodes to a space. Example: 'total,domain:AI/ML,owner:Google,tag:ai-agents|mcp-server'.","title":"Aggregates"},"description":"Aggregate series alongside `packages`. Comma-separated, each item either `total` or `<kind>:<value>` where kind ∈ domain|category|owner|tag. At most 10 per request; extra or unrecognized items are skipped and listed in `warnings`. Tags match whole tags exactly (case-insensitive). For a union of tags use '|' (URL-encoded %7C): 'tag:ai-agents|mcp-server'. '+' is also accepted but must be sent as %2B, because a bare '+' in a query string decodes to a space. Example: 'total,domain:AI/ML,owner:Google,tag:ai-agents|mcp-server'."},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leaderboards/downloads":{"get":{"summary":"Download leaderboard","description":"Get top packages by downloads","operationId":"leaderboard_downloads_v1_leaderboards_downloads_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Period: 30d, 90d, 365d","default":"30d","title":"Period"},"description":"Period: 30d, 90d, 365d"},{"name":"industry_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain","title":"Industry Domain"},"description":"Filter by domain"},{"name":"technology_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category","title":"Technology Category"},"description":"Filter by category"},{"name":"country_grouping","in":"query","required":false,"schema":{"type":"string","description":"Country grouping","default":"ALL","title":"Country Grouping"},"description":"Country grouping"},{"name":"corporate_owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by owner","title":"Corporate Owner"},"description":"Filter by owner"},{"name":"github_org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by GitHub org","title":"Github Org"},"description":"Filter by GitHub org"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of results","default":100,"title":"Limit"},"description":"Number of results"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/companies":{"get":{"summary":"List companies","description":"List companies with aggregated downloads, ranked by total downloads","operationId":"list_companies_v1_companies_get","parameters":[{"name":"industry_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain","title":"Industry Domain"},"description":"Filter by domain"},{"name":"ownership_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by confidence","title":"Ownership Confidence"},"description":"Filter by confidence"},{"name":"verified_only","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only packages from GitHub-verified organizations: true/false. PyPI only (400 on npm).","title":"Verified Only"},"description":"Only packages from GitHub-verified organizations: true/false. PyPI only (400 on npm)."},{"name":"is_official","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to only packages with 'official' in summary: true/false","title":"Is Official"},"description":"Filter to only packages with 'official' in summary: true/false"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for downloads (YYYY-MM-DD)","title":"Start Date"},"description":"Start date for downloads (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for downloads (YYYY-MM-DD)","title":"End Date"},"description":"End date for downloads (YYYY-MM-DD)"},{"name":"period","in":"query","required":false,"schema":{"enum":["30d","90d","365d"],"type":"string","description":"Window when no start/end dates are given: 30d, 90d or 365d.","default":"30d","title":"Period"},"description":"Window when no start/end dates are given: 30d, 90d or 365d."},{"name":"min_packages","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Minimum package count","default":1,"title":"Min Packages"},"description":"Minimum package count"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Results per page","default":100,"title":"Limit"},"description":"Results per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/companies/{company_name}/stats":{"get":{"summary":"Company statistics","description":"Get detailed statistics for a company","operationId":"company_stats_v1_companies__company_name__stats_get","parameters":[{"name":"company_name","in":"path","required":true,"schema":{"type":"string","title":"Company Name"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"description":"Months for stats","default":3,"title":"Months"},"description":"Months for stats"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/domains":{"get":{"summary":"List industry domains","description":"Get all distinct industry domain values","operationId":"reference_domains_v1_reference_domains_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"enum":["pypi","npm"],"type":"string"},{"type":"null"}],"description":"Only this ecosystem's values. Omitted: both ecosystems.","title":"Ecosystem"},"description":"Only this ecosystem's values. Omitted: both ecosystems."},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/categories":{"get":{"summary":"List technology categories","description":"Get all distinct technology category values","operationId":"reference_categories_v1_reference_categories_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"enum":["pypi","npm"],"type":"string"},{"type":"null"}],"description":"Only this ecosystem's values. Omitted: both ecosystems.","title":"Ecosystem"},"description":"Only this ecosystem's values. Omitted: both ecosystems."},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/licenses":{"get":{"summary":"List licenses","description":"Distinct license values, most-used first. Capped at 5,000; `truncated` is true when more exist.","operationId":"reference_licenses_v1_reference_licenses_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"enum":["pypi","npm"],"type":"string"},{"type":"null"}],"description":"Only this ecosystem's values. Omitted: both ecosystems.","title":"Ecosystem"},"description":"Only this ecosystem's values. Omitted: both ecosystems."},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/languages":{"get":{"summary":"List primary languages","description":"Get all distinct GitHub primary language values","operationId":"reference_languages_v1_reference_languages_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"enum":["pypi","npm"],"type":"string"},{"type":"null"}],"description":"Only this ecosystem's values. Omitted: both ecosystems.","title":"Ecosystem"},"description":"Only this ecosystem's values. Omitted: both ecosystems."},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/owners":{"get":{"summary":"List corporate owners","description":"Get all distinct corporate owner values","operationId":"reference_owners_v1_reference_owners_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"enum":["pypi","npm"],"type":"string"},{"type":"null"}],"description":"Only this ecosystem's values. Omitted: both ecosystems.","title":"Ecosystem"},"description":"Only this ecosystem's values. Omitted: both ecosystems."},{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reference/countries":{"get":{"summary":"List countries","description":"Get all country reference data","operationId":"reference_countries_v1_reference_countries_get","parameters":[{"name":"contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only values containing this text (case-insensitive).","title":"Contains"},"description":"Only values containing this text (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"description":"Return at most this many values (default: all).","title":"Limit"},"description":"Return at most this many values (default: all)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/growth":{"get":{"summary":"Growth analytics","description":"Calculate growth rates for packages","operationId":"analytics_growth_v1_analytics_growth_get","parameters":[{"name":"packages","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated package names (max 100)","title":"Packages"},"description":"Comma-separated package names (max 100)"},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"mom: the latest complete month vs the month before. qoq: the latest 3 complete months vs the 3 before. yoy: the latest 12 complete months vs the 12 before -- trailing sums, not the same month a year earlier. 30d / 90d / 365d are accepted as aliases.","default":"mom","title":"Period"},"description":"mom: the latest complete month vs the month before. qoq: the latest 3 complete months vs the 3 before. yoy: the latest 12 complete months vs the 12 before -- trailing sums, not the same month a year earlier. 30d / 90d / 365d are accepted as aliases."},{"name":"country_grouping","in":"query","required":false,"schema":{"type":"string","description":"Country grouping: ALL, US, ALL_EX_US","default":"ALL","title":"Country Grouping"},"description":"Country grouping: ALL, US, ALL_EX_US"},{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"An additive metric (a download count). ci_percentage and unique_* are not additive across months and are rejected.","default":"total_downloads","title":"Metric"},"description":"An additive metric (a download count). ci_percentage and unique_* are not additive across months and are rejected."},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/companies/{company_name}/packages":{"get":{"summary":"Company packages","description":"List all packages owned by a company","operationId":"company_packages_v1_companies__company_name__packages_get","parameters":[{"name":"company_name","in":"path","required":true,"schema":{"type":"string","title":"Company Name"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort field","default":"total_downloads","title":"Sort"},"description":"Sort field"},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"Sort order (asc/desc)","default":"desc","title":"Order"},"description":"Sort order (asc/desc)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":50,"title":"Limit"},"description":"Results per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exports/packages":{"post":{"summary":"Export packages","description":"Export package data to CSV or JSON format. Dashboard calls (via X-Impersonate-Customer) are gated only by the tier's exports.csv.* caps; direct-API calls also require api.access (Pro+).","operationId":"export_packages_v1_exports_packages_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlist":{"get":{"summary":"Get watchlist","description":"Get current user's watchlist","operationId":"get_watchlist_v1_watchlist_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add to watchlist","description":"Add a package to the watchlist","operationId":"add_to_watchlist_v1_watchlist_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlist/{package_name}":{"delete":{"summary":"Remove from watchlist","description":"Remove a package from the watchlist","operationId":"remove_from_watchlist_v1_watchlist__package_name__delete","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ensembles":{"get":{"summary":"List ensembles","description":"List all user's saved ensembles","operationId":"list_ensembles_v1_ensembles_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create ensemble","description":"Create a new package ensemble","operationId":"create_ensemble_v1_ensembles_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnsembleCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ensembles/{ensemble_id}":{"get":{"summary":"Get ensemble","description":"Get details of a specific ensemble","operationId":"get_ensemble_v1_ensembles__ensemble_id__get","parameters":[{"name":"ensemble_id","in":"path","required":true,"schema":{"type":"string","title":"Ensemble Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update ensemble","description":"Update an existing ensemble","operationId":"update_ensemble_v1_ensembles__ensemble_id__put","parameters":[{"name":"ensemble_id","in":"path","required":true,"schema":{"type":"string","title":"Ensemble Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnsembleUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete ensemble","description":"Delete an ensemble","operationId":"delete_ensemble_v1_ensembles__ensemble_id__delete","parameters":[{"name":"ensemble_id","in":"path","required":true,"schema":{"type":"string","title":"Ensemble Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ensembles/{ensemble_id}/analytics":{"get":{"summary":"Ensemble analytics","description":"Get time series analytics for all packages in an ensemble","operationId":"ensemble_analytics_v1_ensembles__ensemble_id__analytics_get","parameters":[{"name":"ensemble_id","in":"path","required":true,"schema":{"type":"string","title":"Ensemble Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date","title":"Start Date"},"description":"Start date"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date","title":"End Date"},"description":"End date"},{"name":"country_grouping","in":"query","required":false,"schema":{"type":"string","description":"Country grouping","default":"ALL","title":"Country Grouping"},"description":"Country grouping"},{"name":"breakdown","in":"query","required":false,"schema":{"enum":["none","ci","os","os_simple","arch","tls","format","installers","interpreters","diversity","linux","full"],"type":"string","description":"Breakdown: which download fields each series carries. arch: x86_64_downloads and arm_downloads are Linux and macOS hardware; Windows (AMD64/ARM64), clients that report no CPU and rarer chips are in neither (6.2% of PyPI downloads in August 2026) and are counted in other_arch_downloads, so the three add up to total_downloads. See https://www.ensemblai.com/methodology/downloads","default":"none","title":"Breakdown"},"description":"Breakdown: which download fields each series carries. arch: x86_64_downloads and arm_downloads are Linux and macOS hardware; Windows (AMD64/ARM64), clients that report no CPU and rarer chips are in neither (6.2% of PyPI downloads in August 2026) and are counted in other_arch_downloads, so the three add up to total_downloads. See https://www.ensemblai.com/methodology/downloads"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/geography":{"get":{"summary":"Geography breakdown","description":"Get geographic distribution of downloads for packages","operationId":"analytics_geography_v1_analytics_geography_get","parameters":[{"name":"packages","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated package names (max 10)","title":"Packages"},"description":"Comma-separated package names (max 10)"},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Period: 30d, 90d, 365d","default":"30d","title":"Period"},"description":"Period: 30d, 90d, 365d"},{"name":"top_countries","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Top N countries","default":20,"title":"Top Countries"},"description":"Top N countries"},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by region","title":"Region"},"description":"Filter by region"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/notifications":{"get":{"summary":"List notifications","description":"In-app notifications for the authenticated customer. Most-recent first.","operationId":"list_notifications_v1_customer_notifications_get","parameters":[{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/alerts":{"get":{"summary":"List alert rules","operationId":"list_alert_rules_v1_customer_alerts_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create alert rule","operationId":"create_alert_rule_v1_customer_alerts_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/alerts/{rule_id}":{"delete":{"summary":"Delete alert rule","operationId":"delete_alert_rule_v1_customer_alerts__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/cohort":{"get":{"summary":"Per-version monthly downloads (cohort heatmap)","description":"PG-fast when pre-aggregated by build_package_version_monthly worker; long-tail packages route to BQ at /v1/analytics/version-adoption.","operationId":"package_cohort_v1_packages__package_name__cohort_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":36,"minimum":3,"default":12,"title":"Months"}},{"name":"top_versions","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":3,"default":10,"title":"Top Versions"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ecosystem/clusters":{"get":{"summary":"Louvain ecosystem clusters","description":"Returns clusters of packages that share many dependencies, as a proxy for co-installation. Each cluster has a derived label (most common technology_category) and top members by within-cluster centrality.","operationId":"ecosystem_clusters_v1_ecosystem_clusters_get","parameters":[{"name":"min_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Drop clusters smaller than this","default":5,"title":"Min Size"},"description":"Drop clusters smaller than this"},{"name":"top_per_cluster","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Top members per cluster by centrality","default":8,"title":"Top Per Cluster"},"description":"Top members per cluster by centrality"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ecosystem":{"get":{"summary":"Ecosystem map by canonical domain","description":"Returns each industry_domain in config/taxonomy.yaml with package count, total downloads, top packages, and dominant technology categories. Populated from PG packages + package_monthly_stats.","operationId":"ecosystem_map_v1_ecosystem_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"The map covers the latest complete month; only 30d is available.","default":"30d","title":"Period"},"description":"The map covers the latest complete month; only 30d is available."},{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Top packages per domain","default":5,"title":"Top N"},"description":"Top packages per domain"},{"name":"top_domains","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Return only the largest N domains (default: all).","title":"Top Domains"},"description":"Return only the largest N domains (default: all)."},{"name":"categories_per_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":0},{"type":"null"}],"description":"Keep only each domain's N largest categories (default: all). The full map is ~140 KB, most of it per-domain category lists.","title":"Categories Per Domain"},"description":"Keep only each domain's N largest categories (default: all). The full map is ~140 KB, most of it per-domain category lists."},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/depgraph":{"get":{"summary":"First/second-degree dependency graph","description":"Returns the package's direct dependencies (depth=1) or one further hop (depth=2). Parsed from PEP-508 requires_dist; environment markers and extras stripped.","operationId":"package_depgraph_v1_packages__package_name__depgraph_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":2,"minimum":1,"description":"1 = direct deps; 2 = deps-of-deps too","default":1,"title":"Depth"},"description":"1 = direct deps; 2 = deps-of-deps too"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/audit-deps":{"post":{"summary":"Audit dependency health + vulnerabilities","description":"Submit (package, version) entries from a requirements.txt / package.json / lockfile. Returns per-dependency health flags (deprecated, abandoned, declining, single-maintainer, install-script, not-found …) from EnsemblAI data plus OSV.dev vulnerability matches. Max 200 entries per request. ecosystem=pypi|npm.","operationId":"audit_deps_v1_customer_audit_deps_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditDepsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/audit-deps/{vuln_id}":{"get":{"summary":"Get OSV vulnerability detail","description":"Fetch one vulnerability record from OSV.dev by ID (e.g. GHSA-xxxx-xxxx, PYSEC-xxxx)","operationId":"audit_deps_vuln_detail_v1_customer_audit_deps__vuln_id__get","parameters":[{"name":"vuln_id","in":"path","required":true,"schema":{"type":"string","title":"Vuln Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/api-keys":{"get":{"summary":"List own API keys","description":"List API keys belonging to the authenticated customer (no full key value)","operationId":"list_api_keys_v1_customer_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Issue new API key","description":"Generate a new API key for the authenticated customer. The full key is returned ONCE in the response — store it immediately, it cannot be retrieved later.","operationId":"create_api_key_v1_customer_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/api-keys/{api_key_id}":{"delete":{"summary":"Revoke API key","description":"Mark an API key as revoked. The key cannot be re-activated; issue a new one if needed.","operationId":"revoke_api_key_v1_customer_api_keys__api_key_id__delete","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer/audit":{"get":{"summary":"List audit log entries","description":"Recent state-changing actions (writes) on the authenticated customer's resources","operationId":"list_audit_v1_customer_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"action_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to actions starting with this prefix (e.g. 'api_key.')","title":"Action Prefix"},"description":"Filter to actions starting with this prefix (e.g. 'api_key.')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/saved-searches":{"get":{"summary":"List saved searches","description":"List all user's saved searches","operationId":"list_saved_searches_v1_saved_searches_get","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create saved search","description":"Save a search configuration for reuse","operationId":"create_saved_search_v1_saved_searches_post","parameters":[{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/saved-searches/{search_id}":{"get":{"summary":"Get saved search","description":"Get a specific saved search","operationId":"get_saved_search_v1_saved_searches__search_id__get","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string","title":"Search Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update saved search","description":"Update an existing saved search","operationId":"update_saved_search_v1_saved_searches__search_id__put","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string","title":"Search Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete saved search","description":"Delete a saved search","operationId":"delete_saved_search_v1_saved_searches__search_id__delete","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string","title":"Search Id"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/saved-searches/{search_id}/execute":{"get":{"summary":"Execute saved search","description":"Run a saved search and return results","operationId":"execute_saved_search_v1_saved_searches__search_id__execute_get","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"string","title":"Search Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/health":{"get":{"summary":"Package health scores","description":"Get computed health scores for a package","operationId":"package_health_scores_v1_packages__package_name__health_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/versions":{"get":{"summary":"List package versions","description":"Get all versions of a package with download statistics","operationId":"get_package_versions_v1_packages__package_name__versions_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Time period: 30d, 90d, 180d, 365d","default":"30d","title":"Period"},"description":"Time period: 30d, 90d, 180d, 365d"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum versions to return","default":20,"title":"Limit"},"description":"Maximum versions to return"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort by: total_downloads, version, first_seen, last_seen","default":"total_downloads","title":"Sort"},"description":"Sort by: total_downloads, version, first_seen, last_seen"},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"Sort order: asc, desc","default":"desc","title":"Order"},"description":"Sort order: asc, desc"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packages/{package_name}/versions/{version}/metrics":{"get":{"summary":"Version metrics time series","description":"Get download metrics time series for a specific package version","operationId":"get_version_metrics_v1_packages__package_name__versions__version__metrics_get","parameters":[{"name":"package_name","in":"path","required":true,"schema":{"type":"string","title":"Package Name"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","description":"Start date (YYYY-MM-DD) - required","title":"Start Date"},"description":"Start date (YYYY-MM-DD) - required"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD), defaults to today","title":"End Date"},"description":"End date (YYYY-MM-DD), defaults to today"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"Granularity: daily, weekly, monthly","default":"daily","title":"Granularity"},"description":"Granularity: daily, weekly, monthly"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated metrics to include","title":"Fields"},"description":"Comma-separated metrics to include"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/version-adoption":{"get":{"summary":"Version adoption analysis","description":"Analyze version adoption patterns for a package","operationId":"analytics_version_adoption_v1_analytics_version_adoption_get","parameters":[{"name":"package","in":"query","required":true,"schema":{"type":"string","description":"Package name","title":"Package"},"description":"Package name"},{"name":"versions","in":"query","required":false,"schema":{"type":"string","description":"Versions to compare: 'top5', 'top10', or comma-separated list","default":"top5","title":"Versions"},"description":"Versions to compare: 'top5', 'top10', or comma-separated list"},{"name":"period","in":"query","required":false,"schema":{"enum":["7d","30d","90d","180d","365d"],"type":"string","description":"Time period: 7d, 30d, 90d, 180d or 365d.","default":"90d","title":"Period"},"description":"Time period: 7d, 30d, 90d, 180d or 365d."},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"Granularity: daily, weekly, monthly","default":"weekly","title":"Granularity"},"description":"Granularity: daily, weekly, monthly"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/filters/values":{"get":{"summary":"Get filter values with counts","description":"Get distinct values for a filter field with optional package counts","operationId":"get_filter_values_v1_filters_values_get","parameters":[{"name":"field","in":"query","required":true,"schema":{"type":"string","description":"Field: industry_domain, technology_category, use_case_tags, corporate_owner, license, github_primary_language, npm_scope, npm_keywords, npm_deprecated, npm_latest_has_install_script","title":"Field"},"description":"Field: industry_domain, technology_category, use_case_tags, corporate_owner, license, github_primary_language, npm_scope, npm_keywords, npm_deprecated, npm_latest_has_install_script"},{"name":"with_counts","in":"query","required":false,"schema":{"type":"boolean","description":"Include package counts","default":true,"title":"With Counts"},"description":"Include package counts"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"npm_scope only: prefix search ('aws' or '@aws') — returns the top 20 matching scopes by package count, reaching past the unqueried top-200 cap","title":"Q"},"description":"npm_scope only: prefix search ('aws' or '@aws') — returns the top 20 matching scopes by package count, reaching past the unqueried top-200 cap"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations":{"get":{"summary":"List GitHub organizations","description":"List GitHub organizations with aggregated downloads","operationId":"list_organizations_v1_organizations_get","parameters":[{"name":"ownership_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ownership confidence: High, Medium, Low","title":"Ownership Confidence"},"description":"Filter by ownership confidence: High, Medium, Low"},{"name":"verified_only","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to only GitHub verified organizations: true/false. PyPI only (400 on npm).","title":"Verified Only"},"description":"Filter to only GitHub verified organizations: true/false. PyPI only (400 on npm)."},{"name":"is_official","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to packages where summary contains 'official': true/false","title":"Is Official"},"description":"Filter to packages where summary contains 'official': true/false"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for downloads (YYYY-MM-DD)","title":"Start Date"},"description":"Start date for downloads (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for downloads (YYYY-MM-DD)","title":"End Date"},"description":"End date for downloads (YYYY-MM-DD)"},{"name":"period","in":"query","required":false,"schema":{"enum":["30d","90d","365d"],"type":"string","description":"Window when no start/end dates are given: 30d, 90d or 365d.","default":"30d","title":"Period"},"description":"Window when no start/end dates are given: 30d, 90d or 365d."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort field: downloads, package_count","default":"downloads","title":"Sort"},"description":"Sort field: downloads, package_count"},{"name":"min_packages","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Minimum package count per organization","default":1,"title":"Min Packages"},"description":"Minimum package count per organization"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Number of organizations to return","default":100,"title":"Limit"},"description":"Number of organizations to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations/{github_org}/packages":{"get":{"summary":"Get organization packages","description":"Get packages belonging to a GitHub organization or individual developer","operationId":"organization_packages_v1_organizations__github_org__packages_get","parameters":[{"name":"github_org","in":"path","required":true,"schema":{"type":"string","title":"Github Org"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for downloads (YYYY-MM-DD)","title":"Start Date"},"description":"Start date for downloads (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for downloads (YYYY-MM-DD)","title":"End Date"},"description":"End date for downloads (YYYY-MM-DD)"},{"name":"period","in":"query","required":false,"schema":{"enum":["30d","90d","365d"],"type":"string","description":"Window when no start/end dates are given: 30d, 90d or 365d.","default":"30d","title":"Period"},"description":"Window when no start/end dates are given: 30d, 90d or 365d."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of packages to return","default":10,"title":"Limit"},"description":"Number of packages to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","pattern":"^(pypi|npm)$","description":"Package ecosystem: 'pypi' (default) or 'npm'.","default":"pypi","title":"Ecosystem"},"description":"Package ecosystem: 'pypi' (default) or 'npm'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"summary":"Current key + tier introspection","description":"Returns the calling key's tier, customer info, rate limit, and history-cap so customers can self-diagnose without contacting support.","operationId":"me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"API root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertRuleCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"package_name":{"type":"string","title":"Package Name"},"metric":{"type":"string","enum":["mom_pct","total_downloads","github_stars","github_quality_score"],"title":"Metric"},"operator":{"type":"string","enum":["gt","lt","eq"],"title":"Operator"},"threshold":{"type":"number","title":"Threshold"},"delivery":{"type":"string","const":"in_app","title":"Delivery","default":"in_app"},"delivery_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Target"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","package_name","metric","operator","threshold"],"title":"AlertRuleCreate"},"ApiKeyCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Friendly name for the key (e.g., 'CI server')"},"env":{"type":"string","title":"Env","description":"Key environment: 'live' or 'test'","default":"live"}},"type":"object","title":"ApiKeyCreateRequest"},"AuditDepsRequest":{"properties":{"requirements":{"items":{"$ref":"#/components/schemas/AuditDepsRequirement"},"type":"array","title":"Requirements"}},"type":"object","required":["requirements"],"title":"AuditDepsRequest"},"AuditDepsRequirement":{"properties":{"package":{"type":"string","title":"Package"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","required":["package"],"title":"AuditDepsRequirement"},"BatchPackagesRequest":{"properties":{"packages":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Packages","description":"List of package names to fetch (max 100)"}},"type":"object","required":["packages"],"title":"BatchPackagesRequest"},"EnsembleCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Ensemble name"},"packages":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Packages","description":"List of package names"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Ensemble description"}},"type":"object","required":["name","packages"],"title":"EnsembleCreateRequest"},"EnsembleUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New ensemble name"},"packages":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Packages","description":"Updated package list"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Updated description"}},"type":"object","title":"EnsembleUpdateRequest"},"ExportRequest":{"properties":{"format":{"type":"string","enum":["csv","json","parquet"],"title":"Format","description":"csv, json or parquet","default":"csv"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"The /v1/packages listing's filter parameters (q, industry_domain, technology_category, corporate_owner, github_org, license, min_stars, ...). The export returns the packages that listing returns, in its order. Unknown keys are a 422."},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Columns to export. Unknown columns are a 422; omit for the defaults."},"sort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort","description":"A /v1/packages sort field (default total_downloads). As in the listing, github_stars/github_forks rank by total_downloads."},"order":{"type":"string","enum":["asc","desc"],"title":"Order","default":"desc"},"country_grouping":{"type":"string","enum":["ALL","US","ALL_EX_US"],"title":"Country Grouping","default":"ALL"},"max_rows":{"type":"integer","maximum":250000.0,"minimum":1.0,"title":"Max Rows","description":"Requested max rows. Clamped DOWN to the tier's exports.csv.row_cap; 250000 is the absolute ceiling (matches the highest configured tier cap).","default":1000}},"type":"object","title":"ExportRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SavedSearchCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Search name"},"filters":{"additionalProperties":true,"type":"object","title":"Filters","description":"Search filters"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description"}},"type":"object","required":["name","filters"],"title":"SavedSearchCreateRequest"},"SavedSearchUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New name"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"Updated filters"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Updated description"}},"type":"object","title":"SavedSearchUpdateRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WatchlistAddRequest":{"properties":{"package_name":{"type":"string","title":"Package Name","description":"Package name to add to watchlist"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Optional notes about the package"}},"type":"object","required":["package_name"],"title":"WatchlistAddRequest"}},"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Your EnsemblAI API key (ek_...). API access is on the Pro plan."},"BearerKey":{"type":"http","scheme":"bearer","description":"The same key as `Authorization: Bearer ek_...`."}}},"security":[{"ApiKeyHeader":[]},{"BearerKey":[]}]}