Access PyPI download stats programmatically. Generate an API key from your dashboard.
Pass your API key as a query parameter: ?apikey=YOUR_KEY
Requests without an API key are allowed but subject to stricter rate limits.
Upgrade your plan for higher rate limits and access to export endpoints.
/api/packages/{name}Get download trends, version breakdown, and metadata for a package.
| Name | In | Required | Description |
|---|---|---|---|
| name | path | Yes | Package name (e.g. requests) |
| days | query | No | Number of days of history (default: 30) |
| apikey | query | No | Your API key for higher rate limits |
GET /api/packages/requests?days=30
{
"trend": [{ "date": "2026-02-01", "total_downloads": "1234567" }],
"versions": [{ "version": "2.31.0", "total_downloads": "500000" }],
"pythonVersions": [{ "dimension_value": "3.11", "total_downloads": "800000" }],
"systems": [{ "dimension_value": "Linux", "total_downloads": "900000" }],
"installers": [{ "dimension_value": "pip", "total_downloads": "1000000" }],
"metadata": { "name": "requests", "summary": "Python HTTP for Humans.", ... }
}/api/searchSearch for packages by name.
| Name | In | Required | Description |
|---|---|---|---|
| q | query | Yes | Search query (min 2 characters) |
| apikey | query | No | Your API key for higher rate limits |
GET /api/search?q=requests
{
"results": [
{ "name": "requests", "summary": "Python HTTP for Humans.", "total_downloads": "119931198" }
]
}/api/compareCompare download trends for multiple packages.
| Name | In | Required | Description |
|---|---|---|---|
| packages | query | Yes | Comma-separated package names |
| days | query | No | Number of days (default: 30) |
| apikey | query | No | Your API key for higher rate limits |
GET /api/compare?packages=flask,django&days=30
{
"chartData": [{ "date": "2026-02-01", "flask": 50000, "django": 80000 }],
"totals": { "flask": 1500000, "django": 2400000 }
}/api/exportExport download data as CSV or JSON. Requires PRO tier or above.
| Name | In | Required | Description |
|---|---|---|---|
| package | query | Yes | Single package name |
| packages | query | No | Comma-separated names (for multi-package export) |
| format | query | No | "csv" (default) or "json" |
| days | query | No | Number of days (default: 30) |
GET /api/export?package=requests&format=csv&days=30
date,downloads 2026-02-01,1234567 2026-02-02,1345678
/api/health-scoreGet a health score for a package based on download trends.
| Name | In | Required | Description |
|---|---|---|---|
| package | query | Yes | Package name |
GET /api/health-score?package=requests
{ "package": "requests", "score": 92, "trend": "stable" }/api/badges/{name}Get an SVG badge showing recent download count for a package.
| Name | In | Required | Description |
|---|---|---|---|
| name | path | Yes | Package name |
GET /api/badges/requests
SVG image
| Code | Meaning |
|---|---|
| 400 | Bad request (missing or invalid parameters) |
| 401 | Invalid or revoked API key |
| 403 | Feature requires a higher tier (upgrade needed) |
| 429 | Rate limit exceeded |
| 500 | Internal server error |