PyPI API

This is the API documentation for PyPI Packages.

caution
This API is used by the PyPI package manager client and is generally not meant for manual consumption.

For instructions on how to upload and install PyPI packages from the GitLab package registry, see the PyPI package registry documentation.

note
These endpoints do not adhere to the standard API authentication methods. See the PyPI package registry documentation for details on which headers and token types are supported. Undocumented authentication methods might be removed in the future.
note
Twine 3.4.2 or greater is recommended when FIPS mode is enabled.

Download a package file from a group

Introduced in GitLab 13.12.

Download a PyPI package file. The simple API usually supplies this URL.

GET groups/:id/-/packages/pypi/files/:sha256/:file_identifier
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the group.
sha256stringyesThe PyPI package file’s sha256 checksum.
file_identifierstringyesThe PyPI package file’s name.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1.tar.gz"

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1.tar.gz" >> my.pypi.package-0.0.1.tar.gz

This writes the downloaded file to my.pypi.package-0.0.1.tar.gz in the current directory.

Group-level simple API index

Introduced in GitLab 15.1.

Returns a list of packages in the group as an HTML file:

GET groups/:id/-/packages/pypi/simple
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the group.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple"

Example response:

<!DOCTYPE html>
<html>
  <head>
    <title>Links for Group</title>
  </head>
  <body>
    <h1>Links for Group</h1>
    <a href="https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple/my-pypi-package" data-requires-python="">my.pypi.package</a><br><a href="https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple/package-2" data-requires-python="3.8">package_2</a><br>
  </body>
</html>

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple" >> simple_index.html

This writes the downloaded file to simple_index.html in the current directory.

Group level simple API entry point

Introduced in GitLab 13.12.

Returns the package descriptor as an HTML file:

GET groups/:id/-/packages/pypi/simple/:package_name
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the group.
package_namestringyesThe name of the package.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple/my.pypi.package"

Example response:

<!DOCTYPE html>
<html>
  <head>
    <title>Links for my.pypi.package</title>
  </head>
  <body>
    <h1>Links for my.pypi.package</h1>
    <a href="https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1-py3-none-any.whl#sha256=5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff" data-requires-python="&gt;=3.6">my.pypi.package-0.0.1-py3-none-any.whl</a><br><a href="https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/files/9s9w01b0bcd52b709ec052084e33a5517ffca96f7728ddd9f8866a30cdf76f2/my.pypi.package-0.0.1.tar.gz#sha256=9s9w011b0bcd52b709ec052084e33a5517ffca96f7728ddd9f8866a30cdf76f2" data-requires-python="&gt;=3.6">my.pypi.package-0.0.1.tar.gz</a><br>
  </body>
</html>

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/groups/1/-/packages/pypi/simple/my.pypi.package" >> simple.html

This writes the downloaded file to simple.html in the current directory.

Download a package file from a project

Introduced in GitLab 12.10.

Download a PyPI package file. The simple API usually supplies this URL.

GET projects/:id/packages/pypi/files/:sha256/:file_identifier
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the project.
sha256stringyesPyPI package file sha256 check sum.
file_identifierstringyesThe PyPI package filename.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1.tar.gz"

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1.tar.gz" >> my.pypi.package-0.0.1.tar.gz

This writes the downloaded file to my.pypi.package-0.0.1.tar.gz in the current directory.

Project-level simple API index

Introduced in GitLab 15.1.

Returns a list of packages in the project as an HTML file:

GET projects/:id/packages/pypi/simple
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the project.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple"

Example response:

<!DOCTYPE html>
<html>
  <head>
    <title>Links for Project</title>
  </head>
  <body>
    <h1>Links for Project</h1>
    <a href="https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple/my-pypi-package" data-requires-python="">my.pypi.package</a><br><a href="https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple/package-2" data-requires-python="3.8">package_2</a><br>
  </body>
</html>

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple" >> simple_index.html

This writes the downloaded file to simple_index.html in the current directory.

Project-level simple API entry point

Introduced in GitLab 12.10.

Returns the package descriptor as an HTML file:

GET projects/:id/packages/pypi/simple/:package_name
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the project.
package_namestringyesThe name of the package.
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple/my.pypi.package"

Example response:

<!DOCTYPE html>
<html>
  <head>
    <title>Links for my.pypi.package</title>
  </head>
  <body>
    <h1>Links for my.pypi.package</h1>
    <a href="https://gitlab.example.com/api/v4/projects/1/packages/pypi/files/5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff/my.pypi.package-0.0.1-py3-none-any.whl#sha256=5y57017232013c8ac80647f4ca153k3726f6cba62d055cd747844ed95b3c65ff" data-requires-python="&gt;=3.6">my.pypi.package-0.0.1-py3-none-any.whl</a><br><a href="https://gitlab.example.com/api/v4/projects/1/packages/pypi/files/9s9w01b0bcd52b709ec052084e33a5517ffca96f7728ddd9f8866a30cdf76f2/my.pypi.package-0.0.1.tar.gz#sha256=9s9w011b0bcd52b709ec052084e33a5517ffca96f7728ddd9f8866a30cdf76f2" data-requires-python="&gt;=3.6">my.pypi.package-0.0.1.tar.gz</a><br>
  </body>
</html>

To write the output to a file:

curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/pypi/simple/my.pypi.package" >> simple.html

This writes the downloaded file to simple.html in the current directory.

Upload a package

Upload a PyPI package:

PUT projects/:id/packages/pypi
AttributeTypeRequiredDescription
idstringyesThe ID or full path of the project.
requires_pythonstringnoThe PyPI required version.
curl --request POST \
     --form 'content=@path/to/my.pypi.package-0.0.1.tar.gz' \
     --form 'name=my.pypi.package'
     --form 'version=1.3.7'
     --user <username>:<personal_access_token> \
     "https://gitlab.example.com/api/v4/projects/1/packages/pypi"