# PyPI Scraper (`anyxsolutions/pypi-scraper`) Actor

Scrape Python package data from PyPI: versions, summaries, full descriptions, authors, licenses, dependencies, classifiers, release dates, files, known vulnerabilities and download counts. Add package names or PyPI URLs, get clean JSON. No login, no API key, no proxy.

- **URL**: https://apify.com/anyxsolutions/pypi-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![banner](https://anyx.solutions/banners/pypi-scraper.png)

## PyPI Scraper

**Any Python package on PyPI — versions, metadata, dependencies, release dates, files, known vulnerabilities and download counts — as clean JSON.**

PyPI, the Python Package Index, hosts every public Python library. This Actor reads any package on
it and returns what you need to evaluate, monitor or catalogue it: the summary and full
description (as published, plus rendered HTML and plain text), authors and maintainers, license,
classifiers, keywords, homepage and project links, the Python versions it supports, its
dependencies, first and latest release dates, the files of the release, known vulnerabilities, and
how often it was downloaded in the last day, week and month. Add package names or PyPI package
URLs, or follow PyPI's feeds of newest and recently updated packages. Scrape PyPI with no login,
no API key, and no proxy to configure. Built for developer-tool companies, open-source analysts,
security and compliance teams, and anyone tracking the Python ecosystem.

### ⚡ Quick start

```json
{
  "packageNames": ["requests", "fastapi", "pandas"]
}
```

Or follow PyPI's recent-updates feed:

```json
{
  "startUrls": [{ "url": "https://pypi.org/rss/updates.xml" }],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                              |
| -------------------- | ------- | -------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `packageNames`       | array   | no       | —                            | Package names, one per line, such as `requests` or `fastapi`. Add `==<version>` for one release instead of the latest, such as `requests==2.31.0`.                                                       |
| `startUrls`          | array   | no       | —                            | PyPI URLs: package pages (`https://pypi.org/project/requests/`), release pages (`…/project/requests/2.31.0/`), and the feeds `https://pypi.org/rss/updates.xml` and `https://pypi.org/rss/packages.xml`. |
| `maxItems`           | integer | no       | —                            | Maximum number of packages per feed URL. The input form starts at 5; leave it empty to get the whole feed. Package names and package URLs always return one package each.                                |
| `includeDownloads`   | boolean | no       | `true`                       | Add download counts for the last day, week and month. Adds one fast request per package.                                                                                                                 |
| `includeReleases`    | boolean | no       | `false`                      | Add the full release history: every version with its release date, file count and yanked status, newest first.                                                                                           |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. PyPI's public package data needs no proxy.                                                                                                                                               |

Add package names, PyPI URLs, or both. The two feeds list PyPI's newest packages (the 40 most
recently created) and its recent updates (the last 100 releases); each package in a feed is
returned once, at its latest release. PyPI's search pages are shown only to web browsers, so this
Actor does not take search URLs: list the packages you want by name instead.

### 📤 Output

Each package is one dataset row: its latest release, or the version you asked for.

#### Fields

