The Project Quay application programming interface (API) provides a comprehensive, RESTful interface for managing and automating tasks within Project Quay. Designed around the OAuth 2.0 protocol, this API enables secure, fine-grained access to Project Quay resources, and allows administrators and users to perform such actions as creating repositories, managing images, setting permissions, and more.

Project Quay follows Semantic Versioning (SemVer) principles, ensuring predictable API stability across releases, such as:

  • Major releases: Introduce new capabilities. Might include breaking changes to API compatibility. For example, the API of Project Quay 2.0 differs from Project Quay 3.0.

  • Minor releases: Add new functionality in a backward-compatible manner. For example, a 3.y release adds functionality to the version 3. release.

  • Patch releases: Deliver bug fixes and improvements while preserving backward compatibility with minor releases, such as 3.y.z.

The following guide describes the Project Quay API in more detail, and provides details on the following topics:

  • OAuth 2 access tokens and how they compare to traditional API tokens and Project Quay’s robot tokens

  • Generating an OAuth 2 access token

  • Best practices for token management

  • OAuth 2 access token capabilities

  • Using the Project Quay API

  • Project Quay API configuration examples

Introduction to Project Quay OAuth 2.0 tokens

The Project Quay OAuth 2 token system provides a secure, standards-based method for accessing Project Quay’s API and other relevant resources. The OAuth 2 token-based approach provides a secure method for handling authentication and authorization for complex environments. Compared to more traditional API tokens, Project Quay’s OAuth 2 token system offers the following enhancements:

  • Standards-based security, which adheres to the OAuth 2.0 protocol.

  • Revocable access by way of deleting the application in which the OAuth 2 token exists.

  • Fine-grained access control, which allows Project Quay administrators the ability to assign specific permissions to tokens.

  • Delegated access, which allows third-party applications and services to act on behalf of a user.

  • Future-proofing, which helps ensure that Project Quay remains compatible with other services, platforms, and integrations.

Project Quay primarily supports two types of tokens: OAuth 2 access tokens and robot account tokens. A third token type, an OCI referrers access token, that is required to list OCI referrers of a manifest under a repository, is also available when warranted.

The following chapters provide more details about each token type and how to generate each token type.

OAuth 2 access tokens

OAuth 2 access tokens (considered "API tokens" for Project Quay) enable user-authenticated access to the Project Quay API, suitable for applications that require user identity verification. These tokens are obtained through an OAuth 2 authorization process, where a Project Quay administrator generates a token on behalf of themselves or another user to access Project Quay API endpoints. OAuth 2 tokens authorize actions on API endpoints based on the scopes defined for the token.

Note

Although OAuth 2 tokens authorize actions on API endpoints based on the scopes defined for the token, access to the resources themselves is governed by Project Quay’s role-based access control (RBAC) mechanisms. Actions can be created on a resource, for example, a repository, provided that you have the proper role (Admin or Creator) to do so for that namespace. This is true even if the API token was granted the repo:admin scope.

OAuth 2 access tokens can only be created by using the Project Quay UI; there is no way to create an OAuth 2 access token by using the CLI. When creating an OAuth 2 token, the following options can be selected for a token holder:

  • Administer Organization. When selected, allows the user to be able to administer organizations, including creating robots, creating teams, adjusting team membership, and changing billing settings.

  • Administer Repositories. When selected, provides the user administrator access to all repositories to which the granting user has access.

  • Create Repositories. When selected, provides the user the ability to create repositories in any namespaces that the granting user is allowed to create repositories.

  • View all visible repositories. When selected, provides the user the ability to view and pull all repositories visible to the granting user.

  • Read/Write to any accessible repositories. When selected, provides the user the ability to view, push and pull to all repositories to which the granting user has write access.

  • Super User Access. When selected, provides the user the ability to administer your installation including managing users, managing organizations and other features found in the superuser panel.

  • Administer User When selected, provides the user the ability to administer your account including creating robots and granting them permissions to your repositories.

  • Read User Information. When selected, provides the user the ability to read user information such as username and email address.

Token distributors should be mindful of the permissions that they are granting when generating a token on behalf of a user, and should have absolute trust in a user before granting such permissions as Administer organization, Super User Access, and Administer User. Additionally, the access token is only revealed at the time of creation; they cannot be listed from the CLI, nor can they be found on the Project Quay UI. If an access token is lost or forgotten, a new token must be created; a token cannot be recovered.

OAuth 2 access tokens are passed as a Bearer token in the Authorization header of an API call and, as a result, are used to provide authentication and authorization to the defined API endpoint, such as an image tag, a repository, an organization, and so on.

The API is available from the /api/v1 endpoint of your Project Quay host. For example, https://<quay-server.example.com>/api/v1. It allows users to connect to endpoints through their browser to GET, POST, DELETE, and PUT Project Quay settings by enabling the Swagger UI. The API can be accessed by applications that make API calls and use OAuth tokens, and it sends and receives data as JSON.

With Project Quay, there is currently no way to rotate or to set an expiration time on an OAuth 2 access token, and the token lifespan is 10 years. Tokens can be deleted by deleting the applications in which they were created in the event that they are compromised, however, this deletes all tokens that were made within that specific application.

Note

In practice, Project Quay administrators could create a new OAuth application on the Applications page of their organization each time they wanted to create a new OAuth token for a user. This would ensure that a single application is not responsible for all OAuth tokens. As a result, in the event that a user’s token is compromised, the administrator would delete the application of the compromised token. This would help avoid disruption for other users whose tokens might be part of the same application.

The following sections shows you how to generate and reassign an OAuth 2 access token.

Creating an OAuth 2 access token

With Project Quay, you must create an OAuth 2 access token before you can access the API endpoints of your organization. OAuth 2 access token can only be generated by using the Project Quay UI; the CLI cannot be used to generate an OAuth 2 access token.

Use the following procedure to create an OAuth2 access token.

Prerequisites
  • You have logged in to Project Quay as an administrator.

  • You have created an OAuth 2 application.

Procedure
  1. On the main page, select an Organization.

  2. In the navigation pane, select Applications.

  3. Click the name of your application, for example, Test application.

  4. In the navigation pane, select Generate Token.

  5. Check the boxes for the following options:

    1. Administer Organization. When selected, allows the user to be able to administer organizations, including creating robots, creating teams, adjusting team membership, and changing billing settings.

    2. Administer Repositories. When selected, provides the user administrator access to all repositories to which the granting user has access.

    3. Create Repositories. When selected, provides the user the ability to create repositories in any namespaces that the granting user is allowed to create repositories.

    4. View all visible repositories. When selected, provides the user the ability to view and pull all repositories visible to the granting user.

    5. Read/Write to any accessible repositories. When selected, provides the user the ability to view, push and pull to all repositories to which the granting user has write access.

    6. Super User Access. When selected, provides the user the ability to administer your installation including managing users, managing organizations and other features found in the superuser panel.

    7. Administer User When selected, provides the user the ability to administer your account including creating robots and granting them permissions to your repositories.

    8. Read User Information. When selected, provides the user the ability to read user information such as username and email address.

  6. Click Generate Access Token. You are redirected to a new page.

  7. Review the permissions that you are allowing, then click Authorize Application. Confirm your decision by clicking Authorize Application.

  8. You are redirected to the Access Token page. Copy and save the access token.

    Important

    This is the only opportunity to copy and save the access token. It cannot be reobtained after leaving this page.

Reassigning an OAuth access token

Organization administrators can assign OAuth API tokens to be created by other user’s with specific permissions. This allows the audit logs to be reflected accurately when the token is used by a user that has no organization administrative permissions to create an OAuth API token.

Note

The following procedure only works on the current Project Quay UI. It is not currently implemented in the Project Quay v2 UI.

Prerequisites
  • You are logged in as a user with organization administrative privileges, which allows you to assign an OAuth API token.

    Note

    OAuth API tokens are used for authentication and not authorization. For example, the user that you are assigning the OAuth token to must have the Admin team role to use administrative API endpoints. For more information, see Managing access to repositories.

Procedure
  1. Optional. If not already, update your Project Quay config.yaml file to include the FEATURE_ASSIGN_OAUTH_TOKEN: true field:

    # ...
    FEATURE_ASSIGN_OAUTH_TOKEN: true
    # ...
  2. Optional. Restart your Project Quay registry.

  3. Log in to your Project Quay registry as an organization administrator.

  4. Click the name of the organization in which you created the OAuth token for.

  5. In the navigation pane, click Applications.

  6. Click the proper application name.

  7. In the navigation pane, click Generate Token.

  8. Click Assign another user and enter the name of the user that will take over the OAuth token.

  9. Check the boxes for the desired permissions that you want the new user to have. For example, if you only want the new user to be able to create repositories, click Create Repositories.

    Important

    Permission control is defined by the team role within an organization and must be configured regardless of the options selected here. For example, the user that you are assigning the OAuth token to must have the Admin team role to use administrative API endpoints.

    Solely checking the Super User Access box does not actually grant the user this permission. Superusers must be configured via the config.yaml file and the box must be checked here.

  10. Click Assign token. A popup box appears that confirms authorization with the following message and shows you the approved permissions:

    This will prompt user <username> to generate a token with the following permissions:
    repo:create
  11. Click Assign token in the popup box. You are redirected to a new page that displays the following message:

    Token assigned successfully
Verification
  1. After reassigning an OAuth token, the assigned user must accept the token to receive the bearer token, which is required to use API endpoints. Request that the assigned user logs into the Project Quay registry.

  2. After they have logged in, they must click their username under Users and Organizations.

  3. In the navigation pane, they must click External Logins And Applications.

  4. Under Authorized Applications, they must confirm the application by clicking Authorize Application. They are directed to a new page where they must reconfirm by clicking Authorize Application.

  5. They are redirected to a new page that reveals their bearer token. They must save this bearer token, as it cannot be viewed again.

Deleting an OAuth 2 access token

Because OAuth 2 access tokens are created through the OAuth application, they cannot be rotated or renewed. In the event that a token is compromised, or you need to delete a token, you must deleted its associated application through the Project Quay UI.

Important

Deleting an application deletes all tokens that were made within that specific application. Use with caution.

Prerequisites
  • You have created an OAuth 2 access token.

Procedure
  1. On the Project Quay UI, click the name of the organization hosting the application. Then, in the navigation pane, click Applications.

  2. Click the application name, for example, Test application.

  3. In the navigation pane, click Delete Application. You are redirected to a new page. Click Delete application and confirm your decision.

Robot account tokens

Robot account tokens are password-type credentials used to access a Project Quay registry via normal Docker v2 endpoints; these are defined as tokens on the UI because the password itself is encrypted.

Robot account tokens are persistent tokens designed for automation and continuous integration workflows. By default, Project Quay’s robot account tokens do not expire and do not require user interaction, which makes robot accounts ideal for non-interactive use cases.

Robot account tokens are automatically generated at the time of a robot’s creation and are non-user specific; that is, they are connected to the user and organization namespace where where they are created. for example, a robot named project_tools+<robot_name> is associated with the project_tools namespace.

Robot account tokens provide access without needing a user’s personal credentials. How the robot account is configured, for example, with one of READ, WRITE, or ADMIN permissions, ultimately defines the actions that the robot account can take.

Because robot account tokens are persistent and do not expire by default, they are ideal for automated workflows that require consistent access to Project Quay without manual renewal. Despite this, robot account tokens can be easily re-generated by using the the UI. They can also be regenerated by using the proper API endpoint via the CLI. To enhance the security of your Project Quay deployment, administrators should regularly refresh robot account tokens. Additionally, with the keyless authentication with robot accounts feature, robot account tokens can be exchanged for external OIDC tokens and leveraged so that they only last one hour, enhancing the security of your registry.

When a namespace gets deleted, or when the robot account is deleted itself, they are garbage collected when the collector is scheduled to run.

The following section shows you how to use the API to re-generate a robot account token for organization robots and user robots.

Regenerating a robot account token by using the Project Quay UI

Use the following procedure to regenerate a robot account token by using the Project Quay UI.

Prerequisites
  • You have logged into Project Quay.

Procedure
  1. Click the name of an Organization.

  2. In the navigation pane, click Robot accounts.

  3. Click the name of your robot account, for example, testorg3+test.

  4. Click Regenerate token in the popup box.

Regenerating a robot account token by using the Project Quay API

Use the following procedure to regenerate a robot account token using the Project Quay API.

Prerequisites
Procedure
  • Enter the following command to regenerate a robot account token for an organization using the POST /api/v1/organization/{orgname}/robots/{robot_shortname}/regenerate endpoint:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/organization/<orgname>/robots/<robot_shortname>/regenerate"
    Example output
    {"name": "test-org+test", "created": "Fri, 10 May 2024 17:46:02 -0000", "last_accessed": null, "description": "", "token": "<example_secret>"}
  • Enter the following command to regenerate a robot account token for the current user with the POST /api/v1/user/robots/{robot_shortname}/regenerate endpoint:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>/regenerate"

    Example output

    {"name": "quayadmin+test", "created": "Fri, 10 May 2024 14:12:11 -0000", "last_accessed": null, "description": "", "token": "<example_secret>"}

