Registry Download Tracking
Query download/install counts from package registries via their public APIs
Instructions
Registry Download Tracking
Query download and install counts from package registries to measure SDK adoption over time. Each registry exposes download stats through a public API.
Tools
| Registry | API Endpoint | Docs |
|----------|-------------|------|
| npm | GET https://api.npmjs.org/downloads/point/{period}/{package} | https://github.com/npm/registry/blob/main/docs/download-counts.md |
| PyPI | GET https://pypistats.org/api/packages/{package}/recent | https://pypistats.org/api/ |
| crates.io | GET https://crates.io/api/v1/crates/{crate} | https://crates.io/apidocs |
| NuGet | GET https://api.nuget.org/v3/registration5-gz-semver2/{id}/index.json | https://learn.microsoft.com/en-us/nuget/api/registration-base-url-resource |
| RubyGems | GET https://rubygems.org/api/v1/gems/{gem}.json | https://guides.rubygems.org/rubygems-org-api/ |
| Go (proxy) | GET https://proxy.golang.org/{module}/@v/list | https://proxy.golang.org/ |
Authentication
All download count APIs are public and require no authentication.
Instructions
npm
# Downloads in the last 7 days
curl -s "https://api.npmjs.org/downloads/point/last-week/@org/package-name" | python3 -m json.tool
# Downloads in the last 30 days
curl -s "https://api.npmjs.org/downloads/point/last-month/@org/package-name" | python3 -m json.tool
# Daily downloads over a date range
curl -s "https://api.npmjs.org/downloads/range/2026-03-01:2026-03-30/@org/package-name" | python3 -m json.tool
Response: {"downloads": 12345, "start": "2026-03-23", "end": "2026-03-30", "package": "@org/package-name"}
PyPI
# Recent downloads (last day, week, month)
curl -s "https://pypistats.org/api/packages/your-package/recent" | python3 -m json.tool
# Downloads by Python version
curl -s "https://pypistats.org/api/packages/your-package/python_minor?months=1" | python3 -m json.tool
Response: {"data": {"last_day": 500, "last_week": 3200, "last_month": 14000}, "package": "your-package", "type": "recent_downloads"}
crates.io
# Crate metadata including total downloads
curl -s "https://crates.io/api/v1/crates/your-crate" -H "User-Agent: your-app" | python3 -m json.tool
Response includes crate.downloads (total) and crate.recent_downloads (last 90 days).
RubyGems
# Gem info including download count
curl -s "https://rubygems.org/api/v1/gems/your-gem.json" | python3 -m json.tool
# Total downloads for all versions
curl -s "https://rubygems.org/api/v1/downloads/your-gem-1.0.0.json" | python3 -m json.tool
Response includes downloads (total for all versions) and version_downloads (current version).
NuGet
# Package metadata (total downloads in catalog metadata)
curl -s "https://api.nuget.org/v3/registration5-gz-semver2/yourorg.packagename/index.json" \
-H "Accept-Encoding: gzip" --compressed | python3 -m json.tool
n8n Integration
Build an n8n workflow to collect all registry stats on a schedule:
- HTTP Request nodes for each registry API
- Parse download counts from each response
- Send as PostHog events:
sdk_weekly_downloadswith properties{registry, package_name, downloads_7d, downloads_30d} - Store in Attio on the SDK campaign record
Error Handling
| Error | Cause | Fix |
|-------|-------|-----|
| 404 Not Found | Package name typo or not yet indexed | Verify exact package name; new packages may take hours to appear in stats |
| Rate limiting | Too many requests | npm: 1000/min, PyPI: be polite, crates.io: requires User-Agent header |