Model real relationships
Use PostgreSQL foreign keys and database objects.
POSTGRESQL, WITH YOUR APP
Work with real PostgreSQL, browse records and relationships, and review the API permissions your application actually needs.
Start free with up to five projects. Review capacity and compatibility before you grow.
public.projects
| id | name | status |
|---|---|---|
| 1 | Customer portal | In progress |
| 2 | Launch page | Ready |
Try the permission, then inspect the response.
GET /_data/projects403 · Closed
{ "error": "Read access is closed" }
Example project · Your account stays unchanged
BUILT AROUND THE TASK
Use PostgreSQL foreign keys and database objects.
Browse rows and run SQL in one workspace.
Choose a role and inspect its API response.
THE DETAILS THAT MATTER
Go deeper when you need the setup, operating behavior or recovery rules. The guide carries the complete reference.
Read the documentationA Fortly project can create its own PostgreSQL 16 database when you first use it. The server is shared, but the project’s database and owning login role are separate. You can work in the console, use the supported data APIs, and export the data instead of treating the database as a hidden implementation detail.
The Database workspace joins the everyday tasks: Objects for tables and other database objects, SQL Editor for queries and schema changes, Relationships for connected tables, and the table’s API tab for application-facing permissions, and Backups for point-in-time recovery and exports. The table you inspect is the same table whose access you review.
That is useful for a small app with one read-only project list and for a growing app with several related tables. Start by choosing the shape of your data, its keys and its relationships. Decide separately which operations should be available to the application, and under which identity.
Fortly sends your SQL to PostgreSQL. You can create schemas, tables, types, functions, views, triggers and indexes within your database. Your owner role is not a superuser and cannot administer the shared server or create other databases and roles. Extension availability depends on what is installed and trusted on that server.
create table public.projects (
id bigint generated by default as identity primary key,
name text not null,
status text not null default 'Planned',
created_at timestamptz not null default now()
);
insert into public.projects (name) values ('Customer portal');
This is a starting schema, not an automatic migration. Review it in SQL Editor before executing it in your own project. For relationships, use actual foreign keys so the structure is enforced by PostgreSQL as well as shown in the diagram. A visual connection should describe a database constraint, not merely decorate two cards.
SQL can work with more objects than the table Data API exposes. The ordinary table APIs serve public-schema tables; other supported database objects are available through SQL and documented routine patterns. Check the PostgreSQL compatibility page when planning advanced features.
| Caller | Access path | Important distinction |
|---|---|---|
| Browser or static frontend | Project hostname under /_data with a publishable key | Enable only the operations the role needs; tables start closed |
| New server-framework Worker | Native PostgreSQL with supported drivers, or a scoped HTTPS Data API role | DATABASE_URL reaches the Worker; open connections inside requests and keep owner credentials out of frontend code |
| Verified app user | A trusted identity provider plus configured roles and row policies | Account login and application-user identity are different |
| Console and administrative tooling | Administrative project APIs and SQL tools | Owner-level authority is broader than a public browser role |
In Objects, select a table, open its API tab, and choose the identity whose permissions you are editing. Enable Read, Create, Update or Delete deliberately, then review and apply the change. Use Test request to inspect the endpoint’s response while the same table stays selected. API keys and app sign-in remain in the shared Data API settings.
A Public Read grant is suitable only for records you intend public visitors to read. For user-owned records, connect a trusted identity provider and use row rules that match verified user claims. A publishable key does not itself identify a person. Review privileged functions separately, including functions that execute with their owner’s authority.
New server-framework deployments run as Workers. With a provisioned project database they receive DATABASE_URL and can use supported PostgreSQL drivers, with connections opened inside the request. Use the native Worker guide before carrying over a global process connection pool. Scoped HTTPS Data API roles remain available for integrations.
The server data API can be called with an account API token held in a runtime variable. That token acts as the account and should not reach browser code. When a frontend needs only reviewed table operations, use the publishable Data API route instead. The server access guide and frontend access guide show the supported request forms.
Capacity and query limits still matter. Review the documented connection, statement, row and request limits for the path you use. A large data set needs query design, pagination and indexes; increasing storage alone does not make an unbounded browser read an appropriate API.
Every database is backed up continuously on every plan: each change is saved within about a minute, encrypted, in a different region, and kept for seven days. On Pro and Max, Backups → Point in time restores the database to any minute in that window in a few minutes, and Undo puts the previous data back. Through December 1, 2026 (UTC), Free plans can restore too, once per project in a rolling 24-hour window. An application release rollback is not a database restore.
Explore the recovery workflow and reviewed Undo. For a copy you hold yourself, or for longer than seven days, use Backups → Exports and automate exports to storage you control.
Full exports can target PostgreSQL SQL, Fortly SQL, MySQL-compatible SQL or JSON. Format compatibility matters: triggers and routines are represented differently, and a database that uses both may require migration files or manual reconstruction for a complete restore. Test that restoration process before you depend on it.
For one table, the console offers CSV export; for a query, download the returned result. These are useful for inspection, but they are not substitutes for a tested full-database recovery plan. Read the export and restore reference for format details and row-security preservation.
Storage is pooled across your account according to the published plan and capacity model. Start with a schema and a representative query, confirm the API identity, then estimate growth from the rows and files your app will actually keep. That makes a capacity decision more useful than choosing a database size before you know the workload.
Before you build
Yes. The documented engine is PostgreSQL 16, with a database and owner role for each project on a shared server. Your role is not a server superuser.
No. Frontend Data API operations start closed. Choose a role, review table grants and apply them. App-user row policies require a trusted identity provider and the appropriate access setup.
Yes, on every plan. Every change is backed up continuously and kept for seven days. Pro and Max can restore the database to any minute in that window from the console, and undo the restore. See the backup reference.