Data API

building

What you get, where it lives, and what starts costing money.

Create a database

In the studio: open your project, choose Database, press Create database. It takes about two seconds.

There is no API call for this, deliberately. Creating a database starts a monthly charge, and starting a charge should be a decision somebody makes with the price in front of them — not something a key does during a deploy that was meant to be idempotent.

What you get

Postgres18
DatabaseNamed after your project — booking for a project called Booking
Rolebooking_owner, and it really is the owner
RegionYour project's, Frankfurt unless you chose otherwise
Branchproduction — the one every other branch is copied from
ComputeAutoscales 0.25–4 CU, sleeps after 5 minutes idle
Restore history7 days

The database is named after your project, so the connection string in your .env reads like something of yours rather than like a default somebody left in place. Hyphens become underscores, because an unquoted Postgres identifier cannot contain one: a project called rapid-clicks gets a database called rapid_clicks.

You are the owner. That role can create schemas, extensions, tables and roles of its own. Nothing of ours lives in your database, so there is nothing for a restricted role to protect — and a tutorial that says CREATE EXTENSION should work when you paste it.

A Compute Unit is one vCPU and 4 GB of RAM. Yours moves between a quarter of one and four of them depending on what your queries need, and stops entirely when nothing is connected. See sleeping.

Where it lives

The region is your project's, chosen when the project was created. Put your application in the same one: a query that crosses an ocean pays that crossing on every round trip, and an ORM that does three queries per request pays it three times.

Moving an existing database between regions is not something we can do in place. If you need a different one, the honest answer is a new project and a dump.

What it costs from that moment

The minimum starts the moment the database exists, not the moment you connect to it. An empty database is still storage somebody is holding for you.

What it does not start is compute: nothing is awake until something connects.

One database, many branches

A project gets one database, and grows sideways: a branch is a copy of it, made in about a second whatever its size, with its own connection string. That is how you get a preview environment with real data in it, or a place to rehearse a migration.

Nothing else is provisioned with it

No connection pooler of ours, no ORM, no migrations, no seed data. You get a Postgres database and its address. Everything about what goes in it is yours, which is the point — see connecting.