Index API
This page documents PyPI's implementation of the PEP 503 (HTML) and PEP 691 (JSON) index API.
See the Simple Repository API for the official living specification of this API.
Note
The index API is sometimes called the "legacy API," since it provides feature parity with PyPI's legacy codebase.
Note
This API is available as both HTML and JSON.
It is recommended that new integrations use the JSON version.
Routes
List all projects
Route: GET /simple/
Returns all of the projects that have been registered.
Response headers:
X-PyPI-Last-Serial- The most recent serial ID number for any project.
Status codes:
200 OK- no error
HTML
Example HTML request (default if no Accept header is passed):
GET /simple/ HTTP/1.1
Host: pypi.org
Accept: application/vnd.pypi.simple.v1+html
Example HTML response
HTTP/1.0 200 OK
Content-Type: application/vnd.pypi.simple.v1+html
X-PyPI-Last-Serial: 24888689
<html>
<head>
<meta name="pypi:repository-version" content="1.4">
<title>Simple index</title>
</head>
<body>
<a href="/simple/0/">0</a>
<a href="/simple/0-0/">0-._.-._.-._.-._.-._.-._.-0</a>
<!-- More projects... -->
</body>
</html>
JSON
Example JSON request:
GET /simple/ HTTP/1.1
Host: pypi.org
Accept: application/vnd.pypi.simple.v1+json
Example JSON response
HTTP/1.1 200 OK
Content-Type: application/vnd.pypi.simple.v1+json
X-PyPI-Last-Serial: 24888689
{
"meta": {
"_last-serial": 24888689,
"api-version": "1.4"
},
"projects": [
{
"_last-serial": 3075854,
"name": "0"
},
{
"_last-serial": 1448421,
"name": "0-._.-._.-._.-._.-._.-._.-0"
},
"More projects..."
]
}
Get distributions for project
Route: GET /simple/<project>/
Get all of the distribution download URLs for the project's
available releases (wheels and source distributions). The project
is matched case-insensitively with the _, - and .
characters considered equal. The links may optionally include a
hash using the URL fragment. This fragment is in the form of
#<hashname>=<hexdigest>. If present the downloaded file MUST
be verified against that hash value. Valid hash values are
md5, sha1, sha224, sha256, sha384, and
sha512.
If a PGP/GPG signature for a distribution file exists in PyPI, it
is available at the same URL as the file with .asc appended,
but a link to that signature is not provided in this list of
URLs. Therefore, once you have a wheel or sdist filename such as
https://file.pythonhosted.org/.../foo-1.0.tar.gz, you can
check for the existence of
https://file.pythonhosted.org/.../foo-1.0.tar.gz.asc with a
separate GET request.
Response headers:
X-PyPI-Last-Serial- The most recent serial ID number for the project.
Status codes:
200 OK- no error
HTML
Example HTML request (default if no Accept header is passed):
GET /simple/beautifulsoup4/ HTTP/1.1
Host: pypi.org
Accept: application/vnd.pypi.simple.v1+html
Example HTML response
HTTP/2 200 OK
Content-Type: application/vnd.pypi.simple.v1+html
Etag: "q4SqZutq1tfRDqhh3zQ4gQ"
X-PyPI-Last-Serial: 2857110
<!DOCTYPE html>
<html>
<head>
<meta name="pypi:repository-version" content="1.4">
<meta name="pypi:project-status" content="active">
<title>Links for beautifulsoup4</title>
</head>
<body>
<h1>Links for beautifulsoup4</h1>
<a href="https://files.pythonhosted.org/packages/6f/be/99dcf74d947cc1e7abef5d0c4572abcb479c33ef791d94453a8fd7987d8f/beautifulsoup4-4.0.1.tar.gz#sha256=dc6bc8e8851a1c590c8cc8f25915180fdcce116e268d1f37fa991d2686ea38de" >beautifulsoup4-4.0.1.tar.gz</a><br />
<a href="https://files.pythonhosted.org/packages/a0/75/db36172ea767dd2f0c9817a99e24f7e9b79c2ce63eb2f8b867284cc60daf/beautifulsoup4-4.0.2.tar.gz#sha256=353792f8246a9551b232949fb14dce21d9b6ced9207bf9f4a69a4c4eb46c8127" >beautifulsoup4-4.0.2.tar.gz</a><br />
<!-- ...More files... -->
<a href="https://files.pythonhosted.org/packages/14/7e/e4313dad823c3a0751c99b9bc0182b1dd19aea164ce7445e9a70429b9e92/beautifulsoup4-4.13.0b2-py3-none-any.whl#sha256=7e05ad0b6c26108d9990e2235e8a9b4e2c03ead6f391ceb60347f8ebea6b80ba" data-requires-python=">=3.6.0" data-dist-info-metadata="sha256=d0aa787c2b55e5b0b3aff66f137cf33341c5e781cb87b4dc184cbb25c7ac0ab5" data-core-metadata="sha256=d0aa787c2b55e5b0b3aff66f137cf33341c5e781cb87b4dc184cbb25c7ac0ab5">beautifulsoup4-4.13.0b2-py3-none-any.whl</a><br />
<a href="https://files.pythonhosted.org/packages/81/bd/c97d94e2b96f03d1c50bc9de04130e014eda89322ba604923e0c251eb02e/beautifulsoup4-4.13.0b2.tar.gz#sha256=c684ddec071aa120819889aa9e8940f85c3f3cdaa08e23b9fa26510387897bd5" data-requires-python=">=3.6.0" >beautifulsoup4-4.13.0b2.tar.gz</a><br />
</body>
</html>
<!--SERIAL 22406780-->
JSON
Example JSON request:
GET /simple/beautifulsoup4/ HTTP/1.1
Host: pypi.org
Accept: application/vnd.pypi.simple.v1+json
Example JSON response
HTTP/2 200 OK
Content-Type: application/vnd.pypi.simple.v1+json
Etag: "hVGQAYl/eoNrx2H5FmPuXw"
X-PyPI-Last-Serial: 22406780
{
"files": [
{
"core-metadata": false,
"data-dist-info-metadata": false,
"filename": "beautifulsoup4-4.0.1.tar.gz",
"hashes": {
"sha256": "dc6bc8e8851a1c590c8cc8f25915180fdcce116e268d1f37fa991d2686ea38de"
},
"requires-python": null,
"size": 51024,
"upload-time": "2014-01-21T05:35:05.558877Z",
"url": "https://files.pythonhosted.org/packages/6f/be/99dcf74d947cc1e7abef5d0c4572abcb479c33ef791d94453a8fd7987d8f/beautifulsoup4-4.0.1.tar.gz",
"yanked": false
},
{
"core-metadata": false,
"data-dist-info-metadata": false,
"filename": "beautifulsoup4-4.0.2.tar.gz",
"hashes": {
"sha256": "353792f8246a9551b232949fb14dce21d9b6ced9207bf9f4a69a4c4eb46c8127"
},
"requires-python": null,
"size": 51240,
"upload-time": "2014-01-21T05:35:09.581933Z",
"url": "https://files.pythonhosted.org/packages/a0/75/db36172ea767dd2f0c9817a99e24f7e9b79c2ce63eb2f8b867284cc60daf/beautifulsoup4-4.0.2.tar.gz",
"yanked": false
},
"...More files...",
{
"core-metadata": {
"sha256": "524392d64a088e56a4232f50d6edb208dc03105394652acb72c6d5fa64c89f3e"
},
"data-dist-info-metadata": {
"sha256": "524392d64a088e56a4232f50d6edb208dc03105394652acb72c6d5fa64c89f3e"
},
"filename": "beautifulsoup4-4.12.3-py3-none-any.whl",
"hashes": {
"sha256": "b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
},
"requires-python": ">=3.6.0",
"size": 147925,
"upload-time": "2024-01-17T16:53:12.779164Z",
"url": "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl",
"yanked": false
},
{
"core-metadata": false,
"data-dist-info-metadata": false,
"filename": "beautifulsoup4-4.12.3.tar.gz",
"hashes": {
"sha256": "74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"
},
"requires-python": ">=3.6.0",
"size": 581181,
"upload-time": "2024-01-17T16:53:17.902970Z",
"url": "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz",
"yanked": false
},
{
"core-metadata": {
"sha256": "d0aa787c2b55e5b0b3aff66f137cf33341c5e781cb87b4dc184cbb25c7ac0ab5"
},
"data-dist-info-metadata": {
"sha256": "d0aa787c2b55e5b0b3aff66f137cf33341c5e781cb87b4dc184cbb25c7ac0ab5"
},
"filename": "beautifulsoup4-4.13.0b2-py3-none-any.whl",
"hashes": {
"sha256": "7e05ad0b6c26108d9990e2235e8a9b4e2c03ead6f391ceb60347f8ebea6b80ba"
},
"requires-python": ">=3.6.0",
"size": 179607,
"upload-time": "2024-03-20T13:00:33.355932Z",
"url": "https://files.pythonhosted.org/packages/14/7e/e4313dad823c3a0751c99b9bc0182b1dd19aea164ce7445e9a70429b9e92/beautifulsoup4-4.13.0b2-py3-none-any.whl",
"yanked": false
},
{
"core-metadata": false,
"data-dist-info-metadata": false,
"filename": "beautifulsoup4-4.13.0b2.tar.gz",
"hashes": {
"sha256": "c684ddec071aa120819889aa9e8940f85c3f3cdaa08e23b9fa26510387897bd5"
},
"requires-python": ">=3.6.0",
"size": 550258,
"upload-time": "2024-03-20T13:00:31.245327Z",
"url": "https://files.pythonhosted.org/packages/81/bd/c97d94e2b96f03d1c50bc9de04130e014eda89322ba604923e0c251eb02e/beautifulsoup4-4.13.0b2.tar.gz",
"yanked": false
}
],
"meta": {
"_last-serial": 22406780,
"api-version": "1.4"
},
"name": "beautifulsoup4",
"project-status": {
"status": "active"
}
"versions": [
"4.0.1",
"4.0.2",
"...More versions...",
"4.12.3",
"4.13.0b2"
]
}