Addons
Create and manage add-ons: managed databases, caches, message queues and vector stores that run on the platform for your apps, workspaces and workflows. See Managed Add-ons for what each type offers.
All endpoints require authentication with the X-API-Key header. Each endpoint lists the scope it needs:
| Scope | Grants |
|---|---|
addons:read | List and read add-ons, their types, status, credentials, metrics, logs, schedule, backups and restores |
addons:write | Create, rename, delete, back up, restore, share, connect to apps, and set schedules and backup settings |
addons:deploy | Start, stop, restart and recover |
Base URL: https://<your-instance>/api/v1
Addon Object
{
"_id": "addon-kheofh2erh",
"label": "orders-cache",
"type": "redis",
"description": "Session and cart cache",
"version": "7.4",
"status": "running",
"errorMessage": null,
"cpu": "0.5",
"memory": "1GB",
"disk": "1GB",
"deploymentMode": "single",
"clusterConfig": null,
"connectionInfo": {
"host": "<internal-host>",
"internalHost": "<internal-host>",
"port": 6379,
"username": "user_4s8cc3jc"
},
"connectedApps": [],
"backupConfig": { "enabled": true, "schedule": "daily", "retention": 7, "nextBackup": "2026-09-24T02:44:00Z", "lastBackup": "2026-09-23T02:44:05Z" },
"backups": [
{
"backupId": "backup-20260923024400-a1b2c3",
"trigger": "scheduled",
"status": "succeeded",
"startedAt": "2026-09-23T02:44:00Z",
"completedAt": "2026-09-23T02:44:05Z",
"sizeBytes": 18432,
"objectCount": 1,
"location": "s3://<backup-storage>/.../backup-20260923024400-a1b2c3/"
}
],
"scheduleConfig": {
"enabled": false,
"timezone": "America/New_York",
"startTime": "09:00",
"stopTime": "17:00",
"daysOfWeek": [1, 2, 3, 4, 5],
"skipHolidays": false,
"holidayCalendar": "none"
},
"permissions": { "isPublic": false, "allowedUsers": [] },
"owner": "okRpaKPh8B9asdKb2",
"organizationId": "org-acme-1a2b3c",
"createdAt": "2026-09-23T02:44:18.660Z",
"updatedAt": "2026-09-23T02:47:40.201Z"
}
| Field | Description |
|---|---|
_id | Add-on ID (addon- followed by 10 characters) |
label | Display name, unique within your organization |
type | One of the types from GET /addon-types |
status | See Statuses |
errorMessage | Why the add-on is in error (or why a start was refused); null otherwise |
platformUpdatePending | true while the running add-on has probe or server-setting changes from a platform update that its next start or restart applies; absent otherwise. See Platform Updates |
cpu, memory, disk | Current size (per node for a cluster). Change it with PATCH /addons/:id |
gpu, gpuType | GPU count and type, present only when requested at creation |
deploymentMode | single or cluster |
connectionInfo | Non-secret connection details. The password and connection string are never included; read them from /credentials |
connectedApps | IDs of apps the add-on is connected to |
backupConfig | Backup settings: enabled, schedule, retention; nextBackup (next automatic run) and lastBackup (last successful backup) |
backups | Backup history, newest kept up to retention: backupId, trigger (manual or scheduled), status (starting, in_progress, succeeded, failed, skipped), startedAt, completedAt, sizeBytes, location, and error or reason when it did not succeed |
restores | Restore history: restoreId, backupId (the backup restored), status (starting, in_progress, succeeded, failed), startedAt, completedAt, and error when it failed |
scheduleConfig | Automatic start/stop window, present once a schedule has been saved |
permissions | isPublic (everyone in the organization may use it) and allowedUsers (user IDs who may use and manage it) |
Statuses
| Status | Meaning |
|---|---|
requested | Created; its deploy has not been accepted yet |
deploying | Being created, or started and not yet accepting connections |
starting | A start or restart was accepted and the add-on is coming up |
running | Accepting connections |
stopping | A stop was accepted |
stopped | Not running. Data is kept |
error | Deployment or runtime failure; errorMessage says why. Use recover |
pending_delete | Deletion accepted; the add-on disappears once its resources are removed |
The platform keeps status current from the add-on's live state (checked every few seconds), so a list or get always reflects what the add-on is doing without calling /status.
GET /api/v1/addon-types
List the add-on types you can create, with what each is for.
Scope: addons:read
Response 200 OK
{
"data": [
{
"type": "postgres",
"label": "PostgreSQL",
"kind": "relational database",
"useCase": "Tables with fixed columns, joins, SQL queries, transactions and reporting - structured/tabular data.",
"supportsCluster": false
},
{
"type": "mongodb",
"label": "MongoDB",
"kind": "document store",
"useCase": "Save records whole with no fixed columns/schema - good for varied, evolving, or nested data and \"just save whatever comes in\".",
"supportsCluster": true
}
],
"meta": { "requestId": "..." }
}
The types are mongodb, postgres, mysql, redis, rabbitmq, neo4j, milvus, greenplum, surrealdb, kafka and mqtt. Use postgres, not postgresql.
GET /api/v1/addons/sizing-options
List the node sizes an add-on can be placed on, smallest first. This is the list the Create Add-on and Resize forms use to show the largest size you can enter.
An add-on runs on the smallest node that fits its CPU and memory plus its small platform containers (a metrics container on every add-on, and for Milvus its etcd, MinIO and auth containers). A size larger than the biggest node is refused. A cluster add-on uses one node per data node. What an add-on costs is shown in FinOps only.
Scope: addons:read
Response 200 OK
{
"data": [
{ "name": "small", "cpuMillicores": 1800, "memoryMi": 3072 },
{ "name": "medium", "cpuMillicores": 3500, "memoryMi": 7168 },
{ "name": "large", "cpuMillicores": 7000, "memoryMi": 15360 }
],
"meta": { "requestId": "..." }
}
| Field | Meaning |
|---|---|
name | Node size, as chosen for the add-on pool in Compute settings |
cpuMillicores, memoryMi | What the node can give to workloads |
GET /api/v1/addons
List the add-ons you can use: your own, those shared with you, and those shared with your whole organization.
Scope: addons:read
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | Case-insensitive match on label, description or type | |
type | string | Filter by type, e.g. postgres | |
status | string | Filter by status, e.g. running | |
limit | number | 50 | Page size |
cursor | string | meta.nextCursor of the previous page; omit for the first page |
Response 200 OK
{
"data": [ { "_id": "addon-kheofh2erh", "label": "orders-cache", "type": "redis", "status": "running", "...": "..." } ],
"meta": { "total": 1, "limit": 50, "nextCursor": null, "requestId": "..." }
}
Each item is an Addon Object. The total is also returned in the X-Total-Count header.
POST /api/v1/addons
Create an add-on. The response returns as soon as the add-on is recorded; it is requested until its deploy is accepted, then deploys in the background with status deploying. Poll GET /addons/:id until status is running before connecting.
The add-on runs at exactly the cpu, memory and disk given: there are no tiers, presets or defaults. It is placed on the smallest node that fits it; GET /addons/sizing-options lists those nodes. Creation is refused only when a budget that covers it is spent to its pause limit or, with billing on, the organization has no credits left; nothing is estimated. When a budget blocks it, the request fails with 402 and the budget's reason, and nothing is created. If a budget blocks the deployment after creation, the add-on is left stopped with the reason in errorMessage.
Scope: addons:write
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | Display name, unique within your organization |
type | string | Yes | Add-on type from GET /addon-types |
cpu | string | Yes | vCPU per node, e.g. "0.25", "1", "500m" |
memory | string | Yes | Memory per node, e.g. "2GB", "512MB"; a bare number is GB. At least the type's minimum |
disk | string | Yes | Persistent storage per node, e.g. "10GB"; a bare number is GB |
description | string | No | Free text |
version | string | No | Engine version, e.g. "18" for PostgreSQL. Omit for the type's default. See each type's page for versions |
deploymentMode | string | No | single (default) or cluster. Cluster mode is available for mongodb, milvus (version 2.6 or later) and greenplum |
clusterConfig | object | No | With cluster: dataNodes (3-10), replicationFactor (1-10; for Milvus, the number of in-memory copies of each loaded collection), arbiterEnabled (MongoDB), coordinatorNodes (Greenplum, 1-5) |
gpu | string | No | Number of GPUs, e.g. "1" |
gpuType | string | No | GPU type when gpu is set, e.g. "nvidia-t4" |
backupConfig | object | No | enabled (boolean), schedule (hourly, daily, weekly, monthly), retention (number of backups to keep) |
curl -X POST "https://<your-instance>/api/v1/addons" \
-H "X-API-Key: $STRONGLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"label": "orders-db", "type": "postgres", "cpu": "1", "memory": "2GB", "disk": "20GB", "version": "18"}'
Response 201 Created
The new addon, status requested (its credentials are not in it).
Errors
| Status | Code | When |
|---|---|---|
400 | validation-error | A required field is missing, the type is not supported (the message lists the valid types), cluster mode was requested for a type (or Milvus version) that does not support it, or the size is not positive, below the type's minimum memory, or larger than the biggest node your organization's add-on pool provides |
402 | payment-required | A budget blocks the launch; the message is the budget's reason |
403 | forbidden | You do not belong to an organization |
409 | duplicate | An add-on with this label already exists in your organization |
GET /api/v1/addons/:id
Get one add-on.
Scope: addons:read
Response 200 OK
{ "data": <Addon Object>, "meta": {...} }. Returns 404 if the add-on does not exist or you cannot use it.
PATCH /api/v1/addons/:id
Rename an add-on, change its description, or resize it.
A resize applies to the running add-on (per node for a cluster):
- CPU and memory: the add-on restarts onto the new size and is briefly unavailable while it does; its data is kept. It runs at exactly the size given. Memory must be at least the type's minimum (64 MB for MQTT, 256 MB for Redis and SurrealDB, 512 MB for PostgreSQL and RabbitMQ, 768 MB for MySQL, 1 GB for MongoDB, Neo4j, Milvus, Greenplum and Kafka).
- Disk: the data volume grows while the add-on keeps running. Disk can only grow; a smaller value is refused.
A resize is checked against your budgets like a start. A stopped add-on can be resized; it starts at the new size.
Scope: addons:write. You must own the add-on or be one of its allowed users.
Request Body
| Field | Type | Description |
|---|---|---|
label | string | New display name, unique within your organization |
description | string | New description |
cpu | string | New CPU cores, e.g. "1" or "500m" |
memory | string | New memory, e.g. "2GB" |
disk | string | New disk, e.g. "20GB"; at least the current size |
curl -X PATCH "https://<your-instance>/api/v1/addons/addon-kheofh2erh" \
-H "X-API-Key: $STRONGLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cpu": "1", "memory": "2GB", "disk": "20GB"}'
Response 200 OK
The updated Addon Object, with the new size recorded.
Errors
| Status | Code | When |
|---|---|---|
400 | validation-error | An unsupported field, memory below the type's minimum, or a smaller disk |
402 | payment-required | A budget blocks the new size |
409 | duplicate | The label is already in use in your organization |
DELETE /api/v1/addons/:id
Delete an add-on and all of its data. This cannot be undone. Take a backup first if you need the data.
The add-on moves to pending_delete and disappears once its resources are removed. The platform finishes a delete it has accepted even if your connection drops; a delete never reverts on its own. If the platform later finds the add-on in use, the delete is refused and the add-on returns to its previous status with the reason in errorMessage.
Scope: addons:write. You must own the add-on or be one of its allowed users.
Response 204 No Content
Errors
| Status | Code | When |
|---|---|---|
422 | resource-in-use | The add-on is connected to an app, bound by a feature store, attached to an agent, or used by a workflow node. The message names them; remove those references first |
POST /api/v1/addons/:id/start
Start a stopped add-on. The status moves to starting, then running when it accepts connections.
Starting is checked against your budgets: when a budget blocks it the request fails with 402 and the add-on stays stopped.
Scope: addons:deploy
Response 200 OK
The add-on, as GET /addons/:id shows it, with its status now.
POST /api/v1/addons/:id/stop
Stop a running add-on. Its data is kept and it can be started again. A stopped add-on does not accept connections.
Scope: addons:deploy
Response 200 OK
The add-on, as GET /addons/:id shows it, with its status now.
POST /api/v1/addons/:id/restart
Restart an add-on. Checked against your budgets like start.
Scope: addons:deploy
Response 200 OK
The add-on, as GET /addons/:id shows it, with its status now.
POST /api/v1/addons/:id/recover
Redeploy an add-on that is in error. If the add-on is already running, nothing changes. The add-on's data volume is kept; the add-on is redeployed with the same credentials.
Scope: addons:deploy
Response 200 OK
The add-on, as GET /addons/:id shows it, with its status now.
GET /api/v1/addons/:id/status
Check the add-on's live state and update its stored status.
Scope: addons:read
Response 200 OK
{
"data": {
"status": "running",
"message": null,
"details": { "status": "running", "replicas": 1, "readyReplicas": 1, "...": "..." }
},
"meta": { "requestId": "..." }
}
message explains a non-running state, for example that the add-on is still starting up.
GET /api/v1/addons/:id/credentials
Get the decrypted connection details. Available to the owner and to anyone the add-on is shared with.
Called from a workspace (with the workspace's own token, as the SDK and CLI in it do), the add-on must be attached to that workspace: a workspace reaches only the services it is attached to, so for any other add-on the call is refused with 409 and says to add the add-on to the workspace's services and restart it.
Scope: addons:read
Response 200 OK
{
"data": {
"host": "<internal-host>",
"internalHost": "<internal-host>",
"port": 5432,
"username": "user_a1b2c3d4",
"password": "<password>",
"database": "defaultdb",
"connectionString": "postgresql://user_a1b2c3d4:<password>@<internal-host>:5432/defaultdb"
},
"meta": { "requestId": "..." }
}
- The host is a private address reachable from apps, workspaces and workflows on the platform, not from the internet.
databaseisnullfor types without a database (Redis, RabbitMQ, Neo4j, Milvus, SurrealDB, Kafka, MQTT).connectionStringis the same string apps receive inSTRONGLY_SERVICES. It isnulluntil the add-on's first deployment has been accepted.
| Type | connectionString format |
|---|---|
postgres | postgresql://<user>:<password>@<host>:5432/defaultdb |
mysql | mysql://<user>:<password>@<host>:3306/defaultdb |
greenplum | postgresql://<user>:<password>@<host>:5432/gpadmin |
mongodb | mongodb://<user>:<password>@<host>:27017/admin |
redis | redis://:<password>@<host>:6379/0 |
rabbitmq | amqp://<user>:<password>@<host>:5672/ |
neo4j | bolt://neo4j:<password>@<host>:7687 |
milvus | <host>:19530 (sign in with the username and password) |
surrealdb | ws://<user>:<password>@<host>:8000/rpc |
kafka | <host>:9092 (the bootstrap address; sign in with SASL/PLAIN as the username and password) |
mqtt | mqtt://<user>:<password>@<host>:1883 |
GET /api/v1/addons/:id/metrics
Measure the running add-on now. The request takes about 6 seconds: throughput and connection counts are sampled over a 5-second window.
Scope: addons:read
Response 200 OK
{
"data": {
"cpu": { "usageMillicores": 7.8, "limitMillicores": 300, "percent": 2.6 },
"memory": { "usageBytes": 3502080, "limitBytes": 916455424, "percent": 0.4 },
"disk": { "usedBytes": 24576, "capacityBytes": 1020702720, "percent": 0 },
"network": { "receiveBytesPerSecond": 2480.6, "transmitBytesPerSecond": 1310.2, "totalBytesPerSecond": 3790.8, "windowSeconds": 5 },
"connections": { "current": 1, "openedPerMinute": 12, "windowSeconds": 5 },
"responseTime": { "avgMs": 0.9, "minMs": 0.7, "maxMs": 1.2, "samples": 5, "operation": "PING" },
"health": {
"state": "healthy",
"readyInstances": 1,
"totalInstances": 1,
"restarts": 0,
"runningSince": "2026-09-23T03:21:40+00:00",
"uptimeSeconds": 2520,
"instances": [
{ "name": "addon-kheofh2erh-sts-0", "component": "redis", "phase": "Running", "ready": true, "restarts": 0, "startedAt": "2026-09-23T03:21:40+00:00", "waitingReason": null }
]
},
"measuredAt": "2026-09-23T04:03:40.331446+00:00"
},
"meta": { "requestId": "..." }
}
| Field | Meaning |
|---|---|
cpu, memory | Current use against the add-on's size, and the percentage |
disk | Space used on the add-on's volume against its capacity |
network | Traffic in and out, in bytes per second, over the sampling window. Light traffic such as health checks shows as a small non-zero rate |
connections.current | Client connections open now |
connections.opened_per_minute | Every inbound connection the add-on accepted, as a per-minute rate, including the platform's health checks |
responseTime | Round-trip time of an authenticated native request from the platform to the add-on (for example a PING), averaged over 5 requests on one session |
health.state | healthy (all instances ready), degraded (some ready) or unhealthy (none ready) |
health.uptime_seconds | How long at least one serving instance has run without interruption |
health.instances | Each instance with its phase, readiness, restart count and, when waiting, the reason |
Errors
| Status | When |
|---|---|
409 | The add-on is not running |
500 | A measurement failed; the message says which |
GET /api/v1/addons/:id/logs
Get the add-on's log lines, oldest first: its whole log since it started, or the most recent lines. Once a stopped add-on has shut down, the list is empty.
Scope: addons:read
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
lines | number | whole log | Number of most recent lines |
skipNewest | number | 0 | How many of the newest lines to skip. With lines, returns the page before them: read a long log from its end with lines=100, then skipNewest=100, skipNewest=200, and so on |
since | string | ISO 8601 timestamp; only lines logged at or after it | |
container | string | Container name, for add-ons that run more than one (Milvus) |
Response 200 OK
{
"data": [
{ "timestamp": "2026-09-23T02:44:34.593556310Z", "level": "info", "message": "1:M 23 Sep 2026 02:44:34.592 * Server initialized" },
{ "timestamp": "2026-09-23T02:44:34.593802462Z", "level": "info", "message": "1:M 23 Sep 2026 02:44:34.593 * Ready to accept connections tcp" }
],
"meta": { "requestId": "..." }
}
An invalid lines or since, or a container name the add-on does not have, returns 400.
POST /api/v1/addons/:id/backups
Start a backup of the add-on now. The request returns the backup once it has started; it runs in the background and its outcome (succeeded with its size, or failed with the error) appears in the add-on's backups list. See Backups for what each type's backup contains.
Scope: addons:write
Response 201 Created
The backup it started, as it appears in the add-on's backups list: status is starting, then in_progress, then succeeded (with sizeBytes) or failed (with error).
{
"data": { "backupId": "backup-20260923031500-d4e5f6", "trigger": "manual", "status": "starting", "startedAt": "2026-09-23T03:15:00Z" },
"meta": { "requestId": "..." }
}
Errors
| Status | When |
|---|---|
422 | The add-on is not running, or a backup or restore of it is already in progress (action-in-progress) |
500 | The backup could not be started; the message says why |
GET /api/v1/addons/:id/backups
The add-on's backup settings, its backups and its restores, newest first, and what a restore of this add-on's type does.
Scope: addons:read
Response 200 OK
{
"data": {
"addonId": "addon-kheofh2erh",
"backupConfig": { "enabled": true, "schedule": "daily", "retention": 7, "nextBackup": "2026-10-05T02:44:00Z", "lastBackup": "2026-10-04T02:44:05Z" },
"backups": [
{
"backupId": "backup-20261004024400-a1b2c3",
"trigger": "scheduled",
"status": "succeeded",
"startedAt": "2026-10-04T02:44:00Z",
"completedAt": "2026-10-04T02:44:05Z",
"sizeBytes": 18432,
"objectCount": 1,
"location": "s3://<backup-storage>/.../backup-20261004024400-a1b2c3/"
}
],
"restores": [
{
"restoreId": "restore-20261004120000-d4e5f6",
"backupId": "backup-20261004024400-a1b2c3",
"status": "succeeded",
"startedAt": "2026-10-04T12:00:00Z",
"completedAt": "2026-10-04T12:00:21Z"
}
],
"restoreEffect": "Every key is removed, then the keys in the backup are loaded with their expiry times; until the restore finishes, reads miss keys."
},
"meta": { "requestId": "..." }
}
| Field | Description |
|---|---|
backups | Each backup: backupId, trigger (manual or scheduled), status (starting, in_progress, succeeded, failed, skipped), startedAt, completedAt, sizeBytes, location, error (why it failed), reason (why a scheduled run was skipped), detail (why a running backup is waiting) |
restores | Each restore: restoreId, backupId, status (starting, in_progress, succeeded, failed), startedAt, completedAt, error (the step that failed and its output), detail (why a running restore is waiting) |
restoreEffect | What a restore replaces, and what a connected app sees while it runs |
POST /api/v1/addons/:addonId/backups/:id/restore
Restore one of the add-on's succeeded backups (:id is its backupId) into the same add-on. Everything the add-on holds is replaced by what the backup holds: data written after the backup was taken is lost. The add-on keeps running while it restores; restoreEffect in GET /addons/:id/backups says what connected apps see. The request returns when the restore has started; follow it in the restores list. See Restoring a backup.
Scope: addons:write
Response 202 Accepted
The restore it started, as it appears in the add-on's restores list; follow its status there.
{
"data": { "restoreId": "restore-20261004120000-d4e5f6", "backupId": "backup-20261004110000-a1b2c3", "status": "starting", "startedAt": "2026-10-04T12:00:00Z" },
"meta": { "requestId": "..." }
}
Errors
| Status | When |
|---|---|
400 | The id is not a backup id |
422 | The add-on is not running, the backup is not a succeeded backup of this add-on, or a backup or restore of it is already in progress (action-in-progress) |
500 | The restore could not be started; the message says why |
PUT /api/v1/addons/:id/backup-config
Save the add-on's backup settings. While enabled, a backup runs every schedule interval, the first one interval after the schedule is enabled or changed. Retention applies to all backups, manual and scheduled, whether or not automatic backups are enabled.
Scope: addons:write
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | Turn automatic backups on or off |
schedule | string | Yes | hourly, daily, weekly or monthly |
retention | number | Yes | Number of successful backups to keep (whole number, at least 1); older ones are deleted |
Response 200 OK
The add-on, as GET /addons/:id shows it, with its new backupConfig.
POST /api/v1/addons/:id/connections
Connect an add-on to an app. The app receives the add-on's connection details in its STRONGLY_SERVICES environment variable the next time it is deployed. You need to be able to use the add-on and edit the app.
Scope: addons:write | Body: { "appId": "app_abc123" }
Response 201 Created
The add-on, as GET /addons/:id shows it, the app now in its connectedApps.
DELETE /api/v1/addons/:addonId/connections/:id
Disconnect an add-on from an app (:id is the app's id). Also removes a connection to an app that no longer exists.
Scope: addons:write
Response 200 OK
{ "data": { "success": true }, "meta": { "requestId": "..." } }
Sharing
Who can reach a addon is the platform's one sharing shape: its owner, its members
(role editor can use and change it, user can only use it) and its visibility
(public: every user can find and use it; in a multi-tenant deployment, every user of
its organization). Changing it stays with its owner and editors.
| Method | Path | Does | Scope |
|---|---|---|---|
| GET | /api/v1/addons/:id/permissions | Owner, members (userId, role) and visibility | addons:read |
| POST | /api/v1/addons/:id/permissions/members | Share with a user: { "userId", "role": "editor" | "user" } | addons:write |
| DELETE | /api/v1/addons/:addonId/permissions/members/:userId | Stop sharing with a user | addons:write |
| PATCH | /api/v1/addons/:id/permissions | { "visibility": "public" | "private" } | addons:write |
Each, except a member's removal (204), answers the permissions as they are now:
{
"data": {
"resourceId": "<addon id>",
"owner": "<user id>",
"members": [{ "userId": "<user id>", "role": "user" }],
"visibility": "private"
},
"meta": { "requestId": "req_abc123" }
}
GET /api/v1/addons/:id/schedule
Get the add-on's automatic start/stop window. If none has been saved, returns the disabled default shown below.
Scope: addons:read
Response 200 OK
{
"data": {
"addonId": "addon-kheofh2erh",
"scheduleConfig": {
"enabled": false,
"timezone": "UTC",
"startTime": "08:00",
"stopTime": "18:00",
"daysOfWeek": [1, 2, 3, 4, 5],
"skipHolidays": false,
"holidayCalendar": "none"
}
},
"meta": { "requestId": "..." }
}
PUT /api/v1/addons/:id/schedule
Set the add-on's automatic start/stop window. While enabled, the add-on is started at startTime and stopped at stopTime on the selected days, in the given timezone.
Scope: addons:write
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | Turn the schedule on or off |
timezone | string | Yes | IANA timezone, e.g. America/New_York |
startTime | string | Yes | HH:MM, 24-hour |
stopTime | string | Yes | HH:MM, 24-hour |
daysOfWeek | number[] | Yes | 1 (Monday) to 7 (Sunday) |
skipHolidays | boolean | No | Stay stopped on holidays of holidayCalendar |
holidayCalendar | string | No | us, uk or none |
Response 200 OK
The schedule, as GET /addons/:id/schedule shows it.
{
"data": {
"addonId": "kheofh2erh",
"scheduleConfig": { "enabled": true, "timezone": "America/New_York", "startTime": "08:00", "stopTime": "18:00", "daysOfWeek": [1, 2, 3, 4, 5], "skipHolidays": false, "holidayCalendar": "none" }
},
"meta": { "requestId": "..." }
}
Error Responses
{
"type": "urn:strongly:problem:validation-error",
"title": "Validation failed",
"status": 400,
"detail": "Unsupported addon type \"postgresql\". Valid types: mongodb, postgres, mysql, redis, rabbitmq, neo4j, milvus, greenplum, surrealdb, kafka, mqtt",
"code": "validation-error",
"requestId": "..."
}
| Status | Code | Description |
|---|---|---|
400 | validation-error | Invalid body or parameters |
401 | unauthorized | Missing or invalid API key |
402 | payment-required | A budget or credit limit blocks the launch |
403 | scope-required / forbidden | The key lacks the scope, or you lack access to the add-on or app |
404 | not-found | The add-on (or app) does not exist or you cannot use it |
409 | duplicate | The label is already in use in your organization |
422 | resource-in-use | Delete refused because something still uses the add-on |
429 | rate-limited | Rate limit exceeded |
500 | internal-error | The platform could not complete the operation |