| Field                    | Type    | Description                                                                                                                                       |
| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`                   | string  | Package name as its author spells it.                                                                                                             |
| `version`                | string  | The release this row describes: the latest, or the one you asked for.                                                                             |
| `summary`                | string  | One-line summary.                                                                                                                                 |
| `url`                    | string  | The release's page on PyPI.                                                                                                                       |
| `pypiUrl`                | string  | The package's page on PyPI.                                                                                                                       |
| `homepage`               | string  | The project's homepage, when it declares one.                                                                                                     |
| `projectUrls`            | object  | Project links by label, such as `Source`, `Documentation` or `Changelog`.                                                                         |
| `author`                 | string  | Author name(s).                                                                                                                                   |
| `authorEmail`            | string  | Author email address(es), comma-separated.                                                                                                        |
| `maintainer`             | string  | Maintainer name(s).                                                                                                                               |
| `maintainerEmail`        | string  | Maintainer email address(es), comma-separated.                                                                                                    |
| `organization`           | string  | The PyPI organization that owns the package, when there is one.                                                                                   |
| `owners`                 | array   | PyPI usernames of the package's owners and maintainers.                                                                                           |
| `license`                | string  | License: the SPDX expression when declared, otherwise the license name or classifier.                                                             |
| `classifiers`            | array   | Trove classifiers, such as `Programming Language :: Python :: 3.12`.                                                                              |
| `keywords`               | array   | Keywords.                                                                                                                                         |
| `requiresPython`         | string  | Supported Python versions, such as `>=3.10`.                                                                                                      |
| `dependencies`           | array   | Dependencies as declared, with version ranges and markers (e.g. `PySocks>=1.5.6; extra == "socks"`).                                              |
| `extras`                 | array   | Optional feature sets (`pip install package[extra]`).                                                                                             |
| `yanked`                 | boolean | Whether this release was withdrawn by its author.                                                                                                 |
| `yankedReason`           | string  | Why it was withdrawn, when given.                                                                                                                 |
| `versionReleasedAt`      | string  | When this release was uploaded (ISO 8601).                                                                                                        |
| `firstReleasedAt`        | string  | When the package's first release was uploaded.                                                                                                    |
| `lastReleasedAt`         | string  | When the package's most recent release was uploaded.                                                                                              |
| `releasesCount`          | number  | Number of releases with files on PyPI.                                                                                                            |
| `latestFiles`            | array   | This release's files: `filename`, `type` (`bdist_wheel` or `sdist`), `pythonVersion`, `size` in bytes, `uploadedAt`, `sha256` and download `url`. |
| `vulnerabilities`        | array   | Known vulnerabilities in this release: `id`, `aliases` (CVE and others), `summary`, `fixedIn` versions and `link`. Empty when none are known.     |
| `downloads`              | object  | Downloads in the `lastDay`, `lastWeek` and `lastMonth`. `null` when `includeDownloads` is off or no counts exist yet (brand-new packages).        |
| `releases`               | array   | Every release, newest first: `version`, `releasedAt`, `filesCount` and `yanked`. `null` unless `includeReleases` is on.                           |
| `descriptionContentType` | string  | Format of the description: `text/markdown`, `text/x-rst` or `text/plain`.                                                                         |
| `description`            | string  | Full description (the project's README) exactly as published.                                                                                     |
| `descriptionHtml`        | string  | The description rendered as HTML, for Markdown and HTML descriptions.                                                                             |
| `descriptionText`        | string  | The description as plain text.                                                                                                                    |

<details><summary>Example output</summary>

```json
{
  "name": "requests",
  "version": "2.34.2",
  "summary": "Python HTTP for Humans.",
  "url": "https://pypi.org/project/requests/2.34.2/",
  "pypiUrl": "https://pypi.org/project/requests/",
  "homepage": null,
  "projectUrls": {
    "Documentation": "https://requests.readthedocs.io",
    "Source": "https://github.com/psf/requests"
  },
  "author": "Kenneth Reitz",
  "authorEmail": "me@kennethreitz.org",
  "maintainer": "Ian Stapleton Cordasco, Nate Prewitt",
  "maintainerEmail": "graffatcolmingov@gmail.com, nate.prewitt@gmail.com",
  "organization": null,
  "owners": ["Lukasa", "graffatcolmingov", "nateprewitt"],
  "license": "Apache-2.0",
  "classifiers": [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Web Environment",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: Apache Software License"
  ],
  "keywords": [],
  "requiresPython": ">=3.10",
  "dependencies": [
    "charset_normalizer<4,>=2",
    "idna<4,>=2.5",
    "urllib3<3,>=1.26",
    "certifi>=2023.5.7",
    "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"",
    "chardet<8,>=3.0.2; extra == \"use-chardet-on-py3\""
  ],
  "extras": ["security", "socks", "use-chardet-on-py3"],
  "yanked": false,
  "yankedReason": null,
  "versionReleasedAt": "2026-05-14T19:25:26.443000Z",
  "firstReleasedAt": "2011-02-14T08:49:42.641660Z",
  "lastReleasedAt": "2026-05-14T19:25:26.443000Z",
  "releasesCount": 160,
  "latestFiles": [
    {
      "filename": "requests-2.34.2-py3-none-any.whl",
      "type": "bdist_wheel",
      "pythonVersion": "py3",
      "size": 73075,
      "uploadedAt": "2026-05-14T19:25:26.443000Z",
      "sha256": "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0",
      "url": "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl"
    },
    {
      "filename": "requests-2.34.2.tar.gz",
      "type": "sdist",
      "pythonVersion": "source",
      "size": 142856,
      "uploadedAt": "2026-05-14T19:25:27.735762Z",
      "sha256": "f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed",
      "url": "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz"
    }
  ],
  "vulnerabilities": [],
  "downloads": {
    "lastDay": 32364605,
    "lastWeek": 310635492,
    "lastMonth": 1202777296
  },
  "releases": null,
  "descriptionContentType": "text/markdown",
  "description": "# Requests\n\n[![Version](https://img.shields.io/pypi/v/requests.svg …",
  "descriptionHtml": "<h1>Requests</h1>\n<p><a href=\"https://pypi.org/project/requests/\"> …",
  "descriptionText": "Requests\n\nRequests is a simple, yet elegant, HTTP library. …"
}
```

</details>

### 💡 Use cases

- **Dependency and supply-chain review** — check licenses, supported Python versions, maintainers, release recency and known vulnerabilities for every package you depend on.
- **Developer-tool market research** — compare packages in a category by downloads, release cadence and dependencies.
- **Ecosystem monitoring** — schedule the Actor on the recent-updates or newest-packages feed to catch new releases and new projects as they appear.
- **Lead generation for developer tools** — find the authors, maintainers and organizations behind fast-growing packages.

### ❓ FAQ

- **Do I need a PyPI account or API key?** No. The Actor reads the same public package data pip and the PyPI website use.
- **Do I need a proxy?** No. It runs without one by default.
- **Can I search PyPI by keyword?** Not with this Actor. PyPI's search pages are shown only to web browsers. List the packages you want by name, or follow the newest-packages or recent-updates feed.
- **Why are the download counts empty for a package?** Download counts appear a day or so after a package is first published, so brand-new packages have none yet. They are also `null` when you turn `includeDownloads` off.
- **How do I get an older version?** Add it with `==`, such as `requests==2.31.0`, or paste its release URL, such as `https://pypi.org/project/requests/2.31.0/`. Its files and known vulnerabilities are those of that release.
- **Why is `descriptionHtml` empty?** Some packages publish their description as reStructuredText or plain text; `descriptionText` then carries it as written.
- **A package was not found.** The log says when a name does not exist on PyPI. Names are matched the way pip matches them, so `Typing_Extensions` and `typing-extensions` are the same package.