OCI referrers OAuth access token

In some cases, depending on the features that your Project Quay deployment is configured to use, you might need to leverage an OCI referrers OAuth access token. OCI referrers OAuth access tokens are used to list OCI referrers of a manifest under a repository, and uses a curl command to make a GET request to the Project Quay v2/auth endpoint.

These tokens are obtained via basic HTTP authentication, wherein the user provides a username and password encoded in Base64 to authenticate directly with the v2/auth API endpoint. As such, they are based directly on the user’s credentials aod do not follow the same detailed authorization flow as OAuth 2, but still allow a user to authorize API requests.

OCI referrers OAuth access tokens do not offer scope-based permissions and do not expire. They are solely used to list OCI referrers of a manifest under a repository.

Additional resource

Creating an OCI referrers OAuth access token

This OCI referrers OAuth access token is used to list OCI referrers of a manifest under a repository.

Procedure
  1. Update your config.yaml file to include the FEATURE_REFERRERS_API: true field. For example:

    # ...
    FEATURE_REFERRERS_API: true
    # ...
  2. Enter the following command to Base64 encode your credentials:

    $ echo -n '<username>:<password>' | base64
    Example output
    abcdeWFkbWluOjE5ODlraWROZXQxIQ==
  3. Enter the following command to use the base64 encoded string and modify the URL endpoint to your Project Quay server:

    $ curl --location '<quay-server.example.com>/v2/auth?service=<quay-server.example.com>&scope=repository:quay/listocireferrs:pull,push' --header 'Authorization: Basic <base64_username:password_encode_token>' -k | jq
    Example output
    {
      "token": "<example_secret>
    }

Enabling and using the Project Quay API

By leveraging the Project Quay API, you can streamline container registry management, automate tasks, and integrate Project Quay’s functionalities into your existing workflow. This can improve efficiency, offer enhanced flexibility (by way of repository management, user management, user permissions, image management, and so on), increase the stability of your organization, repository, or overall deployment, and more.

The following sections explain how to enable and use the Project Quay API.

Configuring Project Quay to accept API calls

Prior to using the Project Quay API, you must disable BROWSER_API_CALLS_XHR_ONLY in your config.yaml file. This allows you to avoid such errors as API calls must be invoked with an X-Requested-With header if called from a browser.

Procedure
  1. In your Project Quay config.yaml file, set BROWSER_API_CALLS_XHR_ONLY to false. For example:

    # ...
    BROWSER_API_CALLS_XHR_ONLY: false
    # ...
  2. Restart your Project Quay deployment.

Using the Project Quay API

After you have created an application and generated an OAuth 2 access token with the desired settings, you can pass in the access token to GET, PUT, POST, or DELETE settings by using the API from the CLI. Generally, a Project Quay API command looks similar to the following example:

$ curl -X GET -H "Authorization: Bearer <your_access_token>" (1)
    https://<quay-server.example.com>/api/v1/<example>/<endpoint>/ (2)
  1. The OAuth 2 access token that was generated through the Project Quay UI.

  2. The URL of your Project Quay deployment and the desired API endpoint.

All Project Quay APIs are documented in the Application Programming Interface (API) chapter. Understanding how they are documented is crucial to successful invocation. Take, for example, the following entry for the createAppToken API endpoint:

*createAppToken* (1)
Create a new app specific token for user. (2)

*POST /api/v1/user/apptoken* (3)

**Authorizations: **oauth2_implicit (**user:admin**) (4)

 Request body schema (application/json)

*Path parameters* (5)

Name: **title**
Description: Friendly name to help identify the token.
Schema: string

*Responses* (6)

|HTTP Code|Description             |Schema
|201      |Successful creation     |
|400      |Bad Request             |&lt;&lt;_apierror,ApiError&gt;&gt;
|401      |Session required        |&lt;&lt;_apierror,ApiError&gt;&gt;
|403      |Unauthorized access     |&lt;&lt;_apierror,ApiError&gt;&gt;
|404      |Not found               |&lt;&lt;_apierror,ApiError&gt;&gt;
|===
  1. The name of the API endpoint.

  2. A brief description of the API endpoint.

  3. The API endpoint used for invocation.

  4. The authorizations required to use the API endpoint.

  5. The available paths to be used with the API endpoint. In this example, title is the only path to be used with the POST /api/v1/user/apptoken endpoint.

  6. The API responses for this endpoint.

In order to use an API endpoint, you pass in your access token and then include the appropriate fields depending on your needs. The following procedure shows you how to use the POST /api/v1/user/apptoken endpoint.

Prerequisites
  • You have access to the Project Quay API, which entails having already created an OAuth 2 access token.

  • You have set BROWSER_API_CALLS_XHR_ONLY: false in your config.yaml file.

Procedure
  • Create a user application by entering the POST /api/v1/user/apptoken API call:

    $ curl -X POST \
      -H "Authorization: Bearer <access_token>" (1)
      -H "Content-Type: application/json" \
      -d '{
        "title": "MyAppToken" (2)
      }' \
      "http://quay-server.example.com/api/v1/user/apptoken" (3)
    1. The Oauth access token.

    2. The name of your application token.

    3. The URL of your Project Quay deployment appended with the /api/v1/user/apptoken endpoint.

      Example output
      {"token": {"uuid": "6b5aa827-cee5-4fbe-a434-4b7b8a245ca7", "title": "MyAppToken", "last_accessed": null, "created": "Wed, 08 Jan 2025 19:32:48 -0000", "expiration": null, "token_code": "K2YQB1YO0ABYV5OBUYOMF9MCUABN12Y608Q9RHFXBI8K7IE8TYCI4WEEXSVH1AXWKZCKGUVA57PSA8N48PWED9F27PXATFUVUD9QDNCE9GOT9Q8ACYPIN0HL"}}
Verification
  • On the Project Quay UI, click your username in the navigation pane → Account Settings. The name of your application appears under the Docker CLI and other Application Tokens heading. For example:

    Application token

Automating Project Quay processes by using the API

With the API, Project Quay administrators and users with access to the API can automate repetitive tasks such as repository management or image pruning. The following example shows you how you might use a Python script and a cron job to to automate image pruning.

Prerequisites
  • You have access to the Project Quay API, which entails having already created an OAuth 2 access token.

  • You have set BROWSER_API_CALLS_XHR_ONLY: false in your config.yaml file.

  • You have installed the Python requests library using.

  • You have enabled cron jobs on your machine.

Procedure
  1. Create a Python script that executes an API command. The following example is used to prune images using the DELETE /api/v1/repository/{repository}/tag/{tag} API endpoint.

    example.py file
    import requests (1)
    
    # Hard-coded values
    API_BASE_URL = "http://<quay-server.example.com>/api/v1" (2)
    ACCESS_TOKEN = "<access_token>" (3)
    NAMESPACE = "<namespace_name>" (4)
    REPO_NAME = "<repository_name>" (5)
    TAG = "<tag_name>" (6)
    
    def delete_image_tag():
        # Construct the full API URL for deleting the tag
        url = f"{API_BASE_URL}/repository/{NAMESPACE}/{REPO_NAME}/tag/{TAG}"
        headers = {
            "Authorization": f"Bearer {ACCESS_TOKEN}",
            "Content-Type": "application/json"
        }
    
        # Send the DELETE request to the API
        response = requests.delete(url, headers=headers)
    
        # Check the response and print appropriate messages
        if response.status_code == 200:
            print("Tag deleted successfully")
        else:
            print("Failed to delete tag:", response.json())
    
    # Execute the function
    delete_image_tag()
    1. Includes the import library in your Python code.

    2. The URL of your registry appended with /api/v1.

    3. Your OAuth 2 access token.

    4. The namespace that holds the image tag.

    5. The repository that holds the image tag.

    6. The tag name of the image.

  2. Save the script as prune_images.py.

  3. Create a cron job that automatically runs the script:

    1. Open the crontab editor by running the following command:

      $ crontab -e
    2. In the editor, add the cron job for running the script. The following example runs the script every minute:

      * * * * * sudo python /path/to/prune_images.py >> /var/log/prune_images.log 2>&1

Project Quay API examples

The remainder of this chapter provides Project Quay API examples for the features in which they are available.

Managing a user application by using the API

Project Quay users can create, list information about, and delete a user application that can be used as an alternative to using your password for Docker, Podman, or other service providers. User application tokens work like your username and password, but are encrypted and do not provide any information to third parties regarding who is accessing Project Quay.

Note

After creation via the CLI, the user application token is listed under User Settings of the Project Quay UI. Note that this differs from an application token that is created under user settings, and should be considered a different application entirely.

Use the following procedure to create a user application token.

Prerequisites
  • You have created an OAuth 2 access token.

Procedure
  • Create a user application by entering the POST /api/v1/user/apptoken API call:

    $ curl -X POST \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
        "title": "MyAppToken"
      }' \
      "http://quay-server.example.com/api/v1/user/apptoken"
    Example output
    {"token": {"uuid": "6b5aa827-cee5-4fbe-a434-4b7b8a245ca7", "title": "MyAppToken", "last_accessed": null, "created": "Wed, 08 Jan 2025 19:32:48 -0000", "expiration": null, "token_code": "K2YQB1YO0ABYV5OBUYOMF9MCUABN12Y608Q9RHFXBI8K7IE8TYCI4WEEXSVH1AXWKZCKGUVA57PSA8N48PWED9F27PXATFUVUD9QDNCE9GOT9Q8ACYPIN0HL"}}
  • You can obtain information about your application, including when the application expires, by using the GET /api/v1/user/apptoken command. For example:

    $ curl -X GET \
      -H "Authorization: Bearer <access_token>" \
      "http://quay-server.example.com/api/v1/user/apptoken"
    {"tokens": [{"uuid": "6b5aa827-cee5-4fbe-a434-4b7b8a245ca7", "title": "MyAppToken", "last_accessed": null, "created": "Wed, 08 Jan 2025 19:32:48 -0000", "expiration": null}], "only_expiring": null}
  • You can obtain information about a specific user application by entering the GET /api/v1/user/apptoken/{token_uuid} command:

    $ curl -X GET \
      -H "Authorization: Bearer <access_token>" \
      "http://quay-server.example.com/api/v1/user/apptoken/<token_uuid>"
    Example output
    {"token": {"uuid": "6b5aa827-cee5-4fbe-a434-4b7b8a245ca7", "title": "MyAppToken", "last_accessed": null, "created": "Wed, 08 Jan 2025 19:32:48 -0000", "expiration": null, "token_code": "K2YQB1YO0ABYV5OBUYOMF9MCUABN12Y608Q9RHFXBI8K7IE8TYCI4WEEXSVH1AXWKZCKGUVA57PSA8N48PWED9F27PXATFUVUD9QDNCE9GOT9Q8ACYPIN0HL"}}
  • You can delete or revoke a user application token by using the DELETE /api/v1/user/apptoken/{token_uuid} endpoint:

    $ curl -X DELETE \
      -H "Authorization: Bearer <access_token>" \
      "http://quay-server.example.com/api/v1/user/apptoken/<token_uuid>"

    This command does not return output in the CLI. You can return a list of tokens by entering one of the aforementioned commands.

Discovering Project Quay API endpoints

Project Quay API endpoints are discoverable by using the API.

Use the following procedure to discover available API endpoints.

Prerequisites
  • You have created an OAuth 2 access token.

Procedure
  • Enter the following GET /api/v1/discovery command to list all of the API endpoints available in the swagger API format:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/discovery?query=true" \
        -H "Authorization: Bearer <access_token>"
    Example output
    ---
    : "Manage the tags of a repository."}, {"name": "team", "description": "Create, list and manage an organization's teams."}, {"name": "trigger", "description": "Create, list and manage build triggers."}, {"name": "user", "description": "Manage the current user."}, {"name": "userfiles", "description": ""}]}
    ---

Obtaining Project Quay API error details

Project Quay API error details are discoverable by using the API.

Use the following procedure to discover error details.

Prerequisites
  • You have created an OAuth 2 access token.

Procedure
  • You can obtain error details of the API by entering the GET /api/v1/error/{error_type} endpoint. Note that you must include one of the following error codes:

    HTTP Code Description Schema

    200

    Successful invocation

    400

    Bad Request

    401

    Session required

    403

    Unauthorized access

    404

    Not found

    $ curl -X GET "https://<quay-server.example.com>/api/v1/error/<error_type>" \
        -H "Authorization: Bearer <access_token>"
    Example output
    curl: (7) Failed to connect to quay-server.example.com port 443 after 0 ms: Couldn't connect to server

Global messages

Global messages can be created, obtained, or deleted by using the Project Quay API. Use the following procedure to create, obtain, or delete a global message.

Prerequisites
  • You have created an OAuth 2 access token.

