DEV Community

Alex Spinov
Alex Spinov

Posted on

PyPI Has a Free API — Get Metadata for Any Python Package (No Key Needed)

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]}")
Enter fullscreen mode Exit fullscreen mode

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, ...]
Enter fullscreen mode Exit fullscreen mode

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}")
Enter fullscreen mode Exit fullscreen mode

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"])
Enter fullscreen mode Exit fullscreen mode

Real Use Cases

  1. Dependency auditing — check license compatibility across your requirements.txt
  2. Version monitoring — alert when a package you use gets a new release
  3. Security scanning — compare installed versions against latest
  4. Package analytics — track Python ecosystem trends
  5. 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]:,}")
Enter fullscreen mode Exit fullscreen mode

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()]
Enter fullscreen mode Exit fullscreen mode

More API tutorials | GitHub


More from me: 10 Dev Tools I Use Daily | 77 Scrapers on a Schedule | 150+ Free APIs

Top comments (0)