API reference

Databases

Create and manage your free MariaDB and Postgres databases from code.

← API docs7 endpointsUpdated

Browse the docs

Databases

Free MariaDB and Postgres databases that belong to the account rather than to one of its servers. Only available while the feature is switched on; otherwise every endpoint here returns 404.

List the account's databases

GET/databases

Account scope databases.read

Returns, in one response, the account's databases with their connection details (passwords included), how many it may have, and the versions it can create or move to. An account may have 2 databases in total, of any engine or version, each with a hard disk quota of 50 MiB. Engines are mariadb and postgres; which versions exist changes over time, so read them from versions. Returns 404 while databases are switched off.

Example

curl "https://sillydev.co.uk/panel/api/client/databases" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json"

Response 200The databases, the allowance and the versions on offer.

{
    "object": "user_database_list",
    "attributes": {
        "limit": 2,
        "owned": 1,
        "can_create": true,
        "quota_bytes": 52428800,
        "versions": [
            {
                "id": 3,
                "engine": "mariadb",
                "name": "MariaDB 11.4",
                "server_version": "11.4.3",
                "label": "recommended",
                "status": "active",
                "legacy_ends_at": null,
                "host": "db.sillydev.co.uk",
                "port": 3306
            },
            {
                "id": 5,
                "engine": "postgres",
                "name": "Postgres 17",
                "server_version": "17.2",
                "label": "recommended",
                "status": "active",
                "legacy_ends_at": null,
                "host": "db.sillydev.co.uk",
                "port": 5432
            }
        ],
        "databases": [
            {
                "object": "user_database",
                "attributes": {
                    "id": 12,
                    "label": "Discord bot",
                    "engine": "mariadb",
                    "name": "discord_bot_k3j9x0",
                    "username": "u42_p0zt7c1m",
                    "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                    "host": "db.sillydev.co.uk",
                    "port": 3306,
                    "version": {
                        "id": 3,
                        "engine": "mariadb",
                        "name": "MariaDB 11.4",
                        "server_version": "11.4.3",
                        "label": "recommended",
                        "status": "active",
                        "legacy_ends_at": null,
                        "host": "db.sillydev.co.uk",
                        "port": 3306
                    },
                    "status": "ready",
                    "moving_to": null,
                    "last_move_error": null,
                    "previous_version": null,
                    "previous_expires_at": null,
                    "moved_at": null,
                    "can_undo_move": false,
                    "size_bytes": 1310720,
                    "quota_bytes": 52428800,
                    "size_checked_at": "2026-10-10T12:00:00+00:00",
                    "created_at": "2026-10-01T09:30:00+00:00"
                }
            }
        ]
    }
}
Every field in the response
List the account's databases: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.limitrequiredintegerHow many databases the account may have.
attributes.ownedrequiredinteger
attributes.can_createrequiredboolean
attributes.quota_bytesrequiredintegerEach database's disk quota in bytes.
attributes.versionsrequiredarray of objectActive versions, plus any legacy version the account still has a database on.
attributes.versions[].idrequiredintegerSend as version_id to create or move a database.
attributes.versions[].enginerequiredone of 'mariadb', 'postgres'
attributes.versions[].namerequiredstring
attributes.versions[].server_versionrequiredstring
attributes.versions[].labelrequiredone of 'recommended', 'older', null
attributes.versions[].statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.versions[].legacy_ends_atrequiredstring (date-time) | null
attributes.versions[].hostrequiredstring
attributes.versions[].portrequiredinteger
attributes.databasesrequiredarray of object
attributes.databases[].objectrequiredstring
attributes.databases[].attributesrequiredobject
attributes.databases[].attributes.idrequiredinteger
attributes.databases[].attributes.labelrequiredstringThe name the owner gave it.
attributes.databases[].attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.databases[].attributes.namerequiredstringThe database name to connect to.
attributes.databases[].attributes.usernamerequiredstring
attributes.databases[].attributes.passwordrequiredstringThe current password, in plain text.
attributes.databases[].attributes.hostrequiredstring
attributes.databases[].attributes.portrequiredinteger
attributes.databases[].attributes.versionrequiredobject
attributes.databases[].attributes.statusrequiredone of 'ready', 'moving'
attributes.databases[].attributes.moving_torequiredany
attributes.databases[].attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.databases[].attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.databases[].attributes.previous_expires_atrequiredstring (date-time) | null
attributes.databases[].attributes.moved_atrequiredstring (date-time) | null
attributes.databases[].attributes.can_undo_moverequiredboolean
attributes.databases[].attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.databases[].attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.databases[].attributes.size_checked_atrequiredstring (date-time) | null
attributes.databases[].attributes.created_atrequiredstring (date-time)

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.

