Management API
You can register and manage CloudSync databases programmatically without using the dashboard UI.
Authentication
Authorization: Bearer <APIKEY>
- Base URL:
https://cloudsync.sqlite.ai - Use a management API key with the
workspace-adminrole. In the SQLite Cloud Dashboard, go to your project, then CloudSync > API Keys. - The workspace is derived from the key itself.
Use this API from backend services, CI, or trusted automation. Client apps should use the Client API Reference instead.
Request and Response Conventions
- Send
Content-Type: application/jsonfor allPOST,PUT, andPATCHbodies. - Successful responses use the envelope
{"data": ...}. - List responses may also include a
metaobject. - Error responses use a top-level
errorsarray.
Example error response:
{
"errors": [
{
"status": "404",
"code": "not_found",
"title": "Not Found",
"detail": "managed database not found"
}
]
}
Quickstart
Start with an API key from your project’s CloudSync > API Keys page in the dashboard:
export BASE_URL="https://cloudsync.sqlite.ai"
export APIKEY="<workspace-admin-management-api-key>"
export PROJECT_ID="<project-id>"
export DATABASE_NAME="appdb"
export SQLITECLOUD_HOST="<sqlitecloud-host>"
export SQLITECLOUD_API_KEY="<sqlitecloud-api-key>"
1. Register a Database
This creates the managed database entry in CloudSync and returns the CloudSync Database ID as managedDatabaseId.
curl --request POST "$BASE_URL/v1/databases" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{
"label": "Primary DB",
"connectionString": "sqlitecloud://'"$SQLITECLOUD_HOST"':8860?apikey='"$SQLITECLOUD_API_KEY"'",
"provider": "sqlitecloud",
"flavor": "sqlitecloud",
"projectId": "'"$PROJECT_ID"'",
"databaseName": "'"$DATABASE_NAME"'"
}'
Response:
{
"data": {
"managedDatabaseId": "db_xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
Use managedDatabaseId as MGMT_DB_ID in the next calls. The response also includes additional database metadata, such as projectId, databaseName, auth settings, and timestamps.
export MGMT_DB_ID="db_xxxxxxxxxxxxxxxxxxxxxxxx"
2. List Registered Databases
Useful when you want to recover the managed database ID later.
curl --request GET "$BASE_URL/v1/databases" \
--header "Authorization: Bearer $APIKEY"
3. Check Available CloudSync Tables
curl --request GET "$BASE_URL/v1/databases/$MGMT_DB_ID/cloudsync/tables" \
--header "Authorization: Bearer $APIKEY"
4. Enable CloudSync for Tables
curl --request POST "$BASE_URL/v1/databases/$MGMT_DB_ID/cloudsync/enable" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{
"tables": ["users", "orders"]
}'
Endpoint Summary
| Area | Endpoints |
|---|---|
| Organization | GET /v1/orgs |
| Databases | POST /v1/databases, GET /v1/databases, GET /v1/databases/:databaseID, PATCH /v1/databases/:databaseID, DELETE /v1/databases/:databaseID, GET /v1/databases/:databaseID/connection |
| CloudSync tables | GET /v1/databases/:databaseID/cloudsync/tables, POST /v1/databases/:databaseID/cloudsync/enable, POST /v1/databases/:databaseID/cloudsync/disable |
| Notifications | PUT /v1/databases/:databaseID/notifications/expo-access-token, GET /v1/databases/:databaseID/notifications/expo-access-token, DELETE /v1/databases/:databaseID/notifications/expo-access-token, GET /v1/databases/:databaseID/notifications/status |
| Devices | GET /v1/databases/:databaseID/devices, DELETE /v1/databases/:databaseID/devices/:siteId |
Organization
GET /v1/orgs
Returns the organization associated with the API key.
curl "$BASE_URL/v1/orgs" \
--header "Authorization: Bearer $APIKEY"
{
"data": {
"organizationId": "org_xxxxxxxxxxxxxxxxxxxxxxxx",
"slug": "acme",
"name": "Acme Corp",
"status": "active"
}
}
Databases
POST /v1/databases
Registers a new managed database.
Required fields:
labelconnectionStringprovider—postgresorsqlitecloudflavor— for examplevanilla,supabase, orsqlitecloudprojectId— SQLite Cloud project identifier for the managed database. For SQLite Cloud connection strings, this must match the project ID parsed from the connection string.databaseName
Optional fields:
schemaName— Postgres onlyjwtAllowedIssuersjwtExpectedAudiencesjwksUrijwtSecret
CloudSync verifies the tenant database connection before registration is persisted. If verification fails, the database is not registered.
For SQLite Cloud databases, databaseName identifies the target database and CloudSync switches to it when running CloudSync operations. For Postgres databases, the connectionString must point to the target database.
Common database failure codes include database_paused, database_auth_failed, database_unreachable, database_permission_denied, database_cloudsync_not_ready, and database_error.
GET /v1/databases
Lists managed databases visible to the key.
Query parameters:
projectId— filter by project IDdatabase— filter by database name; requiresprojectId
Example:
curl "$BASE_URL/v1/databases" \
--header "Authorization: Bearer $APIKEY"
Filtered example:
curl "$BASE_URL/v1/databases?projectId=$PROJECT_ID&database=$DATABASE_NAME" \
--header "Authorization: Bearer $APIKEY"
GET /v1/databases/:databaseID
Fetches a single managed database in the workspace.
curl "$BASE_URL/v1/databases/$MGMT_DB_ID" \
--header "Authorization: Bearer $APIKEY"
PATCH /v1/databases/:databaseID
Updates metadata, auth settings, and connection details. Only the fields you send are modified.
Supported fields:
labelconnectionStringjwtAllowedIssuersjwtExpectedAudiencesjwksUrijwtSecret
Notes:
- when
connectionStringis provided, CloudSync verifies the new connection before storing it - omitting
jwtSecretleaves the current secret unchanged - sending
"jwtSecret": ""clears the current secret jwtSecretis write-only and is never returned by read endpoints
Example:
curl --request PATCH "$BASE_URL/v1/databases/$MGMT_DB_ID" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{
"label": "Primary DB (updated)",
"jwtAllowedIssuers": ["https://project.supabase.co/auth/v1"],
"jwtExpectedAudiences": ["authenticated"],
"jwksUri": "https://project.supabase.co/auth/v1/.well-known/jwks.json",
"jwtSecret": ""
}'
DELETE /v1/databases/:databaseID
Deletes a managed database record.
Before removal, CloudSync attempts to:
- list CloudSync-managed tenant tables
- disable enabled tables
- delete pending jobs for the managed database
Cleanup is best effort. The database record is still deleted even if one of those cleanup steps reports warnings.
curl --request DELETE "$BASE_URL/v1/databases/$MGMT_DB_ID" \
--header "Authorization: Bearer $APIKEY"
GET /v1/databases/:databaseID/connection
Runs a live connectivity check against the managed database’s stored connection details.
curl "$BASE_URL/v1/databases/$MGMT_DB_ID/connection" \
--header "Authorization: Bearer $APIKEY"
Success response:
{
"data": {
"ok": true,
"checkedAt": "2025-01-01T00:00:00Z"
}
}
Failure response:
{
"data": {
"ok": false,
"checkedAt": "2025-01-01T00:00:00Z",
"failure": {
"code": "database_unreachable",
"message": "tenant database is unreachable",
"retryable": true
}
}
}
CloudSync Tables
GET /v1/databases/:databaseID/cloudsync/tables
Lists tables and whether CloudSync is enabled for each one.
curl "$BASE_URL/v1/databases/$MGMT_DB_ID/cloudsync/tables" \
--header "Authorization: Bearer $APIKEY"
{
"data": [
{ "name": "users", "enabled": true },
{ "name": "orders", "enabled": false }
]
}
POST /v1/databases/:databaseID/cloudsync/enable
Enables CloudSync for a non-empty list of tables.
curl --request POST "$BASE_URL/v1/databases/$MGMT_DB_ID/cloudsync/enable" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{"tables": ["users", "orders"]}'
POST /v1/databases/:databaseID/cloudsync/disable
Disables CloudSync for a non-empty list of tables.
curl --request POST "$BASE_URL/v1/databases/$MGMT_DB_ID/cloudsync/disable" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{"tables": ["orders"]}'
Notifications
PUT /v1/databases/:databaseID/notifications/expo-access-token
Sets or rotates the Expo access token used to send push notifications.
curl --request PUT "$BASE_URL/v1/databases/$MGMT_DB_ID/notifications/expo-access-token" \
--header "Authorization: Bearer $APIKEY" \
--header "Content-Type: application/json" \
--data '{"expoAccessToken": "expo-access-token-value"}'
GET /v1/databases/:databaseID/notifications/expo-access-token
Returns metadata about the Expo access token, not the token value itself.
curl "$BASE_URL/v1/databases/$MGMT_DB_ID/notifications/expo-access-token" \
--header "Authorization: Bearer $APIKEY"
DELETE /v1/databases/:databaseID/notifications/expo-access-token
Removes the Expo access token from the database.
curl --request DELETE "$BASE_URL/v1/databases/$MGMT_DB_ID/notifications/expo-access-token" \
--header "Authorization: Bearer $APIKEY"
GET /v1/databases/:databaseID/notifications/status
Returns the current push notification status for a managed database.
status can be enabled, disabled, or paused. When status is paused, reason explains why. Currently supported pause reasons include expo_unauthorized.
curl "$BASE_URL/v1/databases/$MGMT_DB_ID/notifications/status" \
--header "Authorization: Bearer $APIKEY"
Devices
GET /v1/databases/:databaseID/devices
Lists registered devices for a managed database.
Query parameters:
page— default1page_size— default50, max500
curl "$BASE_URL/v1/databases/$MGMT_DB_ID/devices?page=1&page_size=50" \
--header "Authorization: Bearer $APIKEY"
DELETE /v1/databases/:databaseID/devices/:siteId
Removes a registered device by siteId. Associated push tokens are removed as well.
curl --request DELETE "$BASE_URL/v1/databases/$MGMT_DB_ID/devices/site_123" \
--header "Authorization: Bearer $APIKEY"