Documentation
The Prowler Registry is a package registry for Prowler security checks and artifacts. It allows security teams to discover, install, and run security checks that extend Prowler’s capabilities across multiple cloud providers.
Getting Started
Overview
The Prowler Registry works like PyPI but is purpose-built for Prowler security artifacts. It implements the PEP 503 Simple Repository API, which means you can use standard Python tools like pip to install packages.
The registry hosts artifacts — Python wheel packages that contain one or more checks. Each check is a security rule that Prowler can execute against a cloud provider (AWS, Azure, GCP, M365, Kubernetes, and more).
The typical workflow is:
- Browse — find checks relevant to your cloud environment using the Checks page, filtered by provider, service, severity, or organization.
- Install — use
pip installwith the registry as an extra index URL to install the artifact packages. - Run — execute checks with the Prowler CLI. Installed artifacts are automatically discovered.
Browsing Checks
The Checks page is the main entry point for discovering security checks. Every individual check from every published artifact is listed as its own card.
Search
The search bar searches by check_id — the unique identifier for each check (e.g. s3_bucket_public_access). The header search bar also searches checks globally.
Filters
The left sidebar provides multi-select filters. You can combine multiple values within each filter (OR logic) and combine filters across categories (AND logic):
- Organization — filter by the publisher
- Provider — filter by cloud provider (AWS, Azure, GCP, etc.)
- Severity — filter by criticality level (Critical, High, Medium, Low, Informational)
- Service — filter by cloud service (S3, EC2, IAM, etc.)
The top filter bar provides mutually exclusive type filters and an independent Verified toggle.
Check Detail
Click on a check to view its full detail page. The detail page shows:
- Full description and risk assessment
- Severity, service, categories, and resource type
- CLI install and run commands with copy buttons
- Recommendation text with links
- Remediation instructions — CLI, Terraform, and step-by-step guides
- Reference URLs to vendor documentation
Interactive Filters
On each check card, the provider logo, service badge, and severity badge are clickable — clicking them toggles the corresponding filter.
Providers
Providers represent cloud platforms and technologies that checks can target. Examples include AWS, Azure, GCP, Kubernetes, M365, Docker Desktop, and more. Browse all providers at /providers.
Each provider card shows the number of checks and packages available for that platform. Click on a provider to see all checks filtered by that provider.
Installing Artifacts
Artifacts are standard Python wheel packages. Install them using pip with the registry as an extra index URL:
pip install --extra-index-url https://registry.prowler.com/simple/ "<package-name>[runtime]"To avoid typing the URL every time, configure it permanently in your pip.conf (Linux/macOS: ~/.config/pip/pip.conf, Windows: %APPDATA%\\pip\\pip.ini):
[global]
extra-index-url = https://registry.prowler.com/simple/Then simply:
pip install "<package-name>[runtime]"Private Artifacts
Public artifacts are available without authentication. Private artifacts require an API key with download scope:
pip install --extra-index-url https://__token__:YOUR_API_KEY@registry.prowler.com/simple/ "<package-name>[runtime]"Version Pinning
You can pin to specific versions like any pip package:
pip install "<package-name>[runtime]==1.2.0"
pip install "<package-name>[runtime]>=1.0,<2.0"Running Checks
Once artifacts are installed, Prowler automatically discovers them via Python entry points. Run specific checks by their check_id:
# Run a single check
prowler aws --checks s3_bucket_public_access
# Run multiple checks
prowler aws --checks s3_bucket_public_access,ec2_instance_public_ip
# Run all checks for a service
prowler aws --services s3Publishing
Publishing Artifacts
To publish artifacts you need an API key with upload scope. Upload Python wheel files (.whl) using twine or uv:
# Using twine
twine upload --repository-url https://registry.prowler.com/simple/ \
-u __token__ -p YOUR_API_KEY dist/*
# Using uv
uv publish --publish-url https://registry.prowler.com/simple/ \
--token YOUR_API_KEY.whl (wheel) files are accepted. Tarballs (.tar.gz) and other formats are rejected with a 400 error.Processing Pipeline
After upload, packages are processed asynchronously:
- File is stored in S3 and the version is created with
pendingstatus - A background worker extracts PEP 658 metadata from the wheel
- The worker validates the artifact scaffolding and metadata inside the wheel
- If valid, the version moves to
processedand checks become visible - If invalid, the version moves to
invalidwith arejection_reason
New Providers
If your package references a provider that does not exist in the registry, the provider is automatically created with pending status. The package will be rejected until the registry owner reviews and accepts the new provider. Once accepted, re-upload the package and it will be processed normally.
Re-uploading
If a version is rejected, you can fix the issue and re-upload the same version. The old rejected version is replaced. If a version is already processed, re-uploading the same version returns a 409 Conflict.
Registry
Authentication & API Keys
The registry uses API keys for authentication. All authenticated requests use HTTP Basic Auth with __token__ as the username and the API key as the password.
# Using curl
curl -u __token__:prr_YOUR_KEY https://registry.prowler.com/api/v1/whoami/
# Using pip (for private packages)
pip install --extra-index-url https://__token__:prr_YOUR_KEY@registry.prowler.com/simple/ "<package-name>[runtime]"
# Using twine (for uploads)
twine upload --repository-url https://registry.prowler.com/simple/ \
-u __token__ -p prr_YOUR_KEY dist/*Key Types
When creating an API key, you choose between Upload or Download type.
Package Types
Every package in the registry has a type based on the organization that published it:
- Official — published by the registry owner
Additionally, package versions can be marked as Verified, indicating they have passed additional quality checks. This creates sub-types like “Official Verified” that download keys can target specifically.
Upload Keys
Upload keys allow publishing artifacts to the registry. You select the visibility of the packages you want to publish:
upload:public— publish public artifacts visible to everyoneupload:private— publish private artifacts restricted to authorized users
Download Keys
Download keys grant access to private artifacts. You select which package types the key can download:
download:official— download private official artifactsdownload:official-verified— download only verified official artifactsdownload:all— download all private artifacts regardless of type
Key Management
Manage your API keys at Settings > API Keys. You can create keys with specific scopes, set expiration dates, and revoke them. All API keys start with the prefix prr_.
Organizations
Organizations are the publishers on the registry. Every package belongs to an organization, and each organization has a type that determines its trust level and capabilities.
Organization Types
- Official — the registry owner. Official checks carry the highest trust level and are shown with a primary-colored badge.
Verified Packages
Package versions can be marked as Verified, indicating they have passed additional quality checks. The organization card shows the ratio of verified packages to total packages.
Browse all organizations at /orgs. Each org profile shows its packages, total checks, download statistics, and all published artifacts.
Customers
Customers are enterprise users who create accounts to download private artifacts from the registry. The customers feature enables self-service sign-up and download key management.
Customer Sign Up
- Register — go to /register/customer and create an account with name, email, password, and optional company name.
- Login — sign in at /login with email and password.
- Create download keys — from the customer dashboard, create API keys selecting which package types to access (Official, and their Verified variants).
- Install private artifacts — use the download key with pip:
pip install --extra-index-url https://__token__:YOUR_KEY@registry.prowler.com/simple/ "<package-name>[runtime]"
Customer Dashboard
At /customer, customers can:
- Create new download API keys with specific scope selections
- View all existing keys with their scopes and last usage
- Revoke keys that are no longer needed
Administration
The registry owner manages customers from Settings > Customers. From there the owner can view all registered customers, activate or deactivate accounts, and revoke individual keys.
Bundles
Bundles are curated collections of private packages grouped together for convenient distribution. They allow organizations to offer sets of checks as a single logical unit — for example, a “CIS AWS Benchmark” bundle containing all the checks needed for that compliance framework.
Bundle Lifecycle
- Draft — the organization creates a bundle from Settings > Bundles, selecting which private packages to include. Draft bundles are not publicly visible.
- Deployed — the organization deploys the bundle, making it visible on the public /bundles page. Customers can browse and request access.
- Archived — the organization can archive a bundle to remove it from active listings while preserving its history.
Browsing Bundles
The /bundles page lists all deployed bundles. Each bundle card shows the publishing organization, number of included packages, and a description. Click on a bundle to see its full detail including the list of included packages.
Requesting Access
Customers can request access to a bundle from its detail page. The request goes to the bundle's organization for approval. Once approved, the customer's download keys gain access to all packages in the bundle.
Access request status is shown on the bundle card: Pending, Approved, or Denied.
Managing Bundles
Owner and partner organizations manage bundles from Settings > Bundles:
- Create — give the bundle a name, description, and select which private packages to include
- Deploy — publish the bundle so it appears on the public /bundles page
- Archive — remove a deployed bundle from active listings
Approving Access Requests
When a customer requests access to a deployed bundle, the request appears in the bundle's detail page under Settings > Bundles. The organization can:
- Approve — the customer's download keys gain access to all packages in the bundle
- Deny — the request is rejected and the customer is notified
Pending requests are highlighted with a badge count in the navigation bar for quick visibility.
API Reference
REST API
The registry exposes a JSON:API-compliant REST API. All endpoints accept and return application/vnd.api+json content type.
Public Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/v1/health/ | Health check |
| GET | /api/v1/checks/ | List checks with filtering, sorting, and pagination |
| GET | /api/v1/checks/:provider/:id/ | Check detail with remediation |
| GET | /api/v1/compliances/ | List compliance frameworks |
| GET | /api/v1/compliances/:provider/:id/ | Compliance detail with requirements |
| GET | /api/v1/providers/ | List registered providers |
| GET | /api/v1/stats/ | Registry-wide statistics |
| GET | /api/v1/flags/ | List feature flags |
| GET | /api/v1/packages/ | List packages |
| GET | /api/v1/packages/:id/ | Package detail with versions |
| GET | /api/v1/packages/:id/downloads/ | Package download stats |
| GET | /api/v1/organizations/ | List organizations |
| GET | /api/v1/organizations/:id/downloads/ | Organization download stats |
| GET | /api/v1/bundles/ | List deployed bundles |
| GET | /api/v1/bundles/:id/ | Bundle detail with packages |
| POST | /api/v1/customers/register/ | Customer sign up |
| POST | /api/v1/customers/login/ | Customer login |
Authenticated Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/auth/login/ | Login with API key |
| POST | /api/v1/auth/refresh/ | Refresh JWT access token |
| GET | /api/v1/me/ | Current authenticated user info |
| GET | /api/v1/keys/ | List your API keys |
| POST | /api/v1/keys/ | Create a new API key |
| POST | /api/v1/providers/ | Create a provider (owner only) |
| PUT | /api/v1/providers/:id/logo/ | Upload provider logo (owner only) |
| PUT | /api/v1/organizations/:id/logo/ | Upload organization logo |
| DELETE | /api/v1/organizations/:id/logo/ | Delete organization logo |
| PATCH | /api/v1/packages/:id/versions/:vid/ | Yank/unyank a version |
| PUT | /api/v1/flags/:slug/ | Toggle feature flag (owner only) |
| POST | /api/v1/bundles/ | Create a bundle |
| PATCH | /api/v1/bundles/:id/ | Update bundle (deploy/archive) |
| DELETE | /api/v1/bundles/:id/ | Delete a bundle |
| GET | /api/v1/grants/ | List access grants |
| GET | /api/v1/customers/me/ | Customer profile (customer auth) |
| POST | /api/v1/customers/keys/ | Create download key (customer auth) |
| POST | /api/v1/customers/keys/:id/revoke/ | Revoke key (customer auth) |
| GET | /api/v1/customers/ | List customers (owner only) |
| GET | /api/v1/customers/:id/ | Customer detail (owner only) |
| POST | /api/v1/customers/:id/keys/:kid/revoke/ | Revoke customer key (owner only) |
| POST | /api/v1/customers/bundles/:id/request/ | Request bundle access (customer) |
| GET | /api/v1/bundles/:id/requests/ | List access requests (owner) |
| POST | /api/v1/bundles/:id/requests/:rid/approve/ | Approve request |
| POST | /api/v1/bundles/:id/requests/:rid/deny/ | Deny request |
Full interactive API documentation with request/response examples is available at API Docs.
PEP 503 (pip/twine)
The registry implements the PEP 503 Simple Repository API for full compatibility with pip and twine:
| Method | Endpoint | Description |
|---|---|---|
| GET | /simple/ | Package index (lists all package names) |
| GET | /simple/:name/ | Package detail (lists all versions with download links) |
| POST | /simple/ | Upload a package (twine/uv, requires auth) |
Downloads of public packages use presigned S3 URLs (302 redirect) for efficient direct-from-storage delivery. Private package downloads require HTTP Basic Auth with an API key.
Package names follow PEP 503 normalization — names are lowercased with hyphens, dots, and underscores normalized to hyphens.
Filtering & Sorting
All list endpoints follow the JSON:API filtering convention. Filters use the filter[field] query parameter syntax, pagination uses page[number] and page[size], and sorting uses the sort parameter with - prefix for descending order.
Common Parameters
| Parameter | Description |
|---|---|
| filter[field] | Filter by field value. Multiple values comma-separated for OR (e.g. filter[provider]=aws,azure). |
| filter[search] | Text search (partial match, case-insensitive). Available on checks and packages. |
| sort | Sort by field. Prefix with - for descending (e.g. sort=-created_at). |
| page[number] | Page number (1-indexed). |
| page[size] | Items per page (default varies by endpoint, max 100). |
Available Filters by Endpoint
| Endpoint | Filters |
|---|---|
| /checks/ | provider, service, severity, org, type, verified, search |
| /compliances/ | provider, search |
| /providers/ | status |
| /packages/ | name, owner_type, search |
| /organizations/ | type, slug, search |
| /bundles/ | owner_type, provider, org, search |
Response Metadata
List responses include a meta object with pagination info and, for some endpoints, aggregated filter counts (e.g. available_providers, available_severities) that can be used to build dynamic filter UIs.
Example
# Filter checks by provider and severity
curl "https://registry.prowler.com:8000/api/v1/checks/?filter[provider]=aws&filter[severity]=critical&sort=check_id&page[size]=10" \
-H "Accept: application/vnd.api+json"