Create a database

POST/databases

Account scope databases.writeLimited to 5 per minute

Creates a database on an active version and returns it with its connection details. The database name is made from the label plus a random suffix, and the username and a 32-character password are generated. Refused with 409 when the account already has 2 databases or another creation is still running. Returns 404 while databases are switched off.

Body

Create a database: request body
NameTypeDescription
labelrequiredstring
version_idrequiredintegerThe id of an active version.

Example

curl -X POST "https://sillydev.co.uk/panel/api/client/databases" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"label":"Discord bot","version_id":3}'

Response 201The new database.

{
    "object": "user_database",
    "attributes": {
        "id": 12,
        "label": "Discord bot",
        "engine": "mariadb",
        "name": "discord_bot_k3j9x0",
        "username": "u42_p0zt7c1m",
        "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "host": "db.sillydev.co.uk",
        "port": 3306,
        "version": {
            "id": 3,
            "engine": "mariadb",
            "name": "MariaDB 11.4",
            "server_version": "11.4.3",
            "label": "recommended",
            "status": "active",
            "legacy_ends_at": null,
            "host": "db.sillydev.co.uk",
            "port": 3306
        },
        "status": "ready",
        "moving_to": null,
        "last_move_error": null,
        "previous_version": null,
        "previous_expires_at": null,
        "moved_at": null,
        "can_undo_move": false,
        "size_bytes": 0,
        "quota_bytes": 52428800,
        "size_checked_at": "2026-10-10T12:00:00+00:00",
        "created_at": "2026-10-10T12:00:00+00:00"
    }
}
Every field in the response
Create a database: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.idrequiredinteger
attributes.labelrequiredstringThe name the owner gave it.
attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.namerequiredstringThe database name to connect to.
attributes.usernamerequiredstring
attributes.passwordrequiredstringThe current password, in plain text.
attributes.hostrequiredstring
attributes.portrequiredinteger
attributes.versionrequiredobject
attributes.version.idrequiredintegerSend as version_id to create or move a database.
attributes.version.enginerequiredone of 'mariadb', 'postgres'
attributes.version.namerequiredstring
attributes.version.server_versionrequiredstring
attributes.version.labelrequiredone of 'recommended', 'older', null
attributes.version.statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.version.legacy_ends_atrequiredstring (date-time) | null
attributes.version.hostrequiredstring
attributes.version.portrequiredinteger
attributes.statusrequiredone of 'ready', 'moving'
attributes.moving_torequiredany
attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.previous_expires_atrequiredstring (date-time) | null
attributes.moved_atrequiredstring (date-time) | null
attributes.can_undo_moverequiredboolean
attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.size_checked_atrequiredstring (date-time) | null
attributes.created_atrequiredstring (date-time)

Errors

  • 400 The request could not be carried out as sent. detail says why.
  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The account is at its database limit, or a database is already being created for it.
  • 422 Some fields were missing or invalid. There is one error per problem, and meta.source_field names the field.
  • 429 Too many requests. Wait for the number of seconds in the Retry-After header, then try again.
  • 502 The database server could not be reached or refused the request. Try again in a few minutes.

Rotate a database's password

POST/databases/{database}/rotate-password

Account scope databases.writeLimited to 10 per minute

Gives the database a new random 32-character password and returns the database with it. The old password stops working at once. If a copy is being kept from a recent move it gets the new password too. Refused with 409 while the database is being moved.

Parameters

Rotate a database's password: parameters
NameTypeDescription
databaserequiredintegerThe database's numeric id.

Example

curl -X POST "https://sillydev.co.uk/panel/api/client/databases/{database}/rotate-password" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json"

Response 200The database with its new password.