### 🔗 More scrapers by Anyx

- [GitHub Trending Scraper](https://apify.com/anyxsolutions/github-trending-scraper)
- [Hacker News Scraper](https://apify.com/anyxsolutions/hacker-news-scraper)
- [Google Search Scraper](https://apify.com/anyxsolutions/google-search-scraper)
- [Web Content Scraper](https://apify.com/anyxsolutions/web-content-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [pypi.org](https://pypi.org/)

# Actor input Schema

## `packageNames` (type: `array`):

PyPI package names, one per line, for example requests or fastapi. Add ==<version> to get one release instead of the latest, for example requests==2.31.0.

## `startUrls` (type: `array`):

pypi.org URLs: package pages such as https://pypi.org/project/requests/ (or a release, https://pypi.org/project/requests/2.31.0/), and the feeds https://pypi.org/rss/updates.xml (recently updated packages) and https://pypi.org/rss/packages.xml (newest packages).

## `maxItems` (type: `integer`):

Maximum number of packages to return per feed URL. Package names and package URLs always return one package each. Leave empty to get every package in the feed.

## `includeDownloads` (type: `boolean`):

Add each package's downloads over the last day, week and month. Adds one fast request per package; turn it off to scrape large lists faster.

## `includeReleases` (type: `boolean`):

Add every release of each package with its version, release date, file count and yanked status, newest first.

## `proxyConfiguration` (type: `object`):

Proxy settings. PyPI's public package data needs no proxy.

## Actor input object example

```json
{
  "packageNames": [
    "requests",
    "fastapi",
    "pandas"
  ],
  "startUrls": [
    {
      "url": "https://pypi.org/rss/updates.xml"
    }
  ],
  "maxItems": 5,
  "includeDownloads": true,
  "includeReleases": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "packageNames": [
        "requests",
        "fastapi",
        "pandas"
    ],
    "startUrls": [
        {
            "url": "https://pypi.org/rss/updates.xml"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/pypi-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "packageNames": [
        "requests",
        "fastapi",
        "pandas",
    ],
    "startUrls": [{ "url": "https://pypi.org/rss/updates.xml" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/pypi-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "packageNames": [
    "requests",
    "fastapi",
    "pandas"
  ],
  "startUrls": [
    {
      "url": "https://pypi.org/rss/updates.xml"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/pypi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyxsolutions/pypi-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cL9SNo4W0To9r83lP/builds/NCVswAbExu5gdVbGT/openapi.json