Procedure
  1. Create a message by using the POST /api/v1/message endpoint:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/messages" \
        -H "Authorization: Bearer <access_token>" \
        -H "Content-Type: application/json" \
        -d '{
            "message": {
                "content": "Hi",
                "media_type": "text/plain",
                "severity": "info"
            }
        }'

    This command does not return output.

  2. Use the GET /api/v1/messages command to return the list of global messages:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/messages" \
        -H "Authorization: Bearer <access_token>"
    Example output
    {"messages": [{"uuid": "ecababd4-3451-4458-b5db-801684137444", "content": "Hi", "severity": "info", "media_type": "text/plain"}]}
  3. Delete the global message by using the DELETE /api/v1/message/{uuid} endpoint:

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/message/<uuid>" \
        -H "Authorization: Bearer <access_token>"

    This command does not return output.

Viewing usage logs by using the API

Logs can be viewed by Organization or repository by using the API. They can also be aggregated (grouped), or listed with more detailed. Logs can also be viewed by user, a specific date range, or by page.

Viewing aggregated logs

Aggregated logs can be viewed by Organization, repository, a specific user, or the current user. You can also pass in optional commands like performer, starttime/endtime, and next_page to filter results.

Prerequisites
Procedure
  1. Use the GET /api/v1/user/aggregatelogs API endpoint to return the aggregated (or grouped) logs for the current user:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "https://<quay-server.example.com>/api/v1/user/aggregatelogs"
    Example output
    {"aggregated": [{"kind": "create_tag", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "manifest_label_add", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "push_repo", "count": 2, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}, {"kind": "revert_tag", "count": 1, "datetime": "Tue, 18 Jun 2024 00:00:00 -0000"}]}

    You can also pass in the performer and starttime/endtime queries to obtain aggregated logs for a specific user between a specific time period. For example:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/user/aggregatelogs?performer=<username>&starttime=<MM/DD/YYYY>&endtime=<MM/DD/YYYY>"
  2. Aggregated logs can also be viewed by Organization by using the GET /api/v1/organization/{orgname}/aggregatelogs. For example:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/organization/{orgname}/aggregatelogs"
  3. Aggregated logs can also be viewed by repository by using the GET /api/v1/repository/{repository}/aggregatelogs command. The following example includes the starttime/endtime fields:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "<quay-server.example.com>/api/v1/repository/<repository_name>/<namespace>/aggregatelogs?starttime=2024-01-01&endtime=2024-06-18""

Viewing detailed logs

Detailed logs can be viewed by Organization, repository, a specific user, or the current user. You can also pass in optional fields like performer, starttime/endtime, and next_page to filter results.

Procedure
  1. Use the GET /api/v1/user/logs API endpoint to return a list of log entries for a user. For example:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "<quay-server.example.com>/api/v1/user/logs"

    You can also pass in the performer and startime/endtime queries to obtain logs for a specific user between a specific time period. For example:

    $ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "http://quay-server.example.com/api/v1/user/logs?performer=quayuser&starttime=01/01/2024&endtime=06/18/2024"
    Example output
    ---
    {"start_time": "Mon, 01 Jan 2024 00:00:00 -0000", "end_time": "Wed, 19 Jun 2024 00:00:00 -0000", "logs": [{"kind": "revert_tag", "metadata": {"username": "quayuser", "repo": "busybox", "tag": "test-two", "manifest_digest": "sha256:57583a1b9c0a7509d3417387b4f43acf80d08cdcf5266ac87987be3f8f919d5d"}, "ip": "192.168.1.131", "datetime": "Tue, 18 Jun 2024 18:59:13 -0000", "performer": {"kind": "user", "name": "quayuser", "is_robot": false, "avatar": {"name": "quayuser", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}}}, {"kind": "push_repo", "metadata": {"repo": "busybox", "namespace": "quayuser", "user-agent": "containers/5.30.1 (github.com/containers/image)", "tag": "test-two", "username": "quayuser", }
    ---
  2. Use the GET /api/v1/organization/{orgname}/logs endpoint to return logs for a specified organization:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "http://<quay-server.example.com>/api/v1/organization/{orgname}/logs"
  3. Use the GET /api/v1/repository/{repository}/logs endpoint to return logs for a specified repository:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      "http://<quay-server.example.com>/api/v1/repository/{repository}/logs"

Exporting logs by using the API

Detailed logs can be exported to a callback URL or to an email address.

Prerequisites
Procedure
  1. Use the POST /api/v1/user/exportlogs endpoint to export logs for the current user:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "<MM/DD/YYYY>",
            "endtime": "<MM/DD/YYYY>",
            "callback_email": "your.email@example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/user/exportlogs"
    Example output
    {"export_id": "6a0b9ea9-444c-4a19-9db8-113201c38cd4"}
  2. Use the POST /api/v1/organization/{orgname}/exportlogs endpoint to export logs for an Organization:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "<MM/DD/YYYY>",
            "endtime": "<MM/DD/YYYY>",
            "callback_email": "org.logs@example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/organization/{orgname}/exportlogs"
  3. Use the POST /api/v1/repository/{repository}/exportlogs endpoint to export logs for a repository:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json" \
      -d '{
            "starttime": "2024-01-01",
            "endtime": "2024-06-18",
            "callback_url": "http://your-callback-url.example.com"
          }' \
      "http://<quay-server.example.com>/api/v1/repository/{repository}/exportlogs"

Adding and managing labels by using the API

Project Quay administrators can add and manage labels for tags with the API by using the following procedure.

Prerequisites
Procedure
  1. Use the GET /api/v1/repository/{repository}/manifest/{manifestref} command to retrieve the details of a specific manifest in a repository:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>
  2. Use the GET /api/v1/repository/{repository}/manifest/{manifestref}/labels command to retrieve a list of labels for a specific manifest:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels
    Example output
    {"labels": [{"id": "e9f717d2-c1dd-4626-802d-733a029d17ad", "key": "org.opencontainers.image.url", "value": "https://github.com/docker-library/busybox", "source_type": "manifest", "media_type": "text/plain"}, {"id": "2d34ec64-4051-43ad-ae06-d5f81003576a", "key": "org.opencontainers.image.version", "value": "1.36.1-glibc", "source_type": "manifest", "media_type": "text/plain"}]}
  3. Use the GET /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid} command to obtain information about a specific manifest:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Accept: application/json" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<label_id>
    Example output
    {"id": "e9f717d2-c1dd-4626-802d-733a029d17ad", "key": "org.opencontainers.image.url", "value": "https://github.com/docker-library/busybox", "source_type": "manifest", "media_type": "text/plain"}
  4. You can add an additional label to a manifest in a given repository with the POST /api/v1/repository/{repository}/manifest/{manifestref}/labels command. For example:

    $ curl -X POST \
      -H "Authorization: Bearer <bearer_token>" \
      -H "Content-Type: application/json" \
      --data '{
        "key": "<key>",
        "value": "<value>",
        "media_type": "<media_type>"
      }' \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels
    Example output
    {"label": {"id": "346593fd-18c8-49db-854f-4cb1fb76ff9c", "key": "example-key", "value": "example-value", "source_type": "api", "media_type": "text/plain"}}
  5. You can delete a label using the DELETE /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid} command:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<labelid>

    This command does not return output in the CLI. You can use one of the commands above to ensure that it was successfully removed.

Using the API to mirror a repository

Project Quay administrators can mirror external repositories by using the API.

Prerequisites
  • You have set FEATURE_REPO_MIRROR: true in your config.yaml file.

Procedure
  • Create a new repository mirror configuration by using the POST /api/v1/repository/{repository}/mirror endpoint:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
        -H "Authorization: Bearer <access_token>" \
        -H "Content-Type: application/json" \
        -d '{
            "is_enabled": <is_enabled>,
            "external_reference": "<external_reference>",
            "external_registry_username": "<external_registry_username>",
            "external_registry_password": "<external_registry_password>",
            "sync_start_date": "<sync_start_date>",
            "sync_interval": <sync_interval>,
            "robot_username": "<robot_username>",
            "root_rule": {
                "rule": "<rule>",
                "rule_type": "<rule_type>"
            }
        }'
  • You can return information about the mirror configuration by using the GET /api/v1/repository/{repository}/mirror endpoint:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
         -H "Authorization: Bearer <access_token>"
    Example output
    {"is_enabled": true, "mirror_type": "PULL", "external_reference": "https://quay.io/repository/argoproj/argocd", "external_registry_username": null, "external_registry_config": {}, "sync_interval": 86400, "sync_start_date": "2025-01-15T12:00:00Z", "sync_expiration_date": null, "sync_retries_remaining": 3, "sync_status": "NEVER_RUN", "root_rule": {"rule_kind": "tag_glob_csv", "rule_value": ["*.latest*"]}, "robot_username": "quayadmin+mirror_robot"}
  • You can use the POST /api/v1/repository/{repository}/mirror/sync-now endpoint to sync the repositories. For example:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror/sync-now" \
         -H "Authorization: Bearer <access_token>"

    This command does not return output in the CLI.

  • Alternatively, you can cancel the sync with the POST /api/v1/repository/{repository}/mirror/sync-cancel endpoint.For example:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror/sync-cancel" \

    This command does not return output in the CLI.

  • After creating a mirror configuration, you can make changes with the PUT /api/v1/repository/{repository}/mirror command. For example, you might choose to disable automatic synchronizations:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
        -H "Authorization: Bearer <access_token>" \
        -H "Content-Type: application/json" \
        -d '{
            "is_enabled": <false>, (1)
            "external_reference": "<external_reference>",
            "external_registry_username": "<external_registry_username>",
            "external_registry_password": "<external_registry_password>",
            "sync_start_date": "<sync_start_date>",
            "sync_interval": <sync_interval>,
            "robot_username": "<robot_username>",
            "root_rule": {
                "rule": "<rule>",
                "rule_type": "<rule_type>"
            }
        }'
    1. Disables automatic synchronization.

Establishing quota with the Project Quay API

You can establish quota for an organization or users, and tailor quota policies to suit the needs of your registry.

The following sections show you how to establish quota for an organization, a user, and then how to modify those settings.

Managing organization quota with the Project Quay API

When an organization is first created, it does not have an established quota. You can use the API to check, create, change, or delete quota limitations for an organization.

Prerequisites
  • You have generated an OAuth access token.

Procedure
  1. To set a quota for an organization, you can use the POST /api/v1/organization/{orgname}/quota endpoint:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
             "limit_bytes": 10737418240,
             "limits": "10 Gi"
         }'
    Example output
    "Created"
  2. Use the GET /api/v1/organization/{orgname}/quota command to return information about the policy, including the ID number, which is required for other organization quota endpoints. For example:

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq
    Example output
    [{"id": 1, "limit_bytes": 10737418240, "limit": "10.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}]

    After you obtain the ID number, you can use the GET /api/v1/organization/{orgname}/quota/{quota_id} command to list the quota policy. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>" \
         -H "Authorization: Bearer <access_token>"
    Example output
    {"id": 1, "limit_bytes": 10737418240, "limit": "10.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}
  3. You can use the PUT /api/v1/organization/{orgname}/quota/{quota_id} command to modify the existing quota limitation. Note that this requires the policy ID. For example:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
             "limit_bytes": <limit_in_bytes>
         }'
    Example output
    {"id": 1, "limit_bytes": 21474836480, "limit": "20.0 GiB", "default_config": false, "limits": [], "default_config_exists": false}
  4. An organization’s quota can be deleted with the DELETE /api/v1/organization/{orgname}/quota/{quota_id} command. For example:

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>" \
         -H "Authorization: Bearer <access_token>"

    This command does not return output.

Setting quota limits for an organization with the Project Quay API

You can set specific quota limits for an organization so that, when exceeded, a warning is returned, or the pushed image is denied altogether.

Procedure
  1. Use the POST /api/v1/organization/{orgname}/quota/{quota_id}/limit command to create a quota policy that rejects images if they exceeded the allotted quota. For example:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>/limit" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
               "limit_bytes": 21474836480,
               "type": "Reject", (1)
               "threshold_percent": 90 (2)
             }'
    1. One of Reject or Warning.

    2. Quota threshold, in percent of quota.

      Example output
      "Created"
  2. Use the GET /api/v1/organization/{orgname}/quota/{quota_id}/limit to obtain the ID of the quota limit. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>/limit" \
         -H "Authorization: Bearer <access_token>"
    Example output
    [{"id": 2, "type": "Reject", "limit_percent": 90}]
  1. Update the policy with the PUT /api/v1/organization/{orgname}/quota/{quota_id}/limit/{limit_id} endpoint. For example:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>/limit/<limit_id>" \
         -H "Authorization: Bearer <access_token>" \
         -H "Content-Type: application/json" \
         -d '{
               "type": "<type>",
               "threshold_percent": <threshold_percent>
             }'
    Example output
    {"id": 3, "limit_bytes": 10737418240, "limit": "10.0 GiB", "default_config": false, "limits": [{"id": 2, "type": "Warning", "limit_percent": 80}], "default_config_exists": false}
  2. You can delete the quota limit with the DELETE /api/v1/organization/{orgname}/quota/{quota_id}/limit/{limit_id} endpoint:

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/organization/<orgname>/quota/<quota_id>/limit/<limit_id>" \
         -H "Authorization: Bearer <access_token>"

    This command does not return output.

Obtaining quota limits for the user with the Project Quay API

