Loading...
Loading...
REST API and MCP server, newest first
Every release that changes what the API or the MCP server accepts or returns is listed here. The REST version is the info.version field of the OpenAPI schema; the MCP server reports its version in the connection handshake. Breaking marks a change that can make a request that used to work fail or return something different.
October 18, 2026
/v1/packages/{name}/dependents: how many packages depend on a package and the 25 most-downloaded of them, for both ecosystems (PyPI: required dependencies; npm: runtime dependencies). In MCP, package_depgraph takes direction="dependents".surge_flags on package details, surge on leaderboard, growth and company rows, with surge_basis explaining the rule. A month is flagged when a package out-downloads a dependency every install of it requires by more than in any of the previous 12 months, or when its downloads at least double while its CI or Ubuntu share falls away.maintainer_count is filled in for PyPI packages (from PyPI's owner and maintainer roles), and flag_definitions gives the rule behind each health flag in the response.github_repository.github_repo_missing is true when GitHub says the package's repository does not exist (deleted, private or a mistyped link); package pages no longer link to it.corporate_owner is null when a package has no company owner; some npm packages returned an empty string.total_downloads is null, not 0, for a package with no stored month, as package details already said.October 17, 2026
charset_normalizer and typing_extensions are no longer flagged not_found, and latest_version is filled in for PyPI packages./health, /versions and /versions/{version}/metrics accept scoped npm names such as @types/node; they answered 404.download_basis on PyPI responses is a short summary with a link to the full text at /v1/methodology/download-basis (no key needed). The full text no longer says to expect ~95% of a raw-row source after August 24, 2026: the two agree within about 2%.October 15, 2026
/v1/packages/{name}/health compares the latest complete month with the one before it, and names it in raw_metrics.month. For PyPI it read the month in progress, so every package showed a 62–66% drop and the lowest momentum score.vuln_count counts vulnerabilities, not database records. One flaw recorded by both GitHub and PyPA (for example GHSA-j8r2-6x86-q33q and PYSEC-2023-74) counted twice. New vuln_groups lists the records of each vulnerability; vuln_ids is unchanged.dependencies lists required dependencies only, each with its marker when it applies only on some Python versions or platforms. Ones that apply only with an optional extra moved to optional_dependencies with the extra; the dependency graph leaves them out.charset_normalizer finds charset-normalizer, and a dotted name such as zope.interface returns the package with its downloads rather than an empty duplicate.unique_countries is null where it was not measured (months before July 2026, weeks before the one ending August 23, 2026); it read 1 for every package there. A weekly series' period.months is the number of months it covers, with the number of weeks in period.weeks; it held the number of weeks./v1/analytics/growth takes up to 100 packages per request (was 25).time_series_for_packages takes aggregates (whole-segment series for a domain, category, owner, tag or the whole ecosystem, with or without packages), and it, get_package_metrics, growth_movers and top_downloads take country_grouping (PyPI). growth_movers ranks the 100 most-downloaded packages of its scope, not 25. package_depgraph takes depth and no longer claims to list dependents.compare_packages needs at least two different packages. list_company_packages and get_organization_packages cap limit at 100, as the API does (they said 500 and failed above 100). Free-trial answers list what the trial changed in that request under _trial.applied.October 14, 2026
365d and custom dates name the same corporate_owner as 30d and 90d: a company that owns at least 20% of the organization's packages (and at least three), otherwise none. They named whichever company came last alphabetically among owners of any one of its packages.October 14, 2026
400 (FILTER_UNSUPPORTED_FOR_ECOSYSTEM) with ecosystem=npm: verified_only=true on /v1/companies and /v1/organizations, and github_org_verified (true or false) on /v1/packages and package exports. On npm organizations at 30d and 90d the filter was ignored and every organization came back; everywhere else it matched nothing. With ecosystem=pypi they work as before.365d and for custom dates hold GitHub organizations only, the same set as 30d and 90d. They also listed personal GitHub accounts that publish packages.October 14, 2026
period names them: 30d is the latest complete month, 90d that month and the two before it, 365d the twelve months ending with it (start_date and end_date are the first days of the first and last month). The default /v1/companies and /v1/organizations lists used to label their totals with the 30 or 90 days up to the day of the request./v1/organizations/{org}/packages could add an extra month: counted back in 30-day steps, 30d took in two months whenever the month before the latest one has 30 days, and 90d four whenever February fell inside. They now cover exactly the months in period.October 12, 2026
/v1/companies/{name}/stats and /packages answer for the company the name merged into and add resolved_from with the name you sent; the corporate_owner filter and owner: aggregates follow the same names. A name that still owns packages is answered as itself.corporate_owner=* (and the "top corporate-owned" leaderboard) used to count npm packages stored with an empty owner as corporate; corporate_owner=_null now returns them along with the ones stored as null.October 8, 2026
https://mcp.ensemblai.com/mcp returns the OAuth sign-in challenge (HTTP 401), so Claude asks you to sign in, and a free account then has its own 10 a day. The /try address, and clients that send an empty or placeholder key, still get a message instead._trial.caps (10 rows, 6 months, monthly data). A trial call from a signed-in account that passes an argument the trial cannot apply (domain, category, offset) is refused without using a call, instead of answering without it.October 3, 2026
https://mcp.ensemblai.com/mcp without signing in now lists all 32 tools. The five trial tools work as before; calling any other tool returns an OAuth sign-in challenge (HTTP 401), so Claude asks you to sign in and runs the call once you are signed in with a Pro account. Signing in and API keys work as before. The /try address, and clients that send an empty or placeholder key (the Claude Code plugin before a key is set), still list only the five trial tools.https://clerk.ensemblai.com, without a trailing slash) and is also served at /.well-known/oauth-protected-resource.October 2, 2026
breakdown=arch adds other_arch_downloads: the downloads in neither x86_64_downloads nor arm_downloads (Windows, which reports AMD64 / ARM64; clients that report no CPU; rarer chips). The three now add up to total_downloads. It is derived from the stored counts, so it covers all history, and it is null for npm, which has no architecture split. It is also returned wherever both architecture fields are: with breakdown=full, on ensemble analytics, and on /v1/packages/{name}/metrics./v1/packages, and for the domain and category lookups behind leaderboards, time series and aggregates. Results are unchanged.llms.txt and these docs state the current classification (20 domains and 80 categories) and 2.5M pre-computed rollup rows, and the trial instructions say that a key or sign-in upgrades the same connection. The tools are unchanged.October 1, 2026
/v1/analytics/time-series returns 422 instead of 400, like every other validation error. The error code and message are unchanged./v1/leaderboards/downloads, and the MCP top_downloads tool, answer a filter value that matches no packages with a NO_MATCHING_PACKAGES warning next to the empty list. Before, the list was empty with no explanation, which reads as “nothing in this domain” when the value is usually misspelled./v1/ecosystem takes top_domains and categories_per_domain, and the /v1/reference/* lists take contains and limit. Without them the responses are exactly as before.period parameters of /v1/companies, /v1/organizations, /v1/organizations/{github_org}/packages and /v1/analytics/version-adoption list their accepted values (the schema already enumerated them); breakdown=arch says which downloads fall in neither column; compare_packages is documented as taking up to 10 names, one included.September 29, 2026
September 25, 2026
error.code, error.message and, where there is more to say, error.details. The legacy top-level detail field was removed./v1/reference/* lists take an optional ecosystem; without it they cover both ecosystems, as before.September 24, 2026
Several parameters were accepted and silently ignored or truncated. They now either work as documented or return a 422 that says why. Where the dashboard or a saved agent artifact can send a value, it is served and explained in warnings instead.
/v1/ecosystem accepts only period=30d. The map has always covered the latest complete month; 90d and 365d were accepted and ignored. For longer windows use /v1/analytics/time-series with domain aggregates.ecosystem_map tool no longer takes period; top_domains, categories_per_domain and top_packages size the answer.period on companies, organizations and version adoption is limited to its listed values; anything else returns 422 instead of being served as 30 days./v1/analytics/growth takes mom, qoq or yoy (30d, 90d and 365d are accepted as aliases), and returns 422 for anything else or for more than 25 packages, instead of cutting the list. Geography over 10 packages and version adoption over 10 versions return 422 instead of being cut.country_grouping or metric on the time series returns 422. Aggregates past the limit, or that match nothing, are named in warnings.YYYY-MM-DD on every dated endpoint; a malformed date used to fail with a 500.compare_packages refuses more than 10 names instead of dropping the rest, and tool failures are reported as errors rather than as successful results./v1/status is public and returns status, version, a timestamp and data freshness only. On API-key requests the x-ratelimit-* headers carry your real limit. Adding a package already on your watchlist returns 409.