Every field in the response
Rotate a database's password: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.idrequiredinteger
attributes.labelrequiredstringThe name the owner gave it.
attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.namerequiredstringThe database name to connect to.
attributes.usernamerequiredstring
attributes.passwordrequiredstringThe current password, in plain text.
attributes.hostrequiredstring
attributes.portrequiredinteger
attributes.versionrequiredobject
attributes.version.idrequiredintegerSend as version_id to create or move a database.
attributes.version.enginerequiredone of 'mariadb', 'postgres'
attributes.version.namerequiredstring
attributes.version.server_versionrequiredstring
attributes.version.labelrequiredone of 'recommended', 'older', null
attributes.version.statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.version.legacy_ends_atrequiredstring (date-time) | null
attributes.version.hostrequiredstring
attributes.version.portrequiredinteger
attributes.statusrequiredone of 'ready', 'moving'
attributes.moving_torequiredany
attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.previous_expires_atrequiredstring (date-time) | null
attributes.moved_atrequiredstring (date-time) | null
attributes.can_undo_moverequiredboolean
attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.size_checked_atrequiredstring (date-time) | null
attributes.created_atrequiredstring (date-time)

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The resource is busy or in a state that does not allow this right now.
  • 429 Too many requests. Wait for the number of seconds in the Retry-After header, then try again.
  • 502 The database server could not be reached or refused the request. Try again in a few minutes.

Move a database to another version

POST/databases/{database}/move

Account scope databases.writeLimited to 5 per minute

Queues a move of the database to another active version of the same engine on the same database server, and returns at once with status set to moving. Poll the database list until status is ready again: on success version is the new one and the old copy is kept, locked, for 7 days so the move can be undone; on failure the database stays where it was and last_move_error says why. Refused with 409 while a move is running or while a copy from the last move is still kept (undo or keep it first), and with 422 for the same version, another engine, another database server or a version that is not active.

Parameters

Move a database to another version: parameters
NameTypeDescription
databaserequiredintegerThe database's numeric id.

Body

Move a database to another version: request body
NameTypeDescription
version_idrequiredintegerThe id of another active version of the same engine.

Example

curl -X POST "https://sillydev.co.uk/panel/api/client/databases/{database}/move" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"version_id":4}'

Response 202The move is queued; the database is returned with `status` `moving` and `moving_to` set.

Every field in the response
Move a database to another version: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.idrequiredinteger
attributes.labelrequiredstringThe name the owner gave it.
attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.namerequiredstringThe database name to connect to.
attributes.usernamerequiredstring
attributes.passwordrequiredstringThe current password, in plain text.
attributes.hostrequiredstring
attributes.portrequiredinteger
attributes.versionrequiredobject
attributes.version.idrequiredintegerSend as version_id to create or move a database.
attributes.version.enginerequiredone of 'mariadb', 'postgres'
attributes.version.namerequiredstring
attributes.version.server_versionrequiredstring
attributes.version.labelrequiredone of 'recommended', 'older', null
attributes.version.statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.version.legacy_ends_atrequiredstring (date-time) | null
attributes.version.hostrequiredstring
attributes.version.portrequiredinteger
attributes.statusrequiredone of 'ready', 'moving'
attributes.moving_torequiredany
attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.previous_expires_atrequiredstring (date-time) | null
attributes.moved_atrequiredstring (date-time) | null
attributes.can_undo_moverequiredboolean
attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.size_checked_atrequiredstring (date-time) | null
attributes.created_atrequiredstring (date-time)

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The resource is busy or in a state that does not allow this right now.
  • 422 Some fields were missing or invalid. There is one error per problem, and meta.source_field names the field.
  • 429 Too many requests. Wait for the number of seconds in the Retry-After header, then try again.

Undo a database move

POST/databases/{database}/undo-move

Account scope databases.write

Switches the database back to the copy kept from its last move and deletes the moved copy. Anything written since the move is lost. Only possible while can_undo_move is true, and refused with 409 when the old version has reached its end date.

Parameters

Undo a database move: parameters
NameTypeDescription
databaserequiredintegerThe database's numeric id.

Example

curl -X POST "https://sillydev.co.uk/panel/api/client/databases/{database}/undo-move" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json"

Response 200The database, back on its previous version.

