Every Python Package Has a JSON API
PyPI (Python Package Index) exposes a free JSON API for every package. No authentication, no rate limits, no signup.
Get Package Info
import requests
def get_package(name):
r = requests.get(f"https://pypi.org/pypi/{name}/json")
if r.status_code == 200:
info = r.json()["info"]
return {
"name": info["name"],
"version": info["version"],
"summary": info["summary"],
"author": info["author"],
"license": info["license"],
"downloads": info.get("downloads", {}).get("last_month", "N/A"),
"requires_python": info["requires_python"],
"home_page": info["home_page"]
}
return None
pkg = get_package("requests")
print(f"{pkg[name]} v{pkg[version]} by {pkg[author]}")
print(f"License: {pkg[license]}")
print(f"Python: {pkg[requires_python]}")
Get All Versions
def get_versions(name):
r = requests.get(f"https://pypi.org/pypi/{name}/json")
releases = r.json()["releases"]
versions = sorted(releases.keys(), reverse=True)
return versions[:10]
print(get_versions("django"))
# [5.1.3, 5.1.2, 5.1.1, ...]
Check Dependencies
def get_dependencies(name):
r = requests.get(f"https://pypi.org/pypi/{name}/json")
info = r.json()["info"]
deps = info.get("requires_dist", []) or []
return [d.split(";")[0].strip() for d in deps]
deps = get_dependencies("fastapi")
for d in deps[:10]:
print(f" - {d}")
Compare Packages
def compare_packages(names):
for name in names:
pkg = get_package(name)
if pkg:
print(f"{pkg[name]:20} v{pkg[version]:10} | {pkg[summary][:50]}")
compare_packages(["flask", "fastapi", "django", "bottle", "tornado"])
Real Use Cases
- Dependency auditing — check license compatibility across your requirements.txt
- Version monitoring — alert when a package you use gets a new release
- Security scanning — compare installed versions against latest
- Package analytics — track Python ecosystem trends
- CI/CD pipelines — auto-check for outdated dependencies
Download Stats (via pypistats.org)
def get_downloads(name):
r = requests.get(f"https://pypistats.org/api/packages/{name}/recent")
data = r.json()["data"]
return {
"last_day": data["last_day"],
"last_week": data["last_week"],
"last_month": data["last_month"]
}
stats = get_downloads("requests")
print(f"Downloads last month: {stats[last_month]:,}")
Search Packages
def search_pypi(query):
# PyPI search via Simple API + XMLRPC is deprecated
# Use libraries.io API instead (free, 60 req/min)
r = requests.get(f"https://libraries.io/api/search?q={query}&platforms=Pypi&per_page=5")
return [{"name": p["name"], "stars": p.get("stars", 0)} for p in r.json()]
More from me: 10 Dev Tools I Use Daily | 77 Scrapers on a Schedule | 150+ Free APIs
Top comments (0)