Add-ons
Add-ons are managed services (databases, caches, etc.) you provision and attach to apps. Use this resource for CRUD, lifecycle, backups, scheduling, and connecting/disconnecting apps.
Access it as client.addons on a Strongly client, or the same path on AsyncStrongly with await. All methods exist on both with identical signatures.
Quick start
from strongly import Strongly
client = Strongly()
# List (auto-paginates as you iterate) # filters: search, type, status
for add-on in client.addons.list():
print(add-on.id)
Methods
Core
list
list(*, search: str | None = None, type: str | None = None, status: str | None = None, limit: int | None = None) -> SyncPaginator[Addon]
List the add-ons you can use, with pagination and filtering.
Passwords and connection strings are never included; use
credentials.
Parameters
search(str | None, optional): Case-insensitive match on label, description or type.type(str | None, optional): Filter by addon type (e.g."postgres","redis").status(str | None, optional): Filter by status (e.g."running","stopped","error").limit(int | None, optional): Maximum number of items to return (default: all matching items).
create
create(*, label: str, type: str, cpu: str, memory: str, disk: str, description: str | None = None, version: str | None = None, gpu: str | None = None, gpu_type: str | None = None, deployment_mode: str | None = None, cluster_config: Mapping[str, Any] | None = None, backup_config: Mapping[str, Any] | None = None) -> Addon
Create an add-on. It deploys in the background.
The add-on runs at exactly the size given; nothing is assumed. A size
that is not positive, below the type's minimum memory or larger than the
biggest available node (see sizing) raises ValidationError.
The returned add-on is "requested" until the platform accepts its
deploy, then "deploying"; poll retrieve
until status == "running" before reading credentials.
Creation is checked against your budgets and fails with the budget's
reason when a budget blocks it.
Parameters
label(str): Display name, unique within your organization.type(str): Addon type, e.g.postgres,mysql,mongodb,redis,rabbitmq,neo4j,milvus,greenplum,surrealdb,kafka,mqtt(seelist_types). Use"postgres", not"postgresql".cpu(str): vCPU per node, e.g."0.25","1"or"500m".memory(str): Memory per node, e.g."2GB"or"512MB"(a bare number is GB); at least the type's minimum.disk(str): Persistent storage per node, e.g."10GB".description(str | None, optional): Free-text description.version(str | None, optional): Engine version, e.g."18"for postgres; omit for the default.gpu(str | None, optional): Number of GPUs as a string, e.g."1".gpu_type(str | None, optional): GPU type whengpuis set, e.g."nvidia-t4".deployment_mode(str | None, optional):"single"(default) or"cluster". Cluster mode is available formongodb,milvus(2.6 or later) andgreenplum.cluster_config(Mapping[str, Any] | None, optional): Cluster settings whendeployment_mode="cluster":dataNodes,replicationFactor,arbiterEnabled(mongodb),coordinatorNodes(greenplum).backup_config(Mapping[str, Any] | None, optional):{"enabled": bool, "schedule": "hourly"|"daily"|"weekly"|"monthly", "retention": int}.
retrieve
retrieve(addon_id: str) -> Addon
Get one add-on by ID (without its password or connection string).
update
update(addon_id: str, *, label: str | None = None, description: str | None = None, cpu: str | None = None, memory: str | None = None, disk: str | None = None) -> Addon
Rename an add-on, change its description, or resize it.
Resizing (per node for a cluster) is checked against your budgets.
Changing cpu or memory restarts the add-on onto the new size;
disk grows its data volumes while it runs and can never be reduced
(a smaller disk raises ValidationError). Memory must be at least the
type's minimum.
Parameters
label(str | None, optional): New display name, unique within your organization.description(str | None, optional): New description.cpu(str | None, optional): CPU cores, e.g."1"or"500m".memory(str | None, optional): Memory, e.g."2GB".disk(str | None, optional): Disk, e.g."20GB"; at least the current size.
delete
delete(addon_id: str) -> None
Delete an add-on and all of its data.
Refused while the add-on is connected to an app, bound by a feature store, attached to an agent or referenced by a workflow.
Lifecycle & actions
start
start(addon_id: str) -> Addon
Start a stopped add-on. Checked against your budgets.
stop
stop(addon_id: str) -> Addon
Stop a running add-on. Its data is kept.
restart
restart(addon_id: str) -> Addon
Restart an add-on. Checked against your budgets.
recover
recover(addon_id: str) -> Addon
Redeploy an add-on that is in the error state.
restore
restore(addon_id: str, backup_id: str) -> AddonRestore
Restore one of the add-on's succeeded backups into it; returns restore_id.
Everything the add-on holds is replaced by what the backup holds:
data written after the backup is lost. The add-on keeps running while
it restores (list_backups(addon_id).restore_effect says what its
clients see). The restore runs in the background; follow it in
list_backups(addon_id).restores. Refused if the add-on is not
running, the backup is not a succeeded backup of this add-on, or a
backup or restore of the add-on is in progress.
Parameters
addon_id(str): The add-on to restore into.backup_id(str): Thebackup_idof a succeeded backup of this add-on.
Other
add_member
add_member(resource_id: str, *, user_id: str, role: str) -> Permissions
Share the resource with a user.
Parameters
resource_id(str): The resource's id.user_id(str): The user to share it with.role(str):"editor"(use and change it) or"user"(use it only; types without a use-only tier, such as knowledge bases, take"editor"only).
backup
backup(addon_id: str) -> AddonBackup
Start a backup of the running add-on now; returns backup_id.
The backup runs in the background; its outcome (succeeded with
size_bytes, or failed with error) appears in
retrieve(addon_id).backups. Raises UnprocessableEntityError if the
add-on is not running or a backup is already in progress.
connect_app
connect_app(addon_id: str, app_id: str) -> Addon
Connect an add-on to an app you can edit.
The app receives the add-on's connection details in its
STRONGLY_SERVICES environment variable on its next deploy.
credentials
credentials(addon_id: str) -> AddonCredentials
Get the decrypted connection details.
(host, port, username, password, database, connection string). Called from a workspace, the add-on must be attached to that workspace (a workspace reaches only the services it is attached to): otherwise the call is refused (409) with how to attach it.
disconnect_app
disconnect_app(addon_id: str, app_id: str) -> dict[str, Any]
Disconnect an add-on from an app.
list_backups
list_backups(addon_id: str) -> AddonBackups
Return the add-on's backup settings, backups and restores, newest first.
Each backup carries its status (starting, in_progress, succeeded,
failed or skipped), size_bytes and error or reason; each
restore carries the backup_id it restored, its status
(starting, in_progress, succeeded or failed) and error.
restore_effect says what a restore replaces and what running
clients see meanwhile.
Parameters
addon_id(str): The add-on.
list_types
list_types() -> list[AddonType]
List the add-on types you can create, with what each is for.
Returns the platform catalog (GET /addon-types): each entry's
type is the value to pass as type to create.
logs
logs(addon_id: str, *, lines: int | None = None, since: str | None = None, container: str | None = None) -> list[AddonLogEntry]
Get recent log lines, oldest first. Empty once a stopped add-on's container is gone.
Parameters
addon_id(str): The addon ID.lines(int | None, optional): Number of most recent lines, 1-1000 (default 100).since(str | None, optional): ISO 8601 timestamp; only lines logged at or after it.container(str | None, optional): Container name, for add-ons with more than one container.
metrics
metrics(addon_id: str) -> AddonMetrics
Measure the running add-on now (takes about 6 seconds).
Returns CPU, memory, disk, network throughput, connections, native
response time and instance health; see AddonMetrics. Raises
ConflictError (409) when the add-on is not running.
permissions
permissions(resource_id: str) -> Permissions
Return who can reach the resource: its owner, members and their roles, and visibility.
Parameters
resource_id(str): The resource's id.
remove_member
remove_member(resource_id: str, user_id: str) -> None
Stop sharing the resource with a user.
Parameters
resource_id(str): The resource's id.user_id(str): The user to stop sharing it with.
schedule
schedule(addon_id: str) -> dict[str, Any]
Get the add-on's automatic start/stop schedule.
set_visibility
set_visibility(resource_id: str, visibility: str) -> Permissions
Make the resource public (every user can find and use it) or private.
Parameters
resource_id(str): The resource's id.visibility(str):"public"or"private".
sizing
sizing() -> list[AddonNodeSize]
List the node sizes an add-on can be placed on, smallest first.
The add-on lands on the smallest one that fits it, and a size larger than the biggest is refused.
status
status(addon_id: str) -> dict[str, Any]
Refresh and return the add-on's live status.
Returns {"status": ..., "message": ..., "details": {...}} and
updates the stored status.
update_backup_config
update_backup_config(addon_id: str, *, enabled: bool, schedule: str, retention: int) -> Addon
Update the add-on's backup settings.
Parameters
enabled(bool): Whether automatic backups are enabled.schedule(str):"hourly","daily","weekly"or"monthly".retention(int): Number of successful backups to keep (at least 1); applies to manual and scheduled backups.
update_schedule
update_schedule(addon_id: str, *, enabled: bool, timezone: str, start_time: str, stop_time: str, days_of_week: Sequence[int], skip_holidays: bool | None = None, holiday_calendar: str | None = None) -> dict[str, Any]
Replace the add-on's automatic start/stop schedule.
Parameters
enabled(bool): Enable or disable the schedule.timezone(str): IANA timezone (e.g."America/New_York").start_time(str): Start time inHH:MM(24-hour) format.stop_time(str): Stop time inHH:MM(24-hour) format.days_of_week(Sequence[int]): Days to run, 1 (Monday) through 7 (Sunday).skip_holidays(bool | None, optional): Stay stopped on holidays (default false).holiday_calendar(str | None, optional):"us","uk"or"none".