You can specify quota and limitations for users so that, when exceeded, a warning is returned, or the pushed image is denied altogether. Quota limits for users must be set on the Project Quay UI. The following APIs can be used to view the quota limits for the user that is logged in.

Procedure
  1. Use the GET /api/v1/user/quota command to return information about the quota limitations:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/user/quota" \
      -H "Authorization: Bearer <access_token>"
    Example output
    [{"id": 4, "limit_bytes": 2199023255552, "limit": "2.0 TiB", "default_config": false, "limits": [], "default_config_exists": false}]
  2. After you have received the quota ID, you can pass it in with the GET /api/v1/user/quota/{quota_id} endpoint to return information about the limitation:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/user/quota/{quota_id}" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"id": 4, "limit_bytes": 2199023255552, "limit": "2.0 TiB", "default_config": false, "limits": [], "default_config_exists": false}
  3. The limitations can be viewed by using the GET /api/v1/user/quota/{quota_id}/limit endpoint. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/user/quota/{quota_id}/limit" \
      -H "Authorization: Bearer <access_token>"
    Example output
    [{"id": 3, "type": "Reject", "limit_percent": 100}]
  4. Additional information about the entire policy can be returned using the GET /api/v1/user/quota/{quota_id}/limit/{limit_id} endpoint:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/user/quota/{quota_id}/limit/{limit_id}" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"id": 4, "limit_bytes": 2199023255552, "limit": "2.0 TiB", "default_config": false, "limits": [{"id": 3, "type": "Reject", "limit_percent": 100}], "default_config_exists": false}

Establishing quota with the Project Quay API

Organizations can be created and managed through API endpoints. With the Project Quay API, you can create organizations, view organization information, create proxy caches for an organization, edit users with access to the organization, change organization details, delete organizations, and more.

Creating an organization by using the Project Quay API

Use the following procedure to create a new organization using the Project Quay API.

Prerequisites
Procedure
  1. Enter the following command to create a new organization using the POST /api/v1/organization/ endpoint:

    $ curl -X POST   -H "Authorization: Bearer <bearer_token>" -H "Content-Type: application/json"   -d '{
        "name": "<new_organization_name>"
      }'   "https://<quay-server.example.com>/api/v1/organization/"

    Example output

    "Created"
  2. After creation, organization details can be changed, such as adding an email address, with the PUT /api/v1/organization/{orgname} command. For example:

    $ curl -X PUT "https://<quay-server.example.com>/api/v1/organization/<orgname>" \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
            "email": "<org_email>",
            "invoice_email": <true/false>,
            "invoice_email_address": "<billing_email>"
          }'
    Example output
    {"name": "test", "email": "new-contact@test-org.com", "avatar": {"name": "test", "hash": "a15d479002b20f211568fd4419e76686d2b88a4980a5b4c4bc10420776c5f6fe", "color": "#aec7e8", "kind": "user"}, "is_admin": true, "is_member": true, "teams": {"owners": {"name": "owners", "description": "", "role": "admin", "avatar": {"name": "owners", "hash": "6f0e3a8c0eb46e8834b43b03374ece43a030621d92a7437beb48f871e90f8d90", "color": "#c7c7c7", "kind": "team"}, "can_view": true, "repo_count": 0, "member_count": 1, "is_synced": false}}, "ordered_teams": ["owners"], "invoice_email": true, "invoice_email_address": "billing@test-org.com", "tag_expiration_s": 1209600, "is_free_account": true, "quotas": [{"id": 2, "limit_bytes": 10737418240, "limits": [{"id": 1, "type": "Reject", "limit_percent": 90}]}], "quota_report": {"quota_bytes": 0, "configured_quota": 10737418240, "running_backfill": "complete", "backfill_status": "complete"}}

Deleting an organization by using the Project Quay API

Use the following procedure to delete an organization using the Project Quay API.

Prerequisites
Procedure
  1. Enter the following command to delete an organization using the DELETE /api/v1/organization/{orgname} endpoint:

    $ curl -X DELETE \
      -H "Authorization: Bearer <bearer_token>" \
      "https://<quay-server.example.com>/api/v1/organization/<organization_name>"
  2. The CLI does not return information when deleting an organization from the CLI. To confirm deletion, you can check the Project Quay UI, or you can enter the GET /api/v1/organization/{orgname} command to see if details are returned for the deleted organization:

    $ curl -X GET \
      -H "Authorization: Bearer <bearer_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>"

    Example output

    {"detail": "Not Found", "error_message": "Not Found", "error_type": "not_found", "title": "not_found", "type": "http://<quay-server.example.com>/api/v1/error/not_found", "status": 404}

Retrieving organization member information by using the API

Information about organization members can be retrieved by using the Project Quay API.

Procedure
  1. Use the GET /api/v1/organization/{orgname}/members to return a list of organization members:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/members" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"members": [{"name": "quayadmin", "kind": "user", "avatar": {"name": "quayadmin", "hash": "6d640d802fe23b93779b987c187a4b7a4d8fbcbd4febe7009bdff58d84498fba", "color": "#f7b6d2", "kind": "user"}, "teams": [{"name": "owners", "avatar": {"name": "owners", "hash": "6f0e3a8c0eb46e8834b43b03374ece43a030621d92a7437beb48f871e90f8d90", "color": "#c7c7c7", "kind": "team"}}], "repositories": ["testrepo"]}, {"name": "testuser", "kind": "user", "avatar": {"name": "testuser", "hash": "f660ab912ec121d1b1e928a0bb4bc61b15f5ad44d5efdc4e1c92a25e99b8e44a", "color": "#6b6ecf", "kind": "user"}, "teams": [{"name": "owners", "avatar": {"name": "owners", "hash": "6f0e3a8c0eb46e8834b43b03374ece43a030621d92a7437beb48f871e90f8d90", "color": "#c7c7c7", "kind": "team"}}], "repositories": []}]}
  2. You can use the GET /api/v1/organization/{orgname}/collaborators to return a list of organization collaborators:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/{orgname}/collaborators" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"collaborators": [user-test]}
  3. Use the GET /api/v1/organization/{orgname}/members/{membername} endpoint to obtain more specific information about a user:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/members/<membername>" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"name": "quayadmin", "kind": "user", "avatar": {"name": "quayadmin", "hash": "6d640d802fe23b93779b987c187a4b7a4d8fbcbd4febe7009bdff58d84498fba", "color": "#f7b6d2", "kind": "user"}, "teams": [{"name": "owners", "avatar": {"name": "owners", "hash": "6f0e3a8c0eb46e8834b43b03374ece43a030621d92a7437beb48f871e90f8d90", "color": "#c7c7c7", "kind": "team"}}], "repositories": ["testrepo"]}
  4. Use the DELETE /api/v1/organization/{orgname}/members/{membername} endpoint to delete a team member.

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/organization/<orgname>/members/<membername>" \
      -H "Authorization: Bearer <access_token>"

    This command does not return output.

Creating an organization application by using the Project Quay API

Organization applications can be created by using the Project Quay UI.

Note

Organization applications can be created by using the UI, however OAuth 2 access tokens must be created on the UI.

Procedure
  1. Use the POST /api/v1/organization/{orgname}/applications endpoint to create a new application for your organization. For example:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/<orgname>/applications" \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
            "name": "<app_name>",
            "redirect_uri": "<redirect_uri>",
            "application_uri": "<application_uri>",
            "description": "<app_description>",
            "avatar_email": "<avatar_email>"
          }'
    Example output
    {"name": "new-application", "description": "", "application_uri": "", "client_id": "E6GJSHOZMFBVNHTHNB53", "client_secret": "SANSWCWSGLVAUQ60L4Q4CEO3C1QAYGEXZK2VKJNI", "redirect_uri": "", "avatar_email": null}
  2. Use the GET /api/v1/organization/{orgname}/applications endpoint to return a list of all organization applications. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/applications" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"applications": [{"name": "test", "description": "", "application_uri": "", "client_id": "MCJ61D8KQBFS2DXM56S2", "client_secret": "J5G7CCX5QCA8Q5XZLWGI7USJPSM4M5MQHJED46CF", "redirect_uri": "", "avatar_email": null}, {"name": "new-token", "description": "", "application_uri": "", "client_id": "IG58PX2REEY9O08IZFZE", "client_secret": "2LWTWO89KH26P2CO4TWFM7PGCX4V4SUZES2CIZMR", "redirect_uri": "", "avatar_email": null}, {"name": "second-token", "description": "", "application_uri": "", "client_id": "6XBK7QY7ACSCN5XBM3GS", "client_secret": "AVKBOUXTFO3MXBBK5UJD5QCQRN2FWL3O0XPZZT78", "redirect_uri": "", "avatar_email": null}, {"name": "new-application", "description": "", "application_uri": "", "client_id": "E6GJSHOZMFBVNHTHNB53", "client_secret": "SANSWCWSGLVAUQ60L4Q4CEO3C1QAYGEXZK2VKJNI", "redirect_uri": "", "avatar_email": null}]}

    Applications can also be returned for a specific client using the GET /api/v1/organization/{orgname}/applications/{client_id} endpoint. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/<orgname>/applications/<client_id>" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"name": "test", "description": "", "application_uri": "", "client_id": "MCJ61D8KQBFS2DXM56S2", "client_secret": "J5G7CCX5QCA8Q5XZLWGI7USJPSM4M5MQHJED46CF", "redirect_uri": "", "avatar_email": null}
  3. After creation, organization applications can be updated, for example, if you want to add a redirect URI or a new description, using the PUT /api/v1/organization/{orgname}/applications/{client_id} endpoint:

    $ curl -X PUT "https://quay-server.example.com/api/v1/organization/test/applications/12345" \
      -H "Authorization: Bearer wplKtAuAX6DzAJwtB3X77nc18RFj2TKE5gTEk5K2" \
      -H "Content-Type: application/json" \
      -d '{
            "name": "Updated Application Name",
            "redirect_uri": "https://example.com/oauth/callback",
            "application_uri": "https://example.com",
            "description": "Updated description for the application",
            "avatar_email": "avatar@example.com"
          }'
  4. After creation, application information can be returned by using the GET /api/v1/app/{client_id} endpoint:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/app/<client_id>" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"name": "new-application3", "description": "", "uri": "", "avatar": {"name": "new-application3", "hash": "a15d479002b20f211568fd4419e76686d2b88a4980a5b4c4bc10420776c5f6fe", "color": "#aec7e8", "kind": "app"}, "organization": {"name": "test", "email": "new-contact@test-org.com", "avatar": {"name": "test", "hash": "a15d479002b20f211568fd4419e76686d2b88a4980a5b4c4bc10420776c5f6fe", "color": "#aec7e8", "kind": "user"}, "is_admin": true, "is_member": true, "teams": {}, "ordered_teams": [], "invoice_email": true, "invoice_email_address": "billing@test-org.com", "tag_expiration_s": 1209600, "is_free_account": true, "quotas": [{"id": 2, "limit_bytes": 10737418240, "limits": [{"id": 1, "type": "Reject", "limit_percent": 90}]}], "quota_report": {"quota_bytes": 0, "configured_quota": 10737418240, "running_backfill": "complete", "backfill_status": "complete"}}}
  5. Organization applications can be deleted with the DELETE /api/v1/organization/{orgname}/applications/{client_id} endpoint. For example:

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/organization/{orgname}/applications/{client_id}" \
      -H "Authorization: Bearer <access_token>"

    This command does not return output.

Configuring a proxy cache for an organization by using the Project Quay API

Proxy caching for an organization can be configured by using the Project Quay API.

Procedure
  1. Use the POST /api/v1/organization/{orgname}/proxycache endpoint to create a proxy cache configuration for the organization.

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/<orgname>/proxycache" \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
            "upstream_registry": "<upstream_registry>"
          }'
  2. Use the POST /api/v1/organization/{orgname}/validateproxycache endpoint to validate the proxy configuration:

    $ curl -X POST "https://<quay-server.example.com>/api/v1/organization/{orgname}/validateproxycache" \
      -H "Authorization: Bearer <access_token>" \
      -H "Content-Type: application/json" \
      -d '{
            "upstream_registry": "<upstream_registry>"
          }'
  3. Use the GET /api/v1/organization/{orgname}/proxycache endpoint to obtain information about the proxcy cache. For example:

    $ curl -X GET "https://<quay-server.example.com>/api/v1/organization/{orgname}/proxycache" \
      -H "Authorization: Bearer <access_token>"
    Example output
    {"upstream_registry": "quay.io", "expiration_s": 86400, "insecure": false}
  4. Use the DELETE /api/v1/organization/{orgname}/proxycache endpoint to

    $ curl -X DELETE "https://<quay-server.example.com>/api/v1/organization/{orgname}/proxycache" \
      -H "Authorization: Bearer <access_token>"
    Example output
    "Deleted"

Managing team members and repository permissions by using the API

Use the following procedures to add a member to a team (by direct invite or by email), or to remove a member from a team.

Prerequisites
Procedure
  • Enter the PUT /api/v1/organization/{orgname}/team/{teamname}/members/{membername} command to add or invite a member to an existing team:

    $ curl -X PUT \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"
    Example output
    {"name": "testuser", "kind": "user", "is_robot": false, "avatar": {"name": "testuser", "hash": "d51d17303dc3271ac3266fb332d7df919bab882bbfc7199d2017a4daac8979f0", "color": "#5254a3", "kind": "user"}, "invited": false}
  • Enter the DELETE /api/v1/organization/{orgname}/team/{teamname}/members/{membername} command to remove a member of a team:

    $ curl -X DELETE \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"

    This command does not an output in the CLI. To ensure that a member has been deleted, you can enter the GET /api/v1/organization/{orgname}/team/{teamname}/members command and ensure that the member is not returned in the output.

    $ curl -X GET \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members"
    Example output
    {"name": "owners", "members": [{"name": "quayadmin", "kind": "user", "is_robot": false, "avatar": {"name": "quayadmin", "hash": "b28d563a6dc76b4431fc7b0524bbff6b810387dac86d9303874871839859c7cc", "color": "#17becf", "kind": "user"}, "invited": false}, {"name": "test-org+test", "kind": "user", "is_robot": true, "avatar": {"name": "test-org+test", "hash": "aa85264436fe9839e7160bf349100a9b71403a5e9ec684d5b5e9571f6c821370", "color": "#8c564b", "kind": "robot"}, "invited": false}], "can_edit": true}
  • You can enter the PUT /api/v1/organization/{orgname}/team/{teamname}/invite/{email} command to invite a user, by email address, to an existing team:

    $ curl -X PUT \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"
  • You can enter the DELETE /api/v1/organization/{orgname}/team/{teamname}/invite/{email} command to delete the invite of an email address to join a team. For example:

    $ curl -X DELETE \
      -H "Authorization: Bearer <your_access_token>" \
      "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"

Project Quay Application Programming Interface (API)

This API allows you to perform many of the operations required to work with Project Quay repositories, users, and organizations.

Authorization

oauth2_implicit

Scopes

The following scopes are used to control access to the API endpoints:

Scope Description

repo:read

This application will be able to view and pull all repositories visible to the granting user or robot account

repo:write

This application will be able to view, push and pull to all repositories to which the granting user or robot account has write access

repo:admin

This application will have administrator access to all repositories to which the granting user or robot account has access

repo:create

This application will be able to create repositories in to any namespaces that the granting user or robot account is allowed to create repositories

user:read

This application will be able to read user information such as username and email address.

org:admin

This application will be able to administer your organizations including creating robots, creating teams, adjusting team membership, and changing billing settings. You should have absolute trust in the requesting application before granting this permission.

super:user

This application will be able to administer your installation including managing users, managing organizations and other features found in the superuser panel. You should have absolute trust in the requesting application before granting this permission.

user:admin

This application will be able to administer your account including creating robots and granting them permissions to your repositories. You should have absolute trust in the requesting application before granting this permission.

appspecifictokens

Manages app specific tokens for the current user.

createAppToken

Create a new app specific token for user.

POST /api/v1/user/apptoken

Authorizations: oauth2_implicit (user:admin)

Request body schema (application/json)

Description of a new token.

Name Description Schema

title
required

Friendly name to help identify the token

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
 $ curl -X POST \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "MyAppToken"
  }' \
  "http://quay-server.example.com/api/v1/user/apptoken"

listAppTokens

Lists the app specific tokens for the user.

GET /api/v1/user/apptoken

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

expiring
optional

If true, only returns those tokens expiring soon

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <access_token>" \
  "http://quay-server.example.com/api/v1/user/apptoken"

getAppToken

Returns a specific app token for the user.

GET /api/v1/user/apptoken/{token_uuid}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

token_uuid
required

The uuid of the app specific token

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <access_token>" \
  "http://quay-server.example.com/api/v1/user/apptoken/<token_uuid>"

revokeAppToken

Revokes a specific app token for the user.

DELETE /api/v1/user/apptoken/{token_uuid}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

token_uuid
required

The uuid of the app specific token

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <access_token>" \
  "http://quay-server.example.com/api/v1/user/apptoken/<token_uuid>"

build

Create, list, cancel and get status/logs of repository builds.

getRepoBuildStatus

Return the status for the builds specified by the build uuids.

GET /api/v1/repository/{repository}/build/{build_uuid}/status

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuildLogs

Return the build logs for the build specified by the build uuid.

GET /api/v1/repository/{repository}/build/{build_uuid}/logs

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuild

Returns information about a build.

GET /api/v1/repository/{repository}/build/{build_uuid}

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

cancelRepoBuild

Cancels a repository build.

DELETE /api/v1/repository/{repository}/build/{build_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

requestRepoBuild

Request that a repository be built and pushed from the specified input.

POST /api/v1/repository/{repository}/build/

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Description of a new repository build.

Name Description Schema

file_id
optional

The file id that was generated when the build spec was uploaded

string

archive_url
optional

The URL of the .tar.gz to build. Must start with "http" or "https".

string

subdirectory
optional

Subdirectory in which the Dockerfile can be found. You can only specify this or dockerfile_path

string

dockerfile_path
optional

Path to a dockerfile. You can only specify this or subdirectory.

string

context
optional

Pass in the context for the dockerfile. This is optional.

string

pull_robot
optional

Username of a Quay robot account to use as pull credentials

string

tags
optional

The tags to which the built images will be pushed. If none specified, "latest" is used.

array of string
non-empty unique

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuilds

Get the list of repository builds.

GET /api/v1/repository/{repository}/build/

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

since
optional

Returns all builds since the given unix timecode

integer

query

limit
optional

The maximum number of builds to return

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

discovery

API discovery information.

discovery

List all of the API endpoints available in the swagger API format.

GET /api/v1/discovery

Authorizations: 

Query parameters
Type Name Description Schema

query

internal
optional

Whether to include internal APIs.

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET "https://<quay-server.example.com>/api/v1/discovery?query=true" \
    -H "Authorization: Bearer <access_token>"

error

Error details API.

getErrorDescription

Get a detailed description of the error.

GET /api/v1/error/{error_type}

Authorizations: 

Path parameters
Type Name Description Schema

path

error_type
required

The error code identifying the type of error.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET "https://<quay-server.example.com>/api/v1/error/<error_type>" \
    -H "Authorization: Bearer <access_token>"

globalmessages

Messages API.

createGlobalMessage

Create a message.

POST /api/v1/messages

Authorizations: oauth2_implicit (super:user)

Request body schema (application/json)

Create a new message

Name Description Schema

message
required

A single message

object

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST "https://<quay-server.example.com>/api/v1/messages" \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-Type: application/json" \
    -d '{
        "message": {
            "content": "Hi",
            "media_type": "text/plain",
            "severity": "info"
        }
    }'

getGlobalMessages

Return a super users messages.

GET /api/v1/messages

Authorizations: 

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET "https://<quay-server.example.com>/api/v1/messages" \
    -H "Authorization: Bearer <access_token>"

deleteGlobalMessage

Delete a message.

DELETE /api/v1/message/{uuid}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

uuid
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE "https://<quay-server.example.com>/api/v1/message/<uuid>" \
    -H "Authorization: Bearer <access_token>"

logs

Access usage logs for organizations or repositories.

getAggregateUserLogs

Returns the aggregated logs for the current user.

GET /api/v1/user/aggregatelogs

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

performer
optional

Username for which to filter logs.

string

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "<quay-server.example.com>/api/v1/user/aggregatelogs?performer=<username>&starttime=<MM/DD/YYYY>&endtime=<MM/DD/YYYY>"

exportUserLogs

Returns the aggregated logs for the current user.

POST /api/v1/user/exportlogs

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Request body schema (application/json)

Configuration for an export logs operation

Name Description Schema

callback_url
optional

The callback URL to invoke with a link to the exported logs

string

callback_email
optional

The e-mail address at which to e-mail a link to the exported logs

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
        "starttime": "<MM/DD/YYYY>",
        "endtime": "<MM/DD/YYYY>",
        "callback_email": "your.email@example.com"
      }' \
  "http://<quay-server.example.com>/api/v1/user/exportlogs"

listUserLogs

List the logs for the current user.

GET /api/v1/user/logs

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

performer
optional

Username for which to filter logs.

string

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET   -H "Authorization: Bearer <bearer_token>"   -H "Accept: application/json"   "<quay-server.example.com>/api/v1/user/logs"

getAggregateOrgLogs

Gets the aggregated logs for the specified organization.

GET /api/v1/organization/{orgname}/aggregatelogs

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Query parameters
Type Name Description Schema

query

performer
optional

Username for which to filter logs.

string

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "<quay-server.example.com>/api/v1/organization/{orgname}/aggregatelogs"

exportOrgLogs

Exports the logs for the specified organization.

POST /api/v1/organization/{orgname}/exportlogs

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Query parameters
Type Name Description Schema

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Request body schema (application/json)

Configuration for an export logs operation

Name Description Schema

callback_url
optional

The callback URL to invoke with a link to the exported logs

string

callback_email
optional

The e-mail address at which to e-mail a link to the exported logs

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
        "starttime": "<MM/DD/YYYY>",
        "endtime": "<MM/DD/YYYY>",
        "callback_email": "org.logs@example.com"
      }' \
  "http://<quay-server.example.com>/api/v1/organization/{orgname}/exportlogs"

listOrgLogs

List the logs for the specified organization.

GET /api/v1/organization/{orgname}/logs

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

performer
optional

Username for which to filter logs.

string

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "http://<quay-server.example.com>/api/v1/organization/{orgname}/logs"

getAggregateRepoLogs

Returns the aggregated logs for the specified repository.

GET /api/v1/repository/{repository}/aggregatelogs

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "<quay-server.example.com>/api/v1/repository/<repository_name>/<namespace>/aggregatelogs?starttime=2024-01-01&endtime=2024-06-18""

exportRepoLogs

Queues an export of the logs for the specified repository.

POST /api/v1/repository/{repository}/exportlogs

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Request body schema (application/json)

Configuration for an export logs operation

Name Description Schema

callback_url
optional

The callback URL to invoke with a link to the exported logs

string

callback_email
optional

The e-mail address at which to e-mail a link to the exported logs

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
        "starttime": "2024-01-01",
        "endtime": "2024-06-18",
        "callback_url": "http://your-callback-url.example.com"
      }' \
  "http://<quay-server.example.com>/api/v1/repository/{repository}/exportlogs"

listRepoLogs

List the logs for the specified repository.

GET /api/v1/repository/{repository}/logs

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

endtime
optional

Latest time for logs. Format: "%m/%d/%Y" in UTC.

string

query

starttime
optional

Earliest time for logs. Format: "%m/%d/%Y" in UTC.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "http://<quay-server.example.com>/api/v1/repository/{repository}/logs"

manifest

Manage the manifests of a repository.

getManifestLabel

Retrieves the label with the specific ID under the manifest.

GET /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid}

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

path

labelid
required

The ID of the label

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<label_id>

deleteManifestLabel

Deletes an existing label from a manifest.

DELETE /api/v1/repository/{repository}/manifest/{manifestref}/labels/{labelid}

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

path

labelid
required

The ID of the label

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels/<labelid>

addManifestLabel

Adds a new label into the tag manifest.

POST /api/v1/repository/{repository}/manifest/{manifestref}/labels

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

Request body schema (application/json)

Adds a label to a manifest

Name Description Schema

key
required

The key for the label

string

value
required

The value for the label

string

media_type
required

The media type for this label

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  --data '{
    "key": "<key>",
    "value": "<value>",
    "media_type": "<media_type>"
  }' \
  https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels

listManifestLabels

GET /api/v1/repository/{repository}/manifest/{manifestref}/labels

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

Query parameters
Type Name Description Schema

query

filter
optional

If specified, only labels matching the given prefix will be returned

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>/labels

getRepoManifest

GET /api/v1/repository/{repository}/manifest/{manifestref}

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/manifest/<manifestref>

mirror

syncCancel

Update the sync_status for a given Repository’s mirroring configuration.

POST /api/v1/repository/{repository}/mirror/sync-cancel

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror/sync-cancel" \

syncNow

Update the sync_status for a given Repository’s mirroring configuration.

POST /api/v1/repository/{repository}/mirror/sync-now

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror/sync-now" \
     -H "Authorization: Bearer <access_token>"

getRepoMirrorConfig

Return the Mirror configuration for a given Repository.

GET /api/v1/repository/{repository}/mirror

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
     -H "Authorization: Bearer <access_token>"

changeRepoMirrorConfig

Allow users to modifying the repository’s mirroring configuration.

PUT /api/v1/repository/{repository}/mirror

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Update the repository mirroring configuration.

Name Description Schema

is_enabled
optional

Used to enable or disable synchronizations.

boolean

external_reference
optional

Location of the external repository.

string

external_registry_username
optional

Username used to authenticate with external registry.

external_registry_password
optional

Password used to authenticate with external registry.

sync_start_date
optional

Determines the next time this repository is ready for synchronization.

string

sync_interval
optional

Number of seconds after next_start_date to begin synchronizing.

integer

robot_username
optional

Username of robot which will be used for image pushes.

string

root_rule
optional

