Vertra Cloud Python SDK
Official Python SDK for the Vertra Cloud public API: apps, databases, snapshots, account, workspaces and billing — one typed method per route.
- Python 3.10+, fully typed (
py.typed), withTypedDictpayloads. - Zero dependencies outside the standard library.
- No hidden retries, caching or state: errors come back as they happened.
Installation
pip install vertracloud-api
Getting an API key
Sign in to the dashboard, open Settings → API keys and create a key with only the scopes your code needs (e.g. apps:read, apps:write). Keep it out of your source code — the examples read it from VERTRA_API_KEY.
Quick start
import os
from vertracloud import VertraClient
client = VertraClient(api_key=os.environ["VERTRA_API_KEY"])
me = client.account.get()
print(f"Hi {me['name']}! Plan: {me['plan']['name']}")
for app in me["applications"]:
print(app["id"], app["name"], app["status"])
Documentation
- Guide: docs.vertracloud.app/sdks
- API reference and scopes: docs.vertracloud.app/api-reference
Every method has a docstring with its HTTP route and the API key scope it needs.
Usage
Client options
client = VertraClient(
api_key=os.environ["VERTRA_API_KEY"],
timeout=10, # seconds, default 30 per call
# base_url, user_agent and a custom transport are also accepted
)
Per-call options
Methods on apps and databases take a keyword-only workspace_id; downloads, uploads and streams also take timeout:
# Act on a resource that belongs to a workspace
app = client.apps.get(app_id, workspace_id=workspace_id)
# Give one slow call more time
zip_bytes = client.apps.download(app_id, timeout=300)
Nested resources are attributes: client.apps.deploys, client.apps.envs, client.workspaces.members, client.billing.orders, …
Apps
app = client.apps.get(app_id)
client.apps.restart(app_id) # normal restart
client.apps.restart(app_id, {"reinstall_dependencies": True})
metrics = client.apps.metrics(app_id, range="24h")
logs = client.apps.logs(app_id)
Uploading and downloading
Uploads take bytes; downloads return bytes.
with open("app.zip", "rb") as f:
app = client.apps.create({"name": "my-app", "memory": 512}, file=f.read())
with open("backup.zip", "wb") as f:
f.write(client.apps.download(app_id))
client.snapshots.download works the same way.
Realtime logs (SSE)
stream = client.apps.realtime(app_id)
try:
for event in stream:
print(event.event, event.data)
finally:
stream.close()
Stop the stream with break or stream.close(). Pass since= to resume. There is no automatic reconnection.
Errors
Every non-2xx response raises a VertraAPIError carrying the HTTP status, the API code (e.g. APP_NOT_FOUND) and details; str(err) includes the message. The API key is never part of the error, even when it is printed:
from vertracloud import NotFoundError, RateLimitError, VertraAPIError
try:
client.apps.get(app_id)
except NotFoundError:
... # 404
except RateLimitError as err:
print("retry after", err.retry_after, "s")
except VertraAPIError as err:
print(err.status, err.code, err)
Other subclasses: AuthenticationError (401), ScopeDeniedError (403 — including a missing key scope) and ValidationError (400/422). The error codes are listed in the API reference.
Testing your code
Pass your own vertracloud.Transport to the client to answer requests without touching the network:
client = VertraClient(api_key="test", transport=my_fake_transport)
Coverage
| Domain | Resource | Routes |
|---|---|---|
| Apps | client.apps (+ .deploys, .network, .envs, .files) |
36 |
| Databases | client.databases (+ .credentials) |
13 |
| Snapshots | client.snapshots |
5 |
| Account | client.account (+ .sessions, .folders, .favorites) |
10 |
| Workspaces | client.workspaces (+ .members, .roles, .invites, .action_requests, .apps, .databases, .folders, .favorites) |
30 |
| Billing | client.billing (+ .orders) |
5 |
Dashboard-only features (activity log, notifications, API key management, the database Data tab, plan downgrade, creating workspace invites, transferring workspace ownership and approving action requests) are not part of the public API. See what an API key cannot do.
Versioning
The SDK follows semantic versioning. Until 1.0.0, minor releases may contain breaking changes; they are always called out in the changelog.
Contributing
Issues and pull requests are welcome. Before sending a change, run:
pip install -e ".[dev]"
ruff check . && ruff format --check . && mypy src && python -m pytest -q
License
Metadata
Release files for vertracloud-api 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vertracloud_api-0.1.2.tar.gz | 62.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vertracloud_api-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.8 kB
Release files / vertracloud_api-0.1.2.tar.gz
| Download URL | vertracloud_api-0.1.2.tar.gz |
|---|---|
| Size | 62.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b28418fef58f98a945e2090f243c742c2606333b5bb134e330d1406690ee9755
|
|
BLAKE2b-256 checksum How to use checksums |
b768759ae6cbb7b79ef20c490294f478e7fe9b50443e3de20e6183f395a1dade
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / vertracloud_api-0.1.2-py3-none-any.whl
| Download URL | vertracloud_api-0.1.2-py3-none-any.whl |
|---|---|
| Size | 23.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
633f4b5b502d87a71d506636fa1aea70692cd5216ce60852a12602595efde55c
|
|
BLAKE2b-256 checksum How to use checksums |
b2003c58b3d31a41e90d15e098b1f703bc80644f7314d7a3c866815aacf35ec8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency log