Create databases, upload SQLite dumps, create database branches, restore from backup, and more with Turso's Databases API.
We previously learned about creating database groups, and adding locations to groups to replicate databases automatically. In this chapter, we'll learn how to create and manage databases using Databases API.
Before you continue, make sure you've read the previous chapters in this series:
The Turso Platform API provides you with a set of endpoints to manage databases within your groups. You can create, delete, create from backup, create a branch database, and much more.
A Database is made up of the following properties:
DbId
— The unique ID for the database (created and managed automatically).Name
— The unique name of the database (provided by you).Hostname
— The DNS hostname used to connect to the database.primaryRegion
— The primary location code for the group.regions
— All location codes for the group, including the primary.group
— The group the database belongs to.is_schema
— A boolean indicating if the database is a schema database.schema
— The database ID of the schema database, if is_schema
is set.block_reads
— The current status fro blocked reads.block_writes
— The current status for blocked writes.allow_attach
— The current status for allowing the database to be attached to another.version
— The sqld version used by the group for databases.sleeping
— A boolean indicating if the database/group is archived.Turso provides two types of databases, individual and schema databases. An individual database is a standalone database that can be used for any purpose. A schema database is a special database that is used to control the schema of other databases — learn more about Multi-DB Schemas.
Using the Turso Platform API we can fetch a list of databases from the API:
curl -L https://api.turso.tech/v1/organizations/{organizationName}/databases \
-H 'Authorization: Bearer TOKEN'
This returns a JSON of all groups for your provided organization:
{
"databases": [
{
"Name": "my-db",
"DbId": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"Hostname": "[databaseName]-[organizationName].turso.io",
"block_reads": false,
"block_writes": false,
"allow_attach": false,
"regions": ["lhr", "bos", "nrt"],
"primaryRegion": "lhr",
"version": "0.22.22",
"group": "default",
"is_schema": false,
"schema": "",
"sleeping": true
}
]
}
By default, it will list all databases in all groups... but what if you want to filter by group? Turso let's you do that using a query parameter!
Simply pass the name of your group to the group
query parameter:
curl -L https://api.turso.tech/v1/organizations/{organizationName}/databases?group=default \
-H 'Authorization: Bearer TOKEN'
You can create hundreds and thousands of databases using the Turso Platform API. To create a database, you'll need to give it a name, and provide the name of the group.
The following reuqest creates a database called my-first-db
in the group default
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "my-first-db",
"group": "default"
}'
This will return the newly created group as JSON:
{
"database": {
"DbId": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"Hostname": "my-first-db-[organizationName].turso.io",
"Name": "my-first-db"
}
}
To retrieve a specific database, you can fetch it by its name:
curl -L 'https://api.turso.tech/v1/organizations/{organizationName}/databases/my-first-db' \
-H 'Authorization: Bearer TOKEN'
The response will contain the database as JSON:
{
"Name": "my-first-db",
"DbId": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"Hostname": "my-first-db-[organizationName].turso.io",
"block_reads": false,
"block_writes": false,
"allow_attach": false,
"regions": ["lhr", "bos", "nrt"],
"primaryRegion": "lhr",
"version": "0.22.22",
"group": "default",
"is_schema": false,
"schema": "",
"sleeping": true
}
Each database contains metadata about its configuration. This includes details about its size limit, whether ATTACH is allowed, and the status of read/write are blocked.
You can fetch the configuration of a database by appending /configuration
to the URL above we used when retrieving the database itself:
curl -L -X GET 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/configuration' \
-H 'Authorization: Bearer TOKEN'
This will return the configuration as JSON:
{
"size_limit": "10000",
"allow_attach": true,
"block_reads": true,
"block_writes": true
}
The size_limit
is the maximum size of the database in bytes.
You can PATCH
the database configuration using the same URL as above for its configuration:
curl -L -X PATCH 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/configuration' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"size_limit": "500mb",
"allow_attach": true
}'
When setting the size_limit
, you can pass the value as units, for example: 500mb
, 1gb
, etc.
You can delete a database by using the DELETE
HTTP method:
curl -L -X DELETE 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}' \
-H 'Authorization: Bearer TOKEN'
This will immediately delete the database and all its data.
The response will contain the deleted database name as JSON:
{
"database": "my-first-db"
}
You can fetch the usage and activity of a single database in a given time period by using the /usage
endpoint. Usage contains information about the number of rows read, written, and the total size of the database.
You can filter the usage by providing a from
and to
query parameter using a ISO 8601 date format:
curl -L -X GET 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/usage?from=2024-01-01T00:00:00Z&to=2024-12-01T00:00:00Z' \
-H 'Authorization: Bearer TOKEN'
This returns your database, including its DbId
and total
usage:
{
"database": {
"uuid": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"total": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 8192
}
}
}
You can fetch the top queries, including the affected rows read and written using the Turso Platform API:
curl -L -X GET 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/stats' \
-H 'Authorization: Bearer TOKEN'
This returns the top_queries
array for the given database as JSON:
{
"top_queries": [
{
"query": "SELECT COUNT(*), CustomerID FROM Orders GROUP BY CustomerID HAVING COUNT(*) > 5;",
"rows_read": 123,
"rows_written": 4567
}
]
}
These top queries help better shape your database and optimize its performance. You can get AI Insights on these queries by logging into the Turso Dashboard.
You can create a Database Token using the Turso Platform API:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/auth/tokens' \
-H 'Authorization: Bearer TOKEN'
This will return a response that contains the token:
{
"jwt": "TOKEN"
}
Tokens by default never expire, and cannot be retrieved again.
You can create a Database Token that expires after a certain amount of time. For example, to expire a token in 2 weeks, 1 day, and 30 minutes, we can pass that as a value to the query string expiration
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/auth/tokens?expiration=2w1d30m' \
-H 'Authorization: Bearer TOKEN'
Tokens by default enable full-access
to databases, but you can create a read-only
token by passing the query string authorization
, and the access type required:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/auth/tokens?authorization=read-only' \
-H 'Authorization: Bearer TOKEN'
You can create a Database Token with specific permissions by passing permissions
to the body
of a request as JSON. This is useful if you're using the ATTACH
statement with one database to read from others — learn more.
For example, to create a token that can only read from databases db1
, db2
, and db3
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases/{databaseName}/auth/tokens' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"permissions": {
"read_attach": {
"databases": ["db1", "db2", "db3"]
}
}
}'
You can also create a database from an existing one for use in development — branching, or to restore a previous copy of a database. This is done by passing the seed
object in the request body with the type
as database
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "new-database",
"group": "default",
"seed": {
"type": "database",
"name": "existing-database-name"
}
}'
To create a database from a specific point in time, you can pass the timestamp
(using an ISO 8601 date format) in the seed
object:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "new-database",
"group": "default",
"seed": {
"type": "database",
"name": "existing-database-name",
"timestamp": "2024-01-01T00:00:00Z"
}
}'
The timestamp
must be within the permitted time for your organization plan — see pricing.
You can also upload a SQLite dump that can be used to create a new database from that uploaded dump. Using the multipart/form-data
content type, pass the SQLite dump as file
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases/dumps' \
-H 'Authorization: Bearer TOKEN' \
-F 'file=@"~/Downloads/dump.sql"'
Once uploaded, you will get back the dump_url
which we can use to create a database using the same seed
object as before, but this time with the type
as dump
:
curl -L -X POST 'https://api.turso.tech/v1/organizations/{organizationName}/databases' \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "new-database",
"group": "default",
"seed": {
"type": "dump",
"url": "DUMP_URL"
}
}'
That's it! You know have all of the knowledge required to create organizations, groups, query locations, create and replicate databases within groups globally using the Turso Platform API.