Projects CRUD
Manage platform projects. Each project provisions an isolated Postgres database, auto-generated REST API, auth, storage, and compute.
Endpoint
| Method | Path | Auth | Idempotent |
|---|---|---|---|
| POST | | tenant Bearer | no (provisions Postgres DB) |
| GET | | tenant Bearer | yes |
| GET | | tenant Bearer | yes |
| DELETE | | tenant Bearer | yes (subsequent calls return 404) |
Parameters
| Name | Type | Required | Default | Notes |
|---|---|---|---|---|
| string | yes | — | human label; 2–64 characters; slug auto-generated |
| string | no | | , , , or |
| string | yes* | — | path parameter for GET/DELETE; project ID () |
*The
id parameter is required for the GET and DELETE operations.
Response
// POST /projects — Create
{
project: {
id: string // "prj_xxx"
name: string
slug: string // auto-generated from name
status: string // "active" | "creating" | "deleted"
plan: string // "free" | "starter" | "pro" | "team"
region: string // e.g. "eu-west-1"
createdAt: string // ISO 8601
},
credentials: {
connectionString: string
poolerConnectionString: string
apiUrl: string
anonKey: string
serviceRoleKey: string
}
}
// GET /projects — List
{
projects: Array<{
id: string
name: string
slug: string
status: string
plan: string
region: string
postgrest_status: string | null
created_at: string
updated_at: string
}>
}
// GET /projects/:id — Detail
{
project: { /* same shape as list item */ }
apiKeys: Array<{ id: string; name: string; key_prefix: string }>
recentBackups: Array<{ id: string; started_at: string; status: string }>
}
// DELETE /projects/:id — Soft-delete
{
deleted: true
projectId: string
}
Examples
# Create a project
curl -X POST https://api.blueforge.studio/api/platform/projects \
-H "Authorization: Bearer $BF_TENANT_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "My App", "plan": "pro"}'
# List all projects
curl https://api.blueforge.studio/api/platform/projects \
-H "Authorization: Bearer $BF_TENANT_KEY"
# Get project detail
curl https://api.blueforge.studio/api/platform/projects/prj_xxx \
-H "Authorization: Bearer $BF_TENANT_KEY"
# Soft-delete a project
curl -X DELETE https://api.blueforge.studio/api/platform/projects/prj_xxx \
-H "Authorization: Bearer $BF_TENANT_KEY"
import { Client } from "@blueforge/client"
// Create
const { project, credentials } = await client.projects.create({
name: "My App",
plan: "pro"
})
// List
const { projects } = await client.projects.list()
// Get detail
const detail = await client.projects.get("prj_xxx")
// Delete
await client.projects.delete("prj_xxx")
Pitfalls
- Slug is auto-generated from the project name. Slugs must be unique across all tenants — a conflict returns HTTP 409.
- Plan limits are enforced at creation time: Free (2 projects, 500 MB), Starter (5, 2 GB), Pro (20, 10 GB), Team (50, 50 GB).
- The POST endpoint is not idempotent — each call provisions a new Postgres database.
- DELETE is a soft-delete. The database and resources are not immediately destroyed.
- Credentials (connection strings, keys, etc.) are returned only on creation. Subsequent GET calls return project metadata only.
See also
- projects.create — Create a new platform project
- projects.list — List platform projects
- projects.get — Get project details
- projects.delete — Soft-delete a project
Tested against
- @blueforge/platform-api: 2.4.1
- Last verified: 2026-07-15