A list of glob-patterns used to determine which tags should be synchronized.

object

external_registry_config
optional

object

Responses
HTTP Code Description Schema

201

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-Type: application/json" \
    -d '{
        "is_enabled": <false>, (1)
        "external_reference": "<external_reference>",
        "external_registry_username": "<external_registry_username>",
        "external_registry_password": "<external_registry_password>",
        "sync_start_date": "<sync_start_date>",
        "sync_interval": <sync_interval>,
        "robot_username": "<robot_username>",
        "root_rule": {
            "rule": "<rule>",
            "rule_type": "<rule_type>"
        }
    }'
  1. Disables automatic synchronization.

createRepoMirrorConfig

Create a RepoMirrorConfig for a given Repository.

POST /api/v1/repository/{repository}/mirror

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Create the repository mirroring configuration.

Name Description Schema

is_enabled
optional

Used to enable or disable synchronizations.

boolean

external_reference
required

Location of the external repository.

string

external_registry_username
optional

Username used to authenticate with external registry.

external_registry_password
optional

Password used to authenticate with external registry.

sync_start_date
required

Determines the next time this repository is ready for synchronization.

string

sync_interval
required

Number of seconds after next_start_date to begin synchronizing.

integer

robot_username
required

Username of robot which will be used for image pushes.

string

root_rule
required

A list of glob-patterns used to determine which tags should be synchronized.

object

external_registry_config
optional

object

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST "https://<quay-server.example.com>/api/v1/repository/<namespace>/<repo>/mirror" \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-Type: application/json" \
    -d '{
        "is_enabled": <is_enabled>,
        "external_reference": "<external_reference>",
        "external_registry_username": "<external_registry_username>",
        "external_registry_password": "<external_registry_password>",
        "sync_start_date": "<sync_start_date>",
        "sync_interval": <sync_interval>,
        "robot_username": "<robot_username>",
        "root_rule": {
            "rule": "<rule>",
            "rule_type": "<rule_type>"
        }
    }'

namespacequota

listUserQuota

GET /api/v1/user/quota

Authorizations: oauth2_implicit (user:admin)

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationQuotaLimit

GET /api/v1/organization/{orgname}/quota/{quota_id}/limit/{limit_id}

Authorizations: 

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

limit_id
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeOrganizationQuotaLimit

PUT /api/v1/organization/{orgname}/quota/{quota_id}/limit/{limit_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

limit_id
required

string

path

orgname
required

string

Request body schema (application/json)

Description of changing organization quota limit

Name Description Schema

type
optional

Type of quota limit: "Warning" or "Reject"

string

threshold_percent
optional

Quota threshold, in percent of quota

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganizationQuotaLimit

DELETE /api/v1/organization/{orgname}/quota/{quota_id}/limit/{limit_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

limit_id
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createOrganizationQuotaLimit

POST /api/v1/organization/{orgname}/quota/{quota_id}/limit

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

orgname
required

string

Request body schema (application/json)

Description of a new organization quota limit

Name Description Schema

type
required

Type of quota limit: "Warning" or "Reject"

string

threshold_percent
required

Quota threshold, in percent of quota

integer

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listOrganizationQuotaLimit

GET /api/v1/organization/{orgname}/quota/{quota_id}/limit

Authorizations: 

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getUserQuotaLimit

GET /api/v1/user/quota/{quota_id}/limit/{limit_id}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

limit_id
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listUserQuotaLimit

GET /api/v1/user/quota/{quota_id}/limit

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

quota_id
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationQuota

GET /api/v1/organization/{orgname}/quota/{quota_id}

Authorizations: 

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeOrganizationQuota

PUT /api/v1/organization/{orgname}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

orgname
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
optional

Number of bytes the organization is allowed

integer

limits
optional

Human readable storage capacity of the organization. Accepts SI units like Mi, Gi, or Ti, as well as non-standard units like GB or MB. Must be mutually exclusive with limit_bytes.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganizationQuota

DELETE /api/v1/organization/{orgname}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

quota_id
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createOrganizationQuota

Create a new organization quota.

POST /api/v1/organization/{orgname}/quota

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

orgname
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
required

Number of bytes the organization is allowed

integer

limits
optional

Human readable storage capacity of the organization. Accepts SI units like Mi, Gi, or Ti, as well as non-standard units like GB or MB. Must be mutually exclusive with limit_bytes.

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listOrganizationQuota

GET /api/v1/organization/{orgname}/quota

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getUserQuota

GET /api/v1/user/quota/{quota_id}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

quota_id
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

organization

Manage organizations, members and OAuth applications.

createOrganization

Create a new organization.

POST /api/v1/organization/

Authorizations: oauth2_implicit (user:admin)

Request body schema (application/json)

Description of a new organization.

Name Description Schema

name
required

Organization username

string

email
optional

Organization contact email

string

recaptcha_response
optional

The (may be disabled) recaptcha response code for verification

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST   -H "Authorization: Bearer <bearer_token>" -H "Content-Type: application/json"   -d '{
    "name": "<new_organization_name>"
  }'   "https://<quay-server.example.com>/api/v1/organization/"

validateProxyCacheConfig

POST /api/v1/organization/{orgname}/validateproxycache

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

string

Request body schema (application/json)

Proxy cache configuration for an organization

Name Description Schema

upstream_registry
required

Name of the upstream registry that is to be cached

string

Responses
HTTP Code Description Schema

202

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationCollaborators

List outside collaborators of the specified organization.

GET /api/v1/organization/{orgname}/collaborators

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationApplication

Retrieves the application with the specified client_id under the specified organization.

GET /api/v1/organization/{orgname}/applications/{client_id}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

client_id
required

The OAuth client ID

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateOrganizationApplication

Updates an application under this organization.

PUT /api/v1/organization/{orgname}/applications/{client_id}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

client_id
required

The OAuth client ID

string

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of an updated application.

Name Description Schema

name
required

The name of the application

string

redirect_uri
required

The URI for the application’s OAuth redirect

string

application_uri
required

The URI for the application’s homepage

string

description
optional

The human-readable description for the application

string

avatar_email
optional

The e-mail address of the avatar to use for the application

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganizationApplication

Deletes the application under this organization.

DELETE /api/v1/organization/{orgname}/applications/{client_id}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

client_id
required

The OAuth client ID

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createOrganizationApplication

Creates a new application under this organization.

POST /api/v1/organization/{orgname}/applications

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of a new organization application.

Name Description Schema

name
required

The name of the application

string

redirect_uri
optional

The URI for the application’s OAuth redirect

string

application_uri
optional

The URI for the application’s homepage

string

description
optional

The human-readable description for the application

string

avatar_email
optional

The e-mail address of the avatar to use for the application

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationApplications

List the applications for the specified organization.

GET /api/v1/organization/{orgname}/applications

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getProxyCacheConfig

Retrieves the proxy cache configuration of the organization.

GET /api/v1/organization/{orgname}/proxycache

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteProxyCacheConfig

Delete proxy cache configuration for the organization.

DELETE /api/v1/organization/{orgname}/proxycache

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createProxyCacheConfig

Creates proxy cache configuration for the organization.

POST /api/v1/organization/{orgname}/proxycache

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Proxy cache configuration for an organization

Name Description Schema

upstream_registry
required

Name of the upstream registry that is to be cached

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationMember

Retrieves the details of a member of the organization.

GET /api/v1/organization/{orgname}/members/{membername}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

membername
required

The username of the organization member

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

removeOrganizationMember

Removes a member from an organization, revoking all its repository priviledges and removing it from all teams in the organization.

DELETE /api/v1/organization/{orgname}/members/{membername}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

membername
required

The username of the organization member

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationMembers

List the human members of the specified organization.

GET /api/v1/organization/{orgname}/members

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganization

Get the details for the specified organization.

GET /api/v1/organization/{orgname}

Authorizations: 

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>"

changeOrganizationDetails

Change the details for the specified organization.

PUT /api/v1/organization/{orgname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of updates for an existing organization

Name Description Schema

email
optional

Organization contact email

string

invoice_email
optional

Whether the organization desires to receive emails for invoices

boolean

invoice_email_address
optional

The email address at which to receive invoices

tag_expiration_s
optional

The number of seconds for tag expiration

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteAdminedOrganization

Deletes the specified organization.

DELETE /api/v1/organization/{orgname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>"

getApplicationInformation

Get information on the specified application.

GET /api/v1/app/{client_id}

Authorizations: 

Path parameters
Type Name Description Schema

path

client_id
required

The OAuth client ID

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

permission

Manage repository permissions.

getUserTransitivePermission

Get the fetch the permission for the specified user.

GET /api/v1/repository/{repository}/permissions/user/{username}/transitive

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

username
required

The username of the user to which the permissions apply

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getUserPermissions

Get the permission for the specified user.

GET /api/v1/repository/{repository}/permissions/user/{username}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

username
required

The username of the user to which the permission applies

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeUserPermissions

Update the perimssions for an existing repository.

PUT /api/v1/repository/{repository}/permissions/user/{username}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

username
required

The username of the user to which the permission applies

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Description of a user permission.

Name Description Schema

role
required

Role to use for the user

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  -d '{"role": "admin"}' \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>

deleteUserPermissions

Delete the permission for the user.

DELETE /api/v1/repository/{repository}/permissions/user/{username}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

username
required

The username of the user to which the permission applies

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>

getTeamPermissions

Fetch the permission for the specified team.

GET /api/v1/repository/{repository}/permissions/team/{teamname}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

teamname
required

The name of the team to which the permission applies

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeTeamPermissions

Update the existing team permission.

PUT /api/v1/repository/{repository}/permissions/team/{teamname}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

teamname
required

The name of the team to which the permission applies

string

Request body schema (application/json)

Description of a team permission.

Name Description Schema

role
required

Role to use for the team

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteTeamPermissions

Delete the permission for the specified team.

DELETE /api/v1/repository/{repository}/permissions/team/{teamname}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

teamname
required

The name of the team to which the permission applies

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listRepoTeamPermissions

List all team permission.

GET /api/v1/repository/{repository}/permissions/team/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listRepoUserPermissions

List all user permissions.

GET /api/v1/repository/{repository}/permissions/user/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository>/permissions/user/<username>/

policy

createOrganizationAutoPrunePolicy

Creates an auto-prune policy for the organization

POST /api/v1/organization/{orgname}/autoprunepolicy/

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listOrganizationAutoPrunePolicies

Lists the auto-prune policies for the organization

GET /api/v1/organization/{orgname}/autoprunepolicy/

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrganizationAutoPrunePolicy

Fetches the auto-prune policy for the organization

GET /api/v1/organization/{orgname}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganizationAutoPrunePolicy

Deletes the auto-prune policy for the organization

DELETE /api/v1/organization/{orgname}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateOrganizationAutoPrunePolicy

Updates the auto-prune policy for the organization

PUT /api/v1/organization/{orgname}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

orgname
required

The name of the organization

string

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

204

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createRepositoryAutoPrunePolicy

Creates an auto-prune policy for the repository

POST /api/v1/repository/{repository}/autoprunepolicy/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listRepositoryAutoPrunePolicies

Lists the auto-prune policies for the repository

GET /api/v1/repository/{repository}/autoprunepolicy/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepositoryAutoPrunePolicy

Fetches the auto-prune policy for the repository

GET /api/v1/repository/{repository}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteRepositoryAutoPrunePolicy

Deletes the auto-prune policy for the repository

DELETE /api/v1/repository/{repository}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateRepositoryAutoPrunePolicy

Updates the auto-prune policy for the repository

PUT /api/v1/repository/{repository}/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createUserAutoPrunePolicy

Creates the auto-prune policy for the currently logged in user

POST /api/v1/user/autoprunepolicy/

Authorizations: oauth2_implicit (user:admin)

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listUserAutoPrunePolicies

Lists the auto-prune policies for the currently logged in user

GET /api/v1/user/autoprunepolicy/

Authorizations: oauth2_implicit (user:admin)

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getUserAutoPrunePolicy

Fetches the auto-prune policy for the currently logged in user

GET /api/v1/user/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteUserAutoPrunePolicy

Deletes the auto-prune policy for the currently logged in user

DELETE /api/v1/user/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateUserAutoPrunePolicy

Updates the auto-prune policy for the currently logged in user

PUT /api/v1/user/autoprunepolicy/{policy_uuid}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

policy_uuid
required

The unique ID of the policy

string

Request body schema (application/json)

The policy configuration that is to be applied to the user namespace

Name Description Schema

method
required

The method to use for pruning tags (number_of_tags, creation_date)

string

value
required

The value to use for the pruning method (number of tags e.g. 10, time delta e.g. 7d (7 days))

tagPattern
optional

Tags only matching this pattern will be pruned

string

tagPatternMatches
optional

Determine whether pruned tags should or should not match the tagPattern

boolean

Responses
HTTP Code Description Schema

204

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

prototype

Manage default permissions added to repositories.

updateOrganizationPrototypePermission

Update the role of an existing permission prototype.

PUT /api/v1/organization/{orgname}/prototypes/{prototypeid}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

prototypeid
required

The ID of the prototype

string

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of a the new prototype role

Name Description Schema

role
optional

Role that should be applied to the permission

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  --data '{
    "role": "write"
  }' \
  https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes/<prototypeid>

deleteOrganizationPrototypePermission

Delete an existing permission prototype.

DELETE /api/v1/organization/{orgname}/prototypes/{prototypeid}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

prototypeid
required

The ID of the prototype

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes/<prototype_id>

createOrganizationPrototypePermission

Create a new permission prototype.

POST /api/v1/organization/{orgname}/prototypes

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of a new prototype

Name Description Schema

role
required

Role that should be applied to the delegate

string

activating_user
optional

Repository creating user to whom the rule should apply

object

delegate
required

Information about the user or team to which the rule grants access

object

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST   -H "Authorization: Bearer <bearer_token>"   -H "Content-Type: application/json"   --data '{
    "role": "<admin_read_or_write>",
    "delegate": {
      "name": "<username>",
      "kind": "user"
    },
    "activating_user": {
      "name": "<robot_name>"
    }
  }'   https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes

getOrganizationPrototypePermissions

List the existing prototypes for this organization.

GET /api/v1/organization/{orgname}/prototypes

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/organization/<organization_name>/prototypes

referrers

List v2 API referrers

getReferrers

List v2 API referrers of an image digest.

GET /v2/{organization_name}/{repository_name}/referrers/{digest}
Request body schema (application/json)

Referrers of an image digest.

Type

Name

Description

Schema

path

orgname
required

The name of the organization

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

referrers
required

Looks up the OCI referrers of a manifest under a repository.

string

repository

List, create and manage repositories.

createRepo

Create a new repository.

POST /api/v1/repository

Authorizations: oauth2_implicit (repo:create)

Request body schema (application/json)

Description of a new repository

Name Description Schema

repository
required

Repository name

string

visibility
required

Visibility which the repository will start with

string

namespace
optional

Namespace in which the repository should be created. If omitted, the username of the caller is used

string

description
required

Markdown encoded description for the repository

string

repo_kind
optional

The kind of repository

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "repository": "<new_repository_name>",
    "visibility": "<public>",
    "description": "<This is a description of the new repository>."
  }' \
  "https://quay-server.example.com/api/v1/repository"

listRepos

Fetch the list of repositories visible to the current user under a variety of situations.

GET /api/v1/repository

Authorizations: oauth2_implicit (repo:read)

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

repo_kind
optional

The kind of repositories to return

string

query

popularity
optional

Whether to include the repository’s popularity metric.

boolean

query

last_modified
optional

Whether to include when the repository was last modified.

boolean

query

public
required

Adds any repositories visible to the user by virtue of being public

boolean

query

starred
required

Filters the repositories returned to those starred by the user

boolean

query

namespace
required

Filters the repositories returned to this namespace

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeRepoVisibility

Change the visibility of a repository.

POST /api/v1/repository/{repository}/changevisibility

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Change the visibility for the repository.

Name Description Schema

visibility
required

Visibility which the repository will start with

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeRepoState

Change the state of a repository.

PUT /api/v1/repository/{repository}/changestate

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Change the state of the repository.

Name Description Schema

state
required

Determines whether pushes are allowed.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepo

Fetch the specified repository.

GET /api/v1/repository/{repository}

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

includeTags
optional

Whether to include repository tags

boolean

query

includeStats
optional

Whether to include action statistics

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET -H "Authorization: Bearer <bearer_token>" "<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>"

updateRepo

Update the description in the specified repository.

PUT /api/v1/repository/{repository}

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Fields which can be updated in a repository.

Name Description Schema

description
required

Markdown encoded description for the repository

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteRepository

Delete a repository.

DELETE /api/v1/repository/{repository}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE   -H "Authorization: Bearer <bearer_token>" "<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>"

repositorynotification

List, create and manage repository events/notifications.

testRepoNotification

Queues a test notification for this repository.

POST /api/v1/repository/{repository}/notification/{uuid}/test

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

uuid
required

The UUID of the notification

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/notification/<uuid>/test

getRepoNotification

Get information for the specified notification.