Every field in the response
Undo a database move: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.idrequiredinteger
attributes.labelrequiredstringThe name the owner gave it.
attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.namerequiredstringThe database name to connect to.
attributes.usernamerequiredstring
attributes.passwordrequiredstringThe current password, in plain text.
attributes.hostrequiredstring
attributes.portrequiredinteger
attributes.versionrequiredobject
attributes.version.idrequiredintegerSend as version_id to create or move a database.
attributes.version.enginerequiredone of 'mariadb', 'postgres'
attributes.version.namerequiredstring
attributes.version.server_versionrequiredstring
attributes.version.labelrequiredone of 'recommended', 'older', null
attributes.version.statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.version.legacy_ends_atrequiredstring (date-time) | null
attributes.version.hostrequiredstring
attributes.version.portrequiredinteger
attributes.statusrequiredone of 'ready', 'moving'
attributes.moving_torequiredany
attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.previous_expires_atrequiredstring (date-time) | null
attributes.moved_atrequiredstring (date-time) | null
attributes.can_undo_moverequiredboolean
attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.size_checked_atrequiredstring (date-time) | null
attributes.created_atrequiredstring (date-time)

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The resource is busy or in a state that does not allow this right now.
  • 502 The database server could not be reached or refused the request. Try again in a few minutes.

Keep a database move

POST/databases/{database}/keep-move

Account scope databases.write

Deletes the copy kept from the database's last move, ending the undo window early so the database can be moved again. Does nothing harmful if there is no kept copy. Refused with 409 while the database is being moved.

Parameters

Keep a database move: parameters
NameTypeDescription
databaserequiredintegerThe database's numeric id.

Example

curl -X POST "https://sillydev.co.uk/panel/api/client/databases/{database}/keep-move" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json"

Response 200The database, with `previous_version` cleared.

Every field in the response
Keep a database move: response
NameTypeDescription
objectrequiredstring
attributesrequiredobject
attributes.idrequiredinteger
attributes.labelrequiredstringThe name the owner gave it.
attributes.enginerequiredone of 'mariadb', 'postgres'
attributes.namerequiredstringThe database name to connect to.
attributes.usernamerequiredstring
attributes.passwordrequiredstringThe current password, in plain text.
attributes.hostrequiredstring
attributes.portrequiredinteger
attributes.versionrequiredobject
attributes.version.idrequiredintegerSend as version_id to create or move a database.
attributes.version.enginerequiredone of 'mariadb', 'postgres'
attributes.version.namerequiredstring
attributes.version.server_versionrequiredstring
attributes.version.labelrequiredone of 'recommended', 'older', null
attributes.version.statusrequiredone of 'active', 'legacy', 'retired'Only active versions take new databases. A legacy one is listed only when the account has a database on it; at legacy_ends_at its databases are moved to the engine's recommended version.
attributes.version.legacy_ends_atrequiredstring (date-time) | null
attributes.version.hostrequiredstring
attributes.version.portrequiredinteger
attributes.statusrequiredone of 'ready', 'moving'
attributes.moving_torequiredany
attributes.last_move_errorrequiredstring | nullWhy the last move failed, if it did. The database stayed on its old version.
attributes.previous_versionrequiredanyThe version a copy is kept on after a move, until previous_expires_at.
attributes.previous_expires_atrequiredstring (date-time) | null
attributes.moved_atrequiredstring (date-time) | null
attributes.can_undo_moverequiredboolean
attributes.size_bytesrequiredinteger | nullDisk used, as of size_checked_at.
attributes.quota_bytesrequiredintegerHard disk quota. Writes beyond it fail.
attributes.size_checked_atrequiredstring (date-time) | null
attributes.created_atrequiredstring (date-time)

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The resource is busy or in a state that does not allow this right now.
  • 502 The database server could not be reached or refused the request. Try again in a few minutes.

Delete a database

DELETE/databases/{database}

Account scope databases.write

Permanently deletes the database and its data, along with any copy kept from a move. It is only removed from the account once the database server has dropped it. Refused with 409 while the database is being moved.

Parameters

Delete a database: parameters
NameTypeDescription
databaserequiredintegerThe database's numeric id.

Example

curl -X DELETE "https://sillydev.co.uk/panel/api/client/databases/{database}" \
  -H "Authorization: Bearer $SILLYDEV_API_KEY" \
  -H "Accept: application/json"

Response 204Done. There is no response body.

Errors

  • 401 No API key was sent, or it is wrong, expired or deleted.
  • 403 The key is valid but may not do this: it lacks the permission or account scope, it is limited to other servers or IP addresses, or the account may not do it at all.
  • 404 There is no such resource, or the key cannot see it. Features that are switched off answer 404 too.
  • 409 The resource is busy or in a state that does not allow this right now.
  • 502 The database server could not be reached or refused the request. Try again in a few minutes.