GET /api/v1/repository/{repository}/notification/{uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

uuid
required

The UUID of the notification

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  https://<quay-server.example.com>/api/v1/repository/<repository>/notification/<uuid>

deleteRepoNotification

Deletes the specified notification.

DELETE /api/v1/repository/{repository}/notification/{uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

uuid
required

The UUID of the notification

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/notification/<uuid>

resetRepositoryNotificationFailures

Resets repository notification to 0 failures.

POST /api/v1/repository/{repository}/notification/{uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

uuid
required

The UUID of the notification

string

Responses
HTTP Code Description Schema

204

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createRepoNotification

POST /api/v1/repository/{repository}/notification/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Information for creating a notification on a repository

Name Description Schema

event
required

The event on which the notification will respond

string

method
required

The method of notification (such as email or web callback)

string

config
required

JSON config information for the specific method of notification

object

eventConfig
required

JSON config information for the specific event of notification

object

title
optional

The human-readable title of the notification

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  --data '{
    "event": "<event>",
    "method": "<method>",
    "config": {
      "<config_key>": "<config_value>"
    },
    "eventConfig": {
      "<eventConfig_key>": "<eventConfig_value>"
    }
  }' \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/notification/

listRepoNotifications

List the notifications for the specified repository.

GET /api/v1/repository/{repository}/notification/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

robot

Manage user and organization robot accounts.

getUserRobots

List the available robots for the user.

GET /api/v1/user/robots

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

limit
optional

If specified, the number of robots to return.

integer

query

token
optional

If false, the robot’s token is not returned.

boolean

query

permissions
optional

Whether to include repositories and teams in which the robots have permission.

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getOrgRobotPermissions

Returns the list of repository permissions for the org’s robot.

GET /api/v1/organization/{orgname}/robots/{robot_shortname}/permissions

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

regenerateOrgRobotToken

Regenerates the token for an organization robot.

POST /api/v1/organization/{orgname}/robots/{robot_shortname}/regenerate

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/organization/<orgname>/robots/<robot_shortname>/regenerate"

getUserRobotPermissions

Returns the list of repository permissions for the user’s robot.

GET /api/v1/user/robots/{robot_shortname}/permissions

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

regenerateUserRobotToken

Regenerates the token for a user’s robot.

POST /api/v1/user/robots/{robot_shortname}/regenerate

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>/regenerate"

getOrgRobot

Returns the organization’s robot with the specified name.

GET /api/v1/organization/{orgname}/robots/{robot_shortname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createOrgRobot

Create a new robot in the organization.

PUT /api/v1/organization/{orgname}/robots/{robot_shortname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Optional data for creating a robot

Name Description Schema

description
optional

Optional text description for the robot

string

unstructured_metadata
optional

Optional unstructured metadata for the robot

object

Responses
HTTP Code Description Schema

201

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT   -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/organization/<organization_name>/robots/<robot_name>"

deleteOrgRobot

Delete an existing organization robot.

DELETE /api/v1/organization/{orgname}/robots/{robot_shortname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/robots/<robot_shortname>"

getOrgRobots

List the organization’s robots.

GET /api/v1/organization/{orgname}/robots

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

orgname
required

The name of the organization

string

Query parameters
Type Name Description Schema

query

limit
optional

If specified, the number of robots to return.

integer

query

token
optional

If false, the robot’s token is not returned.

boolean

query

permissions
optional

Whether to include repositories and teams in which the robots have permission.

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/organization/<organization_name>/robots"

getUserRobot

Returns the user’s robot with the specified name.

GET /api/v1/user/robots/{robot_shortname}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>"

createUserRobot

Create a new user robot with the specified name.

PUT /api/v1/user/robots/{robot_shortname}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

Request body schema (application/json)

Optional data for creating a robot

Name Description Schema

description
optional

Optional text description for the robot

string

unstructured_metadata
optional

Optional unstructured metadata for the robot

object

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT   -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/user/robots/<robot_name>"

deleteUserRobot

Delete an existing robot.

DELETE /api/v1/user/robots/{robot_shortname}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

robot_shortname
required

The short name for the robot, without any user or organization prefix

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <bearer_token>" \
  "<quay-server.example.com>/api/v1/user/robots/<robot_shortname>"

Auth Federated Robot Token

Return an expiring robot token using the robot identity federation mechanism.

GET oauth2/federation/robot/token

Authorizations: oauth2_implicit (robot:auth)

Responses
HTTP Code Description Schema

200

Successful authentication and token generation

{ "token": "string" }

401

Unauthorized: missing or invalid authentication

{ "error": "string" }

Request Body
Type Name Description Schema

body

auth_result
required

The result of the authentication process, containing information about the robot identity.

{ "missing": "boolean", "error_message": "string", "context": { "robot": "RobotObject" } }

createOrgRobotFederation

Create a federation configuration for the specified organization robot.

POST /api/v1/organization/{orgname}/robots/{robot_shortname}/federation

Retrieve the federation configuration for the specified organization robot.

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

orgname + robot_shortname required

The name of the organization and the short name for the robot, without any user or organization prefix

string

Responses
HTTP Code Description Schema

201

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

Conduct searches against all registry context.

conductRepoSearch

Get a list of apps and repositories that match the specified query.

GET /api/v1/find/repositories

Authorizations: 

Query parameters
Type Name Description Schema

query

includeUsage
optional

Whether to include usage metadata

boolean

query

page
optional

The page.

integer

query

query
optional

The search query.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

conductSearch

Get a list of entities and resources that match the specified query.

GET /api/v1/find/all

Authorizations: oauth2_implicit (repo:read)

Query parameters
Type Name Description Schema

query

query
optional

The search query.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getMatchingEntities

Get a list of entities that match the specified prefix.

GET /api/v1/entities/{prefix}

Authorizations: 

Path parameters
Type Name Description Schema

path

prefix
required

string

Query parameters
Type Name Description Schema

query

includeOrgs
optional

Whether to include orgs names.

boolean

query

includeTeams
optional

Whether to include team names.

boolean

query

namespace
optional

Namespace to use when querying for org entities.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

secscan

List and manage repository vulnerabilities and other security information.

getRepoManifestSecurity

GET /api/v1/repository/{repository}/manifest/{manifestref}/security

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

manifestref
required

The digest of the manifest

string

Query parameters
Type Name Description Schema

query

vulnerabilities
optional

Include vulnerabilities informations

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  "https://quay-server.example.com/api/v1/repository/<namespace>/<repository>/manifest/<manifest_digest>/security?vulnerabilities=<true_or_false>"

superuser

Superuser API.

createInstallUser

Creates a new user.

POST /api/v1/superuser/users/

Authorizations: oauth2_implicit (super:user)

Request body schema (application/json)

Data for creating a user

Name Description Schema

username
required

The username of the user being created

string

email
optional

The email address of the user being created

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST -H "Authorization: Bearer <bearer_token>" -H "Content-Type: application/json" -d '{
  "username": "newuser",
  "email": "newuser@example.com"
}' "https://<quay-server.example.com>/api/v1/superuser/users/"

deleteInstallUser

Deletes a user.

DELETE /api/v1/superuser/users/{username}

Authorizations: oauth2_implicit (super:user)

Request body schema (application/json)

Data for deleting a user

Name Description Schema

username
required

The username of the user being deleted

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/users/{username}"

listAllUsers

Returns a list of all users in the system.

GET /api/v1/superuser/users/

Authorizations: oauth2_implicit (super:user)

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

limit
optional

Limit to the number of results to return per page. Max 100.

integer

query

disabled
optional

If false, only enabled users will be returned.

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/users/"

listAllLogs

List the usage logs for the current system.

GET /api/v1/superuser/logs

Authorizations: oauth2_implicit (super:user)

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

query

page
optional

The page number for the logs

integer

query

endtime
optional

Latest time to which to get logs (%m/%d/%Y %Z)

string

query

starttime
optional

Earliest time from which to get logs (%m/%d/%Y %Z)

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listAllOrganizations

List the organizations for the current system.

GET /api/v1/superuser/organizations

Authorizations: oauth2_implicit (super:user)

Query parameters
Type Name Description Schema

path

name
required

The name of the organization being managed

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET -H "Authorization: Bearer <bearer_token>" "https://<quay-server.example.com>/api/v1/superuser/organizations/"

createServiceKey

POST /api/v1/superuser/keys

Authorizations: oauth2_implicit (super:user)

Request body schema (application/json)

Description of creation of a service key

Name Description Schema

service
required

The service authenticating with this key

string

name
optional

The friendly name of a service key

string

metadata
optional

The key/value pairs of this key’s metadata

object

notes
optional

If specified, the extra notes for the key

string

expiration
required

The expiration date as a unix timestamp

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listServiceKeys

GET /api/v1/superuser/keys

Authorizations: oauth2_implicit (super:user)

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeUserQuotaSuperUser

PUT /api/v1/superuser/organization/{namespace}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

path

quota_id
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
optional

Number of bytes the organization is allowed

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteUserQuotaSuperUser

DELETE /api/v1/superuser/organization/{namespace}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

path

quota_id
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createUserQuotaSuperUser

POST /api/v1/superuser/organization/{namespace}/quota

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
required

Number of bytes the organization is allowed

integer

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listUserQuotaSuperUser

GET /api/v1/superuser/organization/{namespace}/quota

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeOrganizationQuotaSuperUser

PUT /api/v1/superuser/users/{namespace}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

path

quota_id
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
optional

Number of bytes the organization is allowed

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganizationQuotaSuperUser

DELETE /api/v1/superuser/users/{namespace}/quota/{quota_id}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

path

quota_id
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

createOrganizationQuotaSuperUser

POST /api/v1/superuser/users/{namespace}/quota

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Request body schema (application/json)

Description of a new organization quota

Name Description Schema

limit_bytes
optional

Number of bytes the organization is allowed

integer

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listOrganizationQuotaSuperUser

GET /api/v1/superuser/users/{namespace}/quota

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

changeOrganization

Updates information about the specified user.

PUT /api/v1/superuser/organizations/{name}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

name
required

The name of the organizaton being managed

string

Request body schema (application/json)

Description of updates for an existing organization

Name Description Schema

email
optional

Organization contact email

string

invoice_email
optional

Whether the organization desires to receive emails for invoices

boolean

invoice_email_address
optional

The email address at which to receive invoices

tag_expiration_s
optional

The number of seconds for tag expiration

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteOrganization

Deletes the specified organization.

DELETE /api/v1/superuser/organizations/{name}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

name
required

The name of the organizaton being managed

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

approveServiceKey

POST /api/v1/superuser/approvedkeys/{kid}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

kid
required

The unique identifier for a service key

string

Request body schema (application/json)

Information for approving service keys

Name Description Schema

notes
optional

Optional approval notes

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteServiceKey

DELETE /api/v1/superuser/keys/{kid}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

kid
required

The unique identifier for a service key

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateServiceKey

PUT /api/v1/superuser/keys/{kid}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

kid
required

The unique identifier for a service key

string

Request body schema (application/json)

Description of updates for a service key

Name Description Schema

name
optional

The friendly name of a service key

string

metadata
optional

The key/value pairs of this key’s metadata

object

expiration
optional

The expiration date as a unix timestamp

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getServiceKey

GET /api/v1/superuser/keys/{kid}

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

kid
required

The unique identifier for a service key

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuildStatusSuperUser

Return the status for the builds specified by the build uuids.

GET /api/v1/superuser/{build_uuid}/status

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuildSuperUser

Returns information about a build.

GET /api/v1/superuser/{build_uuid}/build

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRepoBuildLogsSuperUser

Return the build logs for the build specified by the build uuid.

GET /api/v1/superuser/{build_uuid}/logs

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

build_uuid
required

The UUID of the build

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getRegistrySize

GET /api/v1/superuser/registrysize/

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Description of a image registry size

Name Description Schema

size_bytes*
optional

Number of bytes the organization is allowed

integer

last_ran

integer

queued

boolean

running

boolean

Responses
HTTP Code Description Schema

200

CREATED

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

postRegistrySize

POST /api/v1/superuser/registrysize/

Authorizations: oauth2_implicit (super:user)

Path parameters
Type Name Description Schema

path

namespace
required

string

Request body schema (application/json)

Description of a image registry size

Name Description Schema

last_ran

integer

queued

boolean

running

boolean

Responses
HTTP Code Description Schema

201

CREATED

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

tag

Manage the tags of a repository.

restoreTag

Restores a repository tag back to a previous image in the repository.

POST /api/v1/repository/{repository}/tag/{tag}/restore

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

tag
required

The name of the tag

string

Request body schema (application/json)

Restores a tag to a specific image

Name Description Schema

manifest_digest
required

If specified, the manifest digest that should be used

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X POST \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  --data '{
    "manifest_digest": <manifest_digest>
  }' \
  quay-server.example.com/api/v1/repository/quayadmin/busybox/tag/test/restore

changeTag

Change which image a tag points to or create a new tag.

PUT /api/v1/repository/{repository}/tag/{tag}

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

tag
required

The name of the tag

string

Request body schema (application/json)

Makes changes to a specific tag

Name Description Schema

manifest_digest
optional

(If specified) The manifest digest to which the tag should point

expiration
optional

(If specified) The expiration for the image

Responses
HTTP Code Description Schema

201

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Content-Type: application/json" \
  --data '{
    "manifest_digest": "<manifest_digest>"
  }' \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/<tag>

deleteFullTag

Delete the specified repository tag.

DELETE /api/v1/repository/{repository}/tag/{tag}

Authorizations: oauth2_implicit (repo:write)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

path

tag
required

The name of the tag

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listRepoTags

GET /api/v1/repository/{repository}/tag/

Authorizations: oauth2_implicit (repo:read)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

onlyActiveTags
optional

Filter to only active tags.

boolean

query

page
optional

Page index for the results. Default 1.

integer

query

limit
optional

Limit to the number of results to return per page. Max 100.

integer

query

filter_tag_name
optional

Syntax: <op>:<name> Filters the tag names based on the operation.<op> can be 'like' or 'eq'.

string

query

specificTag
optional

Filters the tags to the specific tag.

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <bearer_token>" \
  -H "Accept: application/json" \
  https://<quay-server.example.com>/api/v1/repository/<namespace>/<repository_name>/tag/

team

Create, list and manage an organization’s teams.

getOrganizationTeamPermissions

Returns the list of repository permissions for the org’s team.

GET /api/v1/organization/{orgname}/team/{teamname}/permissions

Authorizations: 

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateOrganizationTeamMember

Adds or invites a member to an existing team.

PUT /api/v1/organization/{orgname}/team/{teamname}/members/{membername}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

membername
required

The username of the team member

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"

deleteOrganizationTeamMember

Delete a member of a team.

If the user is merely invited to join the team, then the invite is removed instead.
DELETE /api/v1/organization/{orgname}/team/{teamname}/members/{membername}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

membername
required

The username of the team member

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members/<member_name>"

getOrganizationTeamMembers

Retrieve the list of members for the specified team.

GET /api/v1/organization/{orgname}/team/{teamname}/members

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

orgname
required

The name of the organization

string

Query parameters
Type Name Description Schema

query

includePending
optional

Whether to include pending members

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X GET \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/members"

inviteTeamMemberEmail

Invites an email address to an existing team.

PUT /api/v1/organization/{orgname}/team/{teamname}/invite/{email}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

email
required

string

path

teamname
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X PUT \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"

deleteTeamMemberEmailInvite

Delete an invite of an email address to join a team.

DELETE /api/v1/organization/{orgname}/team/{teamname}/invite/{email}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

email
required

string

path

teamname
required

string

path

orgname
required

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command

+

$ curl -X DELETE \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>/invite/<email>"

updateOrganizationTeam

Update the org-wide permission for the specified team.

Note

This API is also used to create a team.

PUT /api/v1/organization/{orgname}/team/{teamname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

orgname
required

The name of the organization

string

Request body schema (application/json)

Description of a team

Name Description Schema

role
required

Org wide permissions that should apply to the team

string

description
optional

Markdown description for the team

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -k -X PUT -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer <bearer_token>"  --data '{"role": "creator"}' https://<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>

deleteOrganizationTeam

Delete the specified team.

DELETE /api/v1/organization/{orgname}/team/{teamname}

Authorizations: oauth2_implicit (org:admin)

Path parameters
Type Name Description Schema

path

teamname
required

The name of the team

string

path

orgname
required

The name of the organization

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Example command
$ curl -X DELETE \
  -H "Authorization: Bearer <your_access_token>" \
  "<quay-server.example.com>/api/v1/organization/<organization_name>/team/<team_name>"

trigger

Create, list and manage build triggers.

activateBuildTrigger

Activate the specified build trigger.

POST /api/v1/repository/{repository}/trigger/{trigger_uuid}/activate

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)
Name Description Schema

config
required

Arbitrary json.

object

pull_robot
optional

The name of the robot that will be used to pull images.

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listTriggerRecentBuilds

List the builds started by the specified trigger.

GET /api/v1/repository/{repository}/trigger/{trigger_uuid}/builds

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Query parameters
Type Name Description Schema

query

limit
optional

The maximum number of builds to return

integer

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

manuallyStartBuildTrigger

Manually start a build from the specified trigger.

POST /api/v1/repository/{repository}/trigger/{trigger_uuid}/start

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Optional run parameters for activating the build trigger

Name Description Schema

branch_name
optional

(SCM only) If specified, the name of the branch to build.

string

commit_sha
optional

(Custom Only) If specified, the ref/SHA1 used to checkout a git repository.

string

refs
optional

(SCM Only) If specified, the ref to build.

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getBuildTrigger

Get information for the specified build trigger.

GET /api/v1/repository/{repository}/trigger/{trigger_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

updateBuildTrigger

Updates the specified build trigger.

PUT /api/v1/repository/{repository}/trigger/{trigger_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Request body schema (application/json)

Options for updating a build trigger

Name Description Schema

enabled
required

Whether the build trigger is enabled

boolean

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteBuildTrigger

Delete the specified build trigger.

DELETE /api/v1/repository/{repository}/trigger/{trigger_uuid}

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

trigger_uuid
required

The UUID of the build trigger

string

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listBuildTriggers

List the triggers for the specified repository.

GET /api/v1/repository/{repository}/trigger/

Authorizations: oauth2_implicit (repo:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

user

Manage the current user.

createStar

Star a repository.

POST /api/v1/user/starred

Authorizations: oauth2_implicit (repo:read)

Request body schema (application/json)
Name Description Schema

namespace
required

Namespace in which the repository belongs

string

repository
required

Repository name

string

Responses
HTTP Code Description Schema

201

Successful creation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

listStarredRepos

List all starred repositories.

GET /api/v1/user/starred

Authorizations: oauth2_implicit (user:admin)

Query parameters
Type Name Description Schema

query

next_page
optional

The page token for the next page

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getLoggedInUser

Get user information for the authenticated user.

GET /api/v1/user/

Authorizations: oauth2_implicit (user:read)

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

deleteStar

Removes a star from a repository.

DELETE /api/v1/user/starred/{repository}

Authorizations: oauth2_implicit (user:admin)

Path parameters
Type Name Description Schema

path

repository
required

The full path of the repository. e.g. namespace/name

string

Responses
HTTP Code Description Schema

204

Deleted

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

getUserInformation

Get user information for the specified user.

GET /api/v1/users/{username}

Authorizations: 

Path parameters
Type Name Description Schema

path

username
required

string

Responses
HTTP Code Description Schema

200

Successful invocation

400

Bad Request

401

Session required

403

Unauthorized access

404

Not found

Definitions

ApiError

Name Description Schema

status
optional

Status code of the response.

integer

type
optional

Reference to the type of the error.

string

detail
optional

Details about the specific instance of the error.

string

title
optional

Unique error code to identify the type of error.

string

error_message
optional

Deprecated; alias for detail

string

error_type
optional

Deprecated; alias for detail

string

UserView

Name Description Schema

verified
optional

Whether the user’s email address has been verified

boolean

anonymous
optional

true if this user data represents a guest user

boolean

email
optional

The user’s email address

string

avatar
optional

Avatar data representing the user’s icon

object

organizations
optional

Information about the organizations in which the user is a member

array of object

logins
optional

The list of external login providers against which the user has authenticated

array of object

can_create_repo
optional

Whether the user has permission to create repositories

boolean

preferred_namespace
optional

If true, the user’s namespace is the preferred namespace to display

boolean

ViewMirrorConfig

Name Description Schema

is_enabled
optional

Used to enable or disable synchronizations.

boolean

external_reference
optional

Location of the external repository.

string

external_registry_username
optional

Username used to authenticate with external registry.

external_registry_password
optional

Password used to authenticate with external registry.

sync_start_date
optional

Determines the next time this repository is ready for synchronization.

string

sync_interval
optional

Number of seconds after next_start_date to begin synchronizing.

integer

robot_username
optional

Username of robot which will be used for image pushes.

string

root_rule
optional

A list of glob-patterns used to determine which tags should be synchronized.

object

external_registry_config
optional

object

ApiErrorDescription

Name Description Schema

type
optional

A reference to the error type resource

string

title
optional

The title of the error. Can be used to uniquely identify the kind of error.

string

description
optional

A more detailed description of the error that may include help for fixing the issue.

string

API configuration examples

external_registry_config object reference

{
        "is_enabled": True,
        "external_reference": "quay.io/redhat/quay",
        "sync_interval": 5000,
        "sync_start_date": datetime(2020, 0o1, 0o2, 6, 30, 0),
        "external_registry_username": "fakeUsername",
        "external_registry_password": "fakePassword",
        "external_registry_config": {
            "verify_tls": True,
            "unsigned_images": False,
            "proxy": {
                "http_proxy": "http://insecure.proxy.corp",
                "https_proxy": "https://secure.proxy.corp",
                "no_proxy": "mylocalhost",
            },
        },
    }

rule_rule object reference

    {
            "root_rule": {"rule_kind": "tag_glob_csv", "rule_value": ["latest", "foo", "bar"]},
        }