151 endpoints at https://api.vaif.studio, generated from the API's OpenAPI document. The REST API page covers authentication, and All endpoints lists every group.
GET /projects/
| Parameter | In | Type | Required |
|---|
orgId | query | string | No |
Response 200 (application/json)
{
id: string;
orgId: string;
name: string;
slug: string;
description: string | null;
regionKey: string | null;
defaultEnvironment: string | null;
createdAt: string;
updatedAt: string;
lastActivityAt: string;
status: "active" | "asleep" | "suspended";
statusSince: string | null;
statusReason: string | null;
}[]
Errors: 401, 403, with the error body.
POST /projects/
Request body (application/json, required)
{
orgId: string (uuid);
name: string;
slug?: string;
description?: string | null;
regionKey?: string;
enabledAddons?: string[];
frontend?: "lovable" | "v0" | "bolt" | "cursor_claude_code" | "hand_written" | "not_yet" | "backend_only";
}
Response 200 (application/json)
{
project?: any;
environment?: any;
environments: any[];
apiKey: string;
apiKeyId: string;
keys?: {
anon: string;
service_role: string;
};
}
Errors: 400, 401, 403, 404, 409, with the error body.
GET /projects/slug-available
| Parameter | In | Type | Required |
|---|
orgId | query | string (uuid) | Yes |
slug | query | string | Yes |
Response 200 (application/json)
{
slug: string;
available: boolean;
reason?: "taken" | "reserved" | "invalid";
}
Errors: 401, 403, with the error body.
GET /projects/{projectId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
project: {
id: string;
orgId: string;
name: string;
slug: string;
description: null | string;
regionKey: null | string;
defaultEnvironment: null | string;
promotionOrder: string[];
timezone: null | string;
features: any;
deactivatedAt: null | string (date-time);
deactivationReason: null | string;
lastActivityAt: string (date-time);
sleepWarningSentAt: null | string (date-time);
sleptAt: null | string (date-time);
frontendAnswer: null | "backend_only" | "bolt" | "cursor_claude_code" | "hand_written" | "lovable" | "not_yet" | "v0";
frontendAnsweredAt: null | string (date-time);
frontendPromptedAt: null | string (date-time);
deletedAt: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
environments: {
id: string;
projectId: string;
name: string;
type: string;
url: null | string;
customDomain: null | string;
customDomainVerified: boolean;
customDomainVerificationToken: null | string;
customDomainCnameVerified: boolean;
customDomainSslStatus: null | string;
customDomainSslExpiresAt: null | string (date-time);
isActive: boolean;
config: any;
createdAt: string (date-time);
updatedAt: string (date-time);
}[];
defaultEnvironmentId: null | string;
}
PATCH /projects/{projectId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
name?: string;
description?: string | null;
defaultEnvironment?: string;
timezone?: string;
}
Response 200 (application/json)
{
project?: any;
}
Errors: 400, 401, 403, 404, with the error body.
DELETE /projects/{projectId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: true;
purgeAfter: string;
graceDays: number;
}
Errors: 401, 403, 404, 409, with the error body.
GET /projects/{projectId}/frontend
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
answer: "lovable" | "v0" | "bolt" | "cursor_claude_code" | "hand_written" | "not_yet" | "backend_only";
answeredAt: string | null;
askInBlueprint: boolean;
}
Errors: 401, 403, 404, with the error body.
PUT /projects/{projectId}/frontend
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
answer: "lovable" | "v0" | "bolt" | "cursor_claude_code" | "hand_written" | "not_yet" | "backend_only";
} | {
dismissed: true;
}
Response 200 (application/json)
{
answer: "lovable" | "v0" | "bolt" | "cursor_claude_code" | "hand_written" | "not_yet" | "backend_only";
answeredAt: string | null;
askInBlueprint: boolean;
}
Errors: 400, 401, 403, 404, with the error body.
GET /projects/{projectId}/region
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
resources: {
projectId: string;
regionKey: string;
tenancyType: "dedicated_db" | "dedicated_stack" | "shared";
dbConnectionRef?: null | string;
runtimeRef?: null | string;
storageRef?: null | string;
region?: null | {
apiBaseUrl: string;
createdAt: string (date-time);
enabled: boolean;
id: string;
key: string;
name: string;
runtimeUrl: string;
storageEndpoint: string;
};
warnings?: string[];
};
}
POST /projects/{projectId}/region
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
regionKey: string;
tenancyType: "shared" | "dedicated_db" | "dedicated_stack";
}
Response 200 (application/json)
{
ok: true;
projectId: string;
regionKey: string;
tenancyType: string;
}
Errors: 400, 401, 403, 404, with the error body.
GET /projects/{projectId}/api-keys
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
keys: {
id: string;
createdAt: string (date-time);
revokedAt: null | string (date-time);
name: null | string;
envId: null | string;
scopes: any;
role: "anon" | "legacy" | "service_role";
lastUsedAt: null | string (date-time);
expiresAt: null | string (date-time);
keyPrefix: string;
revealable: boolean;
}[];
}
POST /projects/{projectId}/api-keys
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
name?: string;
role?: "anon" | "legacy";
envId?: string (uuid);
scopes?: ("crud" | "realtime" | "functions" | "storage")[];
expiresAt?: string (date-time);
}
Response 200 (application/json)
{
apiKeyId: string;
apiKey: string;
}
Errors: 401, 403, 404, with the error body.
POST /projects/{projectId}/api-keys/{keyId}/reveal
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
keyId | path | string | Yes |
Response 200 (application/json)
{
apiKey: string;
}
Errors: 401, 403, 404, 409, with the error body.
POST /projects/{projectId}/api-keys/split
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
anon: string;
service_role: string;
anonKeyId: string;
serviceKeyId: string;
}
Errors: 401, 403, 404, 409, with the error body.
POST /projects/{projectId}/api-keys/{keyId}/rotate
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
keyId | path | string | Yes |
Response 200 (application/json)
{
apiKeyId: string;
apiKey: string;
}
POST /projects/{projectId}/api-keys/{keyId}/revoke
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
keyId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
}
PATCH /projects/{projectId}/api-keys/{keyId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
keyId | path | string | Yes |
Request body (application/json, required)
{
name?: string;
scopes?: ("crud" | "realtime" | "functions" | "storage" | "mongodb")[];
expiresAt?: string (date-time) | null;
}
Response 200 (application/json)
{
ok: true;
apiKey: {
id: string;
name: string | null;
scopes?: any;
expiresAt: string | string (date-time);
lastUsedAt: string | string (date-time);
createdAt: string | string (date-time);
};
}
Errors: 400, 401, 403, 404, with the error body.
GET /projects/{projectId}/deletion-preview
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
services: number;
apiKeys: number;
deployTokens: number;
dedicatedDatabases: {
id: string;
name: string;
instanceType: string;
included: boolean;
blocks: boolean;
reason: string | null;
}[];
purgeAfter: string;
graceDays: number;
}
Errors: 401, 403, 404, with the error body.
GET /projects/{projectId}/settings
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
compute: {
tier: string;
diskSize: number;
region: string;
autoScaling: boolean;
maxInstances: number;
};
api: {
apiVersion: string;
rateLimit: null | number;
platformRateLimit: number;
corsEnabled: boolean;
corsOrigins: { [key: string]: any };
customDomain: string;
};
jwt: {
algorithm: string;
generation: number;
lastRotated: null | string;
};
addons: {
enabledAddons: ("ai-schema" | "edge-functions" | "realtime" | "storage")[];
currentTier: string;
};
}
GET /projects/{projectId}/settings/compute
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
tier: string;
diskSize: number;
region: string;
autoScaling: boolean;
maxInstances: number;
}
PATCH /projects/{projectId}/settings/compute
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
tier?: "enterprise" | "pro" | "scale" | "starter";
diskSize?: number;
autoScaling?: boolean;
maxInstances?: number;
}
Response 200 (application/json)
{
tier: string;
diskSize: any;
region: string;
autoScaling: any;
maxInstances: any;
}
GET /projects/{projectId}/settings/api
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
apiVersion: string;
rateLimit: null | number;
platformRateLimit: number;
corsEnabled: boolean;
corsOrigins: { [key: string]: any };
customDomain: string;
baseUrl: string;
projectEndpoint: string;
}
PATCH /projects/{projectId}/settings/api
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
apiVersion?: "v1" | "v2";
rateLimit?: null | number;
corsEnabled?: boolean;
corsOrigins?: string[];
customDomain?: string;
}
Response 200 (application/json)
{
apiVersion: any;
rateLimit: any;
platformRateLimit: number;
corsEnabled: any;
corsOrigins: any;
customDomain: any;
baseUrl: string;
projectEndpoint: string;
}
GET /projects/{projectId}/settings/jwt
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
algorithm: string;
generation: number;
lastRotated: null | string;
}
PATCH /projects/{projectId}/settings/jwt
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
algorithm?: "HS256";
accessTokenExpiry?: number;
refreshTokenExpiry?: number;
refreshTokenEnabled?: boolean;
rotateOnUse?: boolean;
}
Response 200 (application/json)
{
algorithm: string;
generation: any;
lastRotated: any;
}
POST /projects/{projectId}/settings/jwt/rotate
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
generation: number;
lastRotated: string;
algorithm: string;
}
GET /projects/{projectId}/settings/addons
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
enabledAddons: ("ai-schema" | "edge-functions" | "realtime" | "storage")[];
currentTier: "enterprise" | "free" | "scale";
}
PATCH /projects/{projectId}/settings/addons
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
enabledAddons: string[];
}
Response 200 (application/json)
{
enabledAddons: ("ai-schema" | "edge-functions" | "realtime" | "storage")[];
currentTier: "enterprise" | "free" | "scale";
}
GET /projects/{projectId}/members
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
members: {
userId: string;
name: string | null;
email: string | null;
avatarUrl: string | null;
orgRole: string;
projectRole: "owner" | "admin" | "developer" | "viewer";
effectiveRole: string;
addedAt: string;
}[];
}
Errors: 401, 403, 404, with the error body.
POST /projects/{projectId}/members
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
userId: string;
role: "admin" | "developer" | "owner" | "viewer";
}
Response 200 (application/json)
{
member: {
userId: string;
name: string | null;
email: string | null;
avatarUrl: string | null;
orgRole: string;
projectRole: "owner" | "admin" | "developer" | "viewer";
effectiveRole: string;
addedAt: string;
};
}
Errors: 400, 401, 403, 404, 409, with the error body.
PUT /projects/{projectId}/members
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
changes: {
userId: string (uuid);
role: "owner" | "admin" | "developer" | "viewer";
}[];
}
Response 200 (application/json)
{
members: {
userId: string;
name: string | null;
email: string | null;
avatarUrl: string | null;
orgRole: string;
projectRole: "owner" | "admin" | "developer" | "viewer";
effectiveRole: string;
addedAt: string;
}[];
}
Errors: 400, 401, 403, 404, 409, with the error body.
PUT /projects/{projectId}/members/{userId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Request body (application/json)
{
role: "admin" | "developer" | "owner" | "viewer";
}
Response 200 (application/json)
{
member: {
userId: string;
name: string | null;
email: string | null;
avatarUrl: string | null;
orgRole: string;
projectRole: "owner" | "admin" | "developer" | "viewer";
effectiveRole: string;
addedAt: string;
};
}
Errors: 400, 401, 403, 404, 409, with the error body.
DELETE /projects/{projectId}/members/{userId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
ok: true;
removed: boolean;
}
Errors: 400, 401, 403, 404, with the error body.
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Response 200 (application/json)
{
environments: {
id: string (uuid);
name: string;
type?: string | null;
createdAt?: string | string (date-time);
}[];
}
Errors: 400, 401, 403, with the error body.
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
envIds: (string (uuid))[];
}
Response 200 (application/json)
{
environments: {
id: string (uuid);
name: string;
type?: string | null;
createdAt?: string | string (date-time);
}[];
}
Errors: 400, 401, 403, with the error body.
POST /projects/{projectId}/environments/bootstrap
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
environments: {
id: string;
projectId: string;
name: string;
type: string;
url: null | string;
customDomain: null | string;
customDomainVerified: boolean;
customDomainVerificationToken: null | string;
customDomainCnameVerified: boolean;
customDomainSslStatus: null | string;
customDomainSslExpiresAt: null | string (date-time);
isActive: boolean;
config: any;
createdAt: string (date-time);
updatedAt: string (date-time);
}[];
}
POST /projects/{projectId}/environments/backfill-urls
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
updated: number;
environments: {
id: string;
projectId: string;
name: string;
type: string;
url: null | string;
customDomain: null | string;
customDomainVerified: boolean;
customDomainVerificationToken: null | string;
customDomainCnameVerified: boolean;
customDomainSslStatus: null | string;
customDomainSslExpiresAt: null | string (date-time);
isActive: boolean;
config: any;
createdAt: string (date-time);
updatedAt: string (date-time);
}[];
}
GET /projects/{projectId}/environments
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
environments: {
id: string;
projectId: string;
name: string;
type: string;
url: null | string;
customDomain: null | string;
customDomainVerified: boolean;
customDomainVerificationToken: null | string;
customDomainCnameVerified: boolean;
customDomainSslStatus: null | string;
customDomainSslExpiresAt: null | string (date-time);
isActive: boolean;
config: any;
createdAt: string (date-time);
updatedAt: string (date-time);
}[];
}
POST /projects/{projectId}/environments
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
name: string;
}
Response 200
No body.
Response 201 (application/json)
{
environment: {
config: any;
createdAt: string (date-time);
customDomain: null | string;
customDomainCnameVerified: boolean;
customDomainSslExpiresAt: null | string (date-time);
customDomainSslStatus: null | string;
customDomainVerificationToken: null | string;
customDomainVerified: boolean;
id: string;
isActive: boolean;
name: string;
projectId: string;
type: string;
updatedAt: string (date-time);
url: null | string;
};
}
PATCH /projects/{projectId}/environments/{envId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Request body (application/json)
{
customDomain?: null | string;
isActive?: boolean;
config?: { [key: string]: any };
}
Response 200 (application/json)
{
environment: {
id: string;
projectId: string;
name: string;
type: string;
url: null | string;
customDomain: null | string;
customDomainVerified: boolean;
customDomainVerificationToken: null | string;
customDomainCnameVerified: boolean;
customDomainSslStatus: null | string;
customDomainSslExpiresAt: null | string (date-time);
isActive: boolean;
config: any;
createdAt: string (date-time);
updatedAt: string (date-time);
};
domain?: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: any;
type: string;
host: string;
value: any;
found: boolean;
note?: any;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
DELETE /projects/{projectId}/environments/{envId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
}
GET /projects/{projectId}/environments/{envId}/domains
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
edgeConfigured: boolean;
maxDomains: number;
domains: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: any;
type: string;
host: string;
value: any;
found: boolean;
note?: any;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
}[];
}
POST /projects/{projectId}/environments/{envId}/domains
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Request body (application/json)
{
domain: string;
}
Response 200
No body.
POST /projects/{projectId}/environments/{envId}/domains/{domainId}/verify
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
domainId | path | string | Yes |
Response 200
No body.
Response 202 (application/json)
{
ok: boolean;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
DELETE /projects/{projectId}/environments/{envId}/domains/{domainId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
domainId | path | string | Yes |
Response 200
No body.
Response 202 (application/json)
{
ok: boolean;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
GET /projects/{projectId}/environments/{envId}/domain-verification
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200 (application/json)
{
customDomain: string;
verified: boolean;
verificationToken: null | string;
gcpConfigured: boolean;
edgeConfigured: boolean;
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
instructions: {
method: string;
host: string;
value: null | string;
ttl: number;
note: string;
};
cnameInstructions: null | {
method: string;
host: string;
value: null | string;
ttl: number;
note?: string;
};
certificateInstructions: null | {
method: string;
host: string;
value: null | string;
ttl: number;
note?: string;
};
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
POST /projects/{projectId}/environments/{envId}/verify-domain
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200
No body.
Response 202 (application/json)
{
queued: boolean;
verified: boolean;
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: string;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
POST /projects/{projectId}/environments/{envId}/verify-cname
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200
No body.
Response 202 (application/json)
{
queued: boolean;
verified: boolean;
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: string;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
POST /projects/{projectId}/environments/{envId}/provision-ssl
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200
No body.
Response 202 (application/json)
{
queued: boolean;
verified: boolean;
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: string;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
GET /projects/{projectId}/environments/{envId}/domain-status
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | path | string | Yes |
Response 200 (application/json)
{
configured: boolean;
customDomain: null;
status: null;
} | {
configured: boolean;
customDomain: string;
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
gcpConfigured: boolean;
edgeConfigured: boolean;
txtVerification: {
verified: boolean;
host: string;
value: null | string;
};
cnameVerification: {
verified: boolean;
host: string;
target: null | string;
type: string;
note?: string;
};
certificateVerification: null | {
host: string;
type: string;
value: null | string;
found: boolean;
};
ssl: {
status: null | string;
expiresAt: null | string (date-time);
};
autoUrl: any;
domain: {
id: string;
domain: string;
kind: "environment" | "service";
status: "active" | "failed" | "issuing_certificate" | "pending_dns" | "removing" | "verifying";
message: null | string;
ownershipVerified: boolean;
trafficPointed: boolean;
certificateStatus: null | string;
records: {
purpose: "certificate" | "ownership" | "traffic";
type: string;
host: string;
value: null | string;
found: boolean;
note?: string;
}[];
lastCheckedAt: null | string;
createdAt: null | string;
};
}
GET /projects/{id}/insights
AI-suggested project hardening insights (cached 24h, viewer role required)
| Parameter | In | Type | Required |
|---|
refresh | query | "true" | "false" | No |
id | path | string (uuid) | Yes |
Response 200 (application/json)
{
insights: {
id: string;
severity: "high" | "medium" | "low";
title: string;
description: string;
suggestedFix?: string;
learnMoreUrl?: string;
}[];
generatedAt: string;
cached: boolean;
source: "ai" | "fallback";
}
Errors: 401, 403, 404, 500, with the error body.
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
from | query | string | No |
to | query | string | No |
Response 200 (application/json)
{
diff: {
fromEnv: {
id: string;
name: string;
};
toEnv: {
id: string;
name: string;
};
schema: {
tablesAdded: string[];
tablesDropped: string[];
tablesModified: {
table: string;
columnsAdded: any[];
columnsDropped: any[];
columnsModified: any[];
indexesAdded: any[];
indexesDropped: any[];
}[];
hasDestructive: boolean;
};
functions: {
added: string[];
modified: string[];
removed: string[];
};
storage: {
bucketsAdded: string[];
bucketsModified: string[];
bucketsRemoved: string[];
hasDestructive: boolean;
};
addons: {
added: string[];
removed: string[];
};
hasDestructive: boolean;
totalChanges: number;
};
}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
promotions: any[];
}
POST /projects/{projectId}/promotions
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
fromEnvId: string (uuid);
toEnvId: string (uuid);
confirmSkip?: string;
allowProduction?: boolean;
dryRun?: boolean;
}
Response 200 (application/json)
{
promotion: {
completedAt: null | string (date-time);
createdAt: string (date-time);
deployerUserId: null | string;
deploymentId: null | string;
dryRun: boolean;
error: null | string;
fromEnvId: string;
id: string;
projectId: string;
status: string;
summary: any;
toEnvId: string;
};
diff: {
fromEnv: {
id: string;
name: string;
};
toEnv: {
id: string;
name: string;
};
schema: {
tablesAdded: string[];
tablesDropped: string[];
tablesModified: {
table: string;
columnsAdded: any[];
columnsDropped: any[];
columnsModified: any[];
indexesAdded: any[];
indexesDropped: any[];
}[];
hasDestructive: boolean;
};
functions: {
added: string[];
modified: string[];
removed: string[];
};
storage: {
bucketsAdded: string[];
bucketsModified: string[];
bucketsRemoved: string[];
hasDestructive: boolean;
};
addons: {
added: string[];
removed: string[];
};
hasDestructive: boolean;
totalChanges: number;
};
dryRun: boolean;
} | {
promotion: {
id: string;
projectId: string;
fromEnvId: string;
toEnvId: string;
status: string;
summary: any;
deployerUserId: null | string;
deploymentId: null | string;
dryRun: boolean;
error: null | string;
createdAt: string (date-time);
completedAt: null | string (date-time);
};
diff: {
fromEnv: {
id: string;
name: string;
};
toEnv: {
id: string;
name: string;
};
schema: {
tablesAdded: string[];
tablesDropped: string[];
tablesModified: {
table: string;
columnsAdded: any[];
columnsDropped: any[];
columnsModified: any[];
indexesAdded: any[];
indexesDropped: any[];
}[];
hasDestructive: boolean;
};
functions: {
added: string[];
modified: string[];
removed: string[];
};
storage: {
bucketsAdded: string[];
bucketsModified: string[];
bucketsRemoved: string[];
hasDestructive: boolean;
};
addons: {
added: string[];
removed: string[];
};
hasDestructive: boolean;
totalChanges: number;
};
deploymentId: string;
}
GET /projects/{projectId}/branches
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
branches: any[];
}
POST /projects/{projectId}/branches
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
branchName: string;
copyFromEnvId?: string;
}
Response 200
No body.
Response 201 (application/json)
{
branch: {
status: string;
previewUrl: string;
branchName: string;
createdAt: string (date-time);
createdByUserId: null | string;
errorMessage: null | string;
expiresAt: null | string (date-time);
id: string;
lastActiveAt: string (date-time);
metadata: any;
projectId: string;
schemaName: string;
};
}
GET /projects/{projectId}/branches/{branchName}/url
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
branchName | path | string | Yes |
Response 200 (application/json)
{
branchName: string;
previewUrl: string;
wildcardDnsConfigured: boolean;
note: string;
}
DELETE /projects/{projectId}/branches/{branchName}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
branchName | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
}
POST /projects/{projectId}/db/reset
Drop every table, view, sequence, function and type in one environment's database schema
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
envId?: string (uuid);
confirm?: string;
allowProduction?: boolean;
dryRun?: boolean;
}
Response 200 (application/json)
{
ok: true;
dryRun: boolean;
environment: {
id: string;
name: string;
production: boolean;
};
schemaName: string;
schemaExists: boolean;
objects: {
tables: string[];
views: string[];
materializedViews: string[];
foreignTables: string[];
sequences: string[];
functions: string[];
types: string[];
};
snapshotId?: string | null;
}
Errors: 400, 401, 403, 404, 409, 500, with the error body.
GET /projects/{projectId}/getting-started
The project's getting-started steps (latched) and whether I hid the card
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
steps: {
key: "add_tables" | "connect_app" | "create_project" | "deploy_function" | "enable_realtime";
done: boolean;
doneAt: null | string;
}[];
doneCount: number;
hidden: boolean;
}
PUT /projects/{projectId}/getting-started/hidden
Hide or show the getting-started card for me
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
hidden: boolean;
}
Response 200 (application/json)
{
hidden: boolean;
}
GET /projects/{projectId}/storage/settings
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
settings: {
id: string;
projectId: string;
defaultFileSizeLimit: number;
maxFileSizeLimit: number;
allowedMimeTypes: any;
blockedMimeTypes: any;
enableImageTransform: boolean;
allowedTransforms: any;
maxImageDimension: number;
cdnEnabled: boolean;
defaultCacheTtl: number;
edgeCachingEnabled: boolean;
signedUrlDefaultExpiry: number;
signedUrlMaxExpiry: number;
webhookEnabled: boolean;
webhookUrl: null | string;
webhookEvents: any;
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
PATCH /projects/{projectId}/storage/settings
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
defaultFileSizeLimit?: number;
maxFileSizeLimit?: number;
allowedMimeTypes?: string[] | null;
blockedMimeTypes?: string[];
enableImageTransform?: boolean;
allowedTransforms?: string[];
maxImageDimension?: number;
cdnEnabled?: boolean;
defaultCacheTtl?: number;
edgeCachingEnabled?: boolean;
signedUrlDefaultExpiry?: number;
signedUrlMaxExpiry?: number;
webhookEnabled?: boolean;
webhookUrl?: string (uri) | null;
webhookEvents?: string[];
}
Response 200 (application/json)
{
settings?: any;
}
Errors: 401, 403, with the error body.
GET /projects/{projectId}/env-vars
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envId | query | string | No |
Response 200 (application/json)
{
envVars: {
id: string;
projectId: string;
envId: null | string;
key: string;
value: string;
isPublic: boolean;
environment: string;
updatedAt: string (date-time);
updatedBy: string;
}[];
}
POST /projects/{projectId}/env-vars
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
envId?: string (uuid);
key: string;
value: string;
isPublic?: boolean;
}
Response 200 (application/json)
{
envVar: {
id: string;
projectId: string;
envId: null | string;
key: string;
value: string;
isPublic: boolean;
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
PATCH /projects/{projectId}/env-vars/{envVarId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envVarId | path | string | Yes |
Request body (application/json)
{
value?: string;
isPublic?: boolean;
allowProduction?: boolean;
}
Response 200 (application/json)
{
envVar: {
id: string;
projectId: string;
envId: null | string;
key: string;
value: string;
isPublic: boolean;
updatedAt: string (date-time);
};
}
DELETE /projects/{projectId}/env-vars/{envVarId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
envVarId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
id: string;
}
GET /projects/{projectId}/security/advisor
| Parameter | In | Type | Required |
|---|
envId | query | string | No |
projectId | path | string | Yes |
Response 200 (application/json)
{
projectId: string;
environment: {
id: string;
name: string;
} | null;
checks: {
id: string;
status: "fix" | "review" | "nodata" | "passed";
title: string;
detail: (string | {
mono: string;
})[];
source: string;
action?: {
label: string;
to: string;
};
}[];
}
Errors: 401, 403, 404, with the error body.
GET /projects/{projectId}/database/dedicated
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
instance: {
id: string;
projectId: string;
tier: string;
tierDefinition: null | {
tier: "2xl" | "3xl" | "4xl" | "custom" | "high-memory-large" | "high-memory-medium" | "high-memory-xl" | "large" | "medium" | "micro" | "small" | "xl";
displayName: string;
vcpus: number | "shared";
ramGb: number;
storageGb: number;
maxConnections: number;
gcpInstanceType: string;
estimatedMonthlyCostCents: number;
description: string;
haAvailable: boolean;
haMonthlyCostMultiplier: number;
category: "enterprise" | "high-memory" | "standard";
};
customConfig: null | {
vcpus: null | number;
ramGb: null | number;
storageGb: null | number;
};
postgresVersion: string;
region: string;
status: string;
statusMessage: null | string;
privateIpEnabled: boolean;
publicIpEnabled: boolean;
provisionedAt: null | string (date-time);
lastScaledAt: null | string (date-time);
estimatedMonthlyCostCents: null | number;
createdAt: string (date-time);
};
}
POST /projects/{projectId}/database/dedicated
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
tier: "micro" | "small" | "medium" | "large" | "xl" | "2xl" | "custom";
region?: string;
postgresVersion?: string;
customVcpus?: number;
customRamGb?: number;
customStorageGb?: number;
}
Response 200 (application/json)
any
Response 201 (application/json)
{
ok: boolean;
instanceId: string;
status: string;
estimatedCost: {
monthlyCents: number;
monthlyUsd: string;
};
message: string;
}
Errors: 400, 401, 403, 404, 500, with the error body.
DELETE /projects/{projectId}/database/dedicated
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
message: string;
serviceAccess: {
revoked: string[];
queued: string[];
failed: string[];
};
}
GET /projects/{projectId}/database/dedicated/status
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
status: string;
message: null | string;
host: null | string;
} | {
status: string;
message: null | string;
}
GET /projects/{projectId}/database/dedicated/connection
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
connectionString: string;
host?: string;
port: number;
database: string;
username: string;
sslRequired: boolean;
}
POST /projects/{projectId}/database/dedicated/restart
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
message: string;
}
GET /projects/{projectId}/users
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
users: {
id: string;
email: null | string;
phone: null | string;
provider: string;
emailVerifiedAt: null | string (date-time);
phoneVerifiedAt: null | string (date-time);
lastSignInAt: null | string (date-time);
lastActiveAt: null | string (date-time);
metadata: any;
banned: boolean;
bannedAt: null | string (date-time);
bannedReason: null | string;
createdAt: string (date-time);
}[];
pagination: {
page: number;
limit: number;
total: number;
totalPages: number;
};
}
POST /projects/{projectId}/users
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
email?: string (email);
phone?: string;
password?: string;
provider?: string;
metadata?: { [key: string]: any };
}
Response 201 (application/json)
{
user: {
id: string;
email: string | null;
phone: string | null;
provider: string | null;
metadata?: any;
createdAt: string | string (date-time);
};
}
Errors: 400, 401, 403, 409, with the error body.
GET /projects/{projectId}/users/{userId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
user: {
id: string;
email: null | string;
phone: null | string;
provider: string;
emailVerifiedAt: null | string (date-time);
phoneVerifiedAt: null | string (date-time);
lastSignInAt: null | string (date-time);
lastActiveAt: null | string (date-time);
metadata: any;
appMetadata: any;
banned: boolean;
bannedAt: null | string (date-time);
bannedReason: null | string;
createdAt: string (date-time);
updatedAt: string (date-time);
};
activeSessions: number;
mfaEnrolled: boolean;
mfaEnrolledAt: string (date-time);
identities: {
provider: string;
email: null | string;
emailVerified: boolean;
lastSignInAt: null | string (date-time);
createdAt: string (date-time);
}[];
}
PATCH /projects/{projectId}/users/{userId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Request body (application/json, required)
{
email?: string (email);
phone?: string;
metadata?: { [key: string]: any };
appMetadata?: { [key: string]: any };
banned?: boolean;
bannedReason?: string;
}
Response 200 (application/json)
{
user: {
id: string;
email: string | null;
phone: string | null;
provider: string | null;
metadata?: any;
appMetadata?: any;
banned: boolean | null;
bannedAt: string | string (date-time);
bannedReason: string | null;
updatedAt: string | string (date-time);
};
}
Errors: 401, 403, 404, with the error body.
DELETE /projects/{projectId}/users/{userId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
success: boolean;
}
POST /projects/{projectId}/users/{userId}/ban
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Request body (application/json, required)
{
reason?: string;
}
Response 200 (application/json)
{
success: true;
}
Errors: 401, 403, 404, with the error body.
POST /projects/{projectId}/users/{userId}/unban
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
success: boolean;
}
GET /projects/{projectId}/users/{userId}/sessions
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
sessions: {
id: string;
userAgent: null | string;
ipAddress: null | string;
deviceInfo: any;
lastActiveAt: string (date-time);
expiresAt: string (date-time);
revokedAt: null | string (date-time);
createdAt: string (date-time);
}[];
}
DELETE /projects/{projectId}/users/{userId}/sessions/{sessionId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
sessionId | path | string | Yes |
Response 200 (application/json)
{
success: boolean;
}
POST /projects/{projectId}/users/{userId}/sessions/revoke-all
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Response 200 (application/json)
{
success: boolean;
}
GET /projects/{projectId}/auth/settings
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
settings: any;
}
PATCH /projects/{projectId}/auth/settings
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
minPasswordLength?: number;
requireUppercase?: boolean;
requireNumbers?: boolean;
requireSpecialChars?: boolean;
maxSignInAttempts?: number;
lockoutDurationMinutes?: number;
accessTokenLifetimeMinutes?: number;
refreshTokenLifetimeDays?: number;
singleSessionMode?: boolean;
allowSignUp?: boolean;
allowPasswordRecovery?: boolean;
requireEmailVerification?: boolean;
requirePhoneVerification?: boolean;
mfaEnabled?: boolean;
mfaEnforced?: boolean;
allowMagicLink?: boolean;
leakDupeEmail?: boolean;
allowedRedirectUrls?: string[];
userTableName?: string | null;
userTableAutoCreate?: boolean;
userTableSyncFields?: string[];
}
Response 200 (application/json)
{
settings?: any;
}
Errors: 401, 403, with the error body.
POST /projects/{projectId}/auth/sync-users
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
synced: number;
errors: number;
errorDetails?: string[];
}
GET /projects/{projectId}/auth/oauth-apps
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
apps: any[];
providers: {
id: "github" | "google";
name: string;
callbackUrl: string;
}[];
comingSoon: "apple"[];
}
PUT /projects/{projectId}/auth/oauth-apps/{provider}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
provider | path | string | Yes |
Request body (application/json, required)
{
clientId: string;
clientSecret?: string;
redirectUri?: string (uri);
scopes?: string[];
enabled?: boolean;
}
Response 200 (application/json)
{
app: {
id: string;
provider: string;
clientId: string;
clientSecretHint: string | null;
redirectUri: string | null;
scopes?: any;
enabled: boolean | null;
createdAt: string | string (date-time);
updatedAt: string | string (date-time);
};
}
Errors: 400, 401, 403, with the error body.
DELETE /projects/{projectId}/auth/oauth-apps/{provider}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
provider | path | string | Yes |
Response 200 (application/json)
{
success: boolean;
}
POST /projects/{projectId}/auth/login
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
email?: string (email);
password?: string;
}
Response 200 (application/json)
{
ok: true;
accessToken: string;
expiresIn: number;
refreshToken?: string;
refreshTokenExpiresIn?: number;
refreshTokenExpiresAt?: string;
user: {
id: string;
email: string | null;
phone?: string | null;
provider?: string | null;
metadata?: any;
};
} | {
ok: true;
mfaRequired: true;
challengeToken: string;
}
Errors: 400, 401, 403, 404, 423, 429, with the error body.
POST /projects/{projectId}/auth/refresh
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
refreshToken?: string;
refreshTokenExpiresIn?: number;
refreshTokenExpiresAt?: string;
ok: true;
accessToken: string;
expiresIn: number;
user: {
id: any;
email: any;
phone: any;
provider: any;
metadata: any;
};
} | {
ok: true;
accessToken: string;
expiresIn: number;
user: {
id: any;
email: any;
phone: any;
provider: any;
metadata: any;
};
}
GET /projects/{projectId}/auth/me
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
user: {
id: any;
email: any;
phone: any;
provider: any;
metadata: any;
emailVerifiedAt: any;
createdAt: any;
};
}
POST /projects/{projectId}/auth/logout
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
}
POST /projects/{projectId}/auth/signup
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
email?: string (email);
password?: string;
phone?: string;
metadata?: { [key: string]: any };
}
Response 201 (application/json)
{
ok: true;
accessToken?: string;
expiresIn?: number;
refreshToken?: string;
refreshTokenExpiresIn?: number;
refreshTokenExpiresAt?: string;
pendingVerification?: boolean;
message?: string;
user?: {
id: string;
email: string | null;
phone: string | null;
provider: string | null;
metadata?: any;
createdAt: string | string (date-time);
};
}
Errors: 400, 403, 404, 409, 429, with the error body.
POST /projects/{projectId}/auth/forgot-password
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
email?: string (email);
}
Response 200 (application/json)
{
ok: true;
message: string;
resetToken?: string;
}
Errors: 400, 403, 404, 429, with the error body.
POST /projects/{projectId}/auth/reset-password
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
token?: string;
password?: string;
}
Response 200 (application/json)
{
ok: true;
message: string;
}
Errors: 400, 404, 429, with the error body.
POST /projects/{projectId}/auth/verify-email/send
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
message: string;
} | {
ok: boolean;
message: string;
verificationToken?: string;
}
POST /projects/{projectId}/auth/verify-email/confirm
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json, required)
{
token?: string;
}
Response 200 (application/json)
{
ok: true;
message: string;
}
Errors: 400, 404, 429, with the error body.
POST /projects/{projectId}/auth/mfa/enroll-start
Begin TOTP MFA enrollment for the current project user
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Response 200 (application/json)
{
enrollToken: string;
otpauthUri: string;
secret: string;
expiresInSeconds: number;
}
Errors: 401, 403, 409, 429, with the error body.
POST /projects/{projectId}/auth/mfa/enroll-confirm
Confirm TOTP MFA enrollment with the first valid code
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
enrollToken: string;
code: string;
}
Response 200 (application/json)
{
ok: true;
backupCodes: string[];
}
Errors: 400, 401, 403, 409, 429, with the error body.
POST /projects/{projectId}/auth/mfa/verify
Verify a TOTP / backup code against a login challenge
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
challengeToken: string;
code: string;
}
Response 200 (application/json)
{
ok: true;
accessToken: string;
expiresIn: number;
refreshToken?: string;
refreshTokenExpiresIn?: number;
refreshTokenExpiresAt?: string;
user: {
id: string;
email: string | null;
phone: string | null;
provider: string | null;
metadata?: any;
};
}
Errors: 400, 401, 429, with the error body.
POST /projects/{projectId}/auth/mfa/disable
Disable TOTP MFA for the current project user
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
code: string;
}
Response 200 (application/json)
{
ok: true;
}
Errors: 400, 401, 403, with the error body.
POST /projects/{projectId}/auth/mfa/regenerate-codes
Regenerate MFA backup codes (TOTP code required)
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
code: string;
}
Response 200 (application/json)
{
ok: true;
backupCodes: string[];
}
Errors: 400, 401, 403, with the error body.
POST /projects/{projectId}/auth/magic/send
Send a passwordless sign-in link to an email address
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
email: string (email);
redirectUrl?: string (uri);
refreshMode?: "cookie" | "body";
}
Response 200 (application/json)
{
ok: true;
}
Errors: 400, 404, 429, with the error body.
GET /projects/{projectId}/auth/magic/consume
Consume a magic-link token and start a session (browser flow)
| Parameter | In | Type | Required |
|---|
token | query | string | Yes |
refresh_mode | query | "cookie" | "body" | No |
projectId | path | string (uuid) | Yes |
Response 200
No body.
GET /projects/{projectId}/auth/sessions
List the current project user's active device sessions
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Response 200 (application/json)
{
sessions: {
id: string (uuid);
userAgent: string | null;
ipAddress: string | null;
createdAt: string | string (date-time);
lastActiveAt: string | string (date-time);
isCurrent: boolean;
}[];
}
Errors: 401, 403, 429, with the error body.
DELETE /projects/{projectId}/auth/sessions
Revoke all of the current project user's sessions except this one
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Response 200 (application/json)
{
ok: true;
revoked: number;
ids: (string (uuid))[];
}
Errors: 401, 403, 429, with the error body.
DELETE /projects/{projectId}/auth/sessions/{id}
Revoke one of the current project user's sessions
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
id | path | string (uuid) | Yes |
Response 200 (application/json)
{
ok: true;
id: string (uuid);
}
Errors: 401, 403, 404, 429, with the error body.
GET /projects/{projectId}/auth/oauth/providers
List the social sign-in providers turned on for this project
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Response 200 (application/json)
{
providers: {
id: string;
name: string;
}[];
}
Errors: 429, with the error body.
POST /projects/{projectId}/auth/oauth/{provider}/start
Start Google or GitHub sign-in for an app user — answers the consent page URL
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
provider | path | string | Yes |
Request body (application/json, required)
{
redirectUrl: string;
codeChallenge: string;
codeChallengeMethod?: "S256";
state?: string;
}
Response 200 (application/json)
{
ok: true;
url: string;
expiresIn: number;
}
Errors: 400, 404, 429, with the error body.
GET /projects/{projectId}/auth/oauth/{provider}/callback
Provider callback for app-user social sign-in (browser redirect)
| Parameter | In | Type | Required |
|---|
code | query | string | No |
state | query | string | No |
error | query | string | No |
error_description | query | string | No |
projectId | path | string (uuid) | Yes |
provider | path | string | Yes |
Response 200
No body.
POST /projects/{projectId}/auth/oauth/token
Exchange the one-time social sign-in code and PKCE verifier for a session
| Parameter | In | Type | Required |
|---|
projectId | path | string (uuid) | Yes |
Request body (application/json, required)
{
code: string;
codeVerifier: string;
}
Response 200 (application/json)
{
ok: true;
accessToken: string;
expiresIn: number;
refreshToken?: string;
refreshTokenExpiresIn?: number;
refreshTokenExpiresAt?: string;
isNewUser: boolean;
user: {
id: string;
email: string | null;
phone?: string | null;
provider?: string | null;
metadata?: any;
};
} | {
ok: true;
mfaRequired: true;
challengeToken: string;
}
Errors: 400, 403, 423, 429, with the error body.
GET /projects/{projectId}/users/stats
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
total: number;
verified: number;
banned: number;
providers: {
[key: string]: number;
};
activeUsers: number;
newUsers: number;
period: {
start: string;
end: string;
};
}
GET /projects/{projectId}/auth/activity
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | query | string | No |
action | query | string | No |
limit | query | number | No |
offset | query | number | No |
Response 200 (application/json)
{
entries: {
id: string;
action: string;
actorType: string;
actorUserId: null | string;
targetType: string;
targetId: null | string;
createdAt: string (date-time);
meta: null | { [key: string]: any };
}[];
total: number;
limit: number;
offset: number;
}
POST /projects/{projectId}/users/{userId}/send-magic-link
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
userId | path | string | Yes |
Request body (application/json)
{
redirectUrl?: string;
}
Response 200 (application/json)
{
ok: boolean;
}
GET /projects/{projectId}/infrastructure
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
instances: {
gradeLabel: string;
deleteConfirmation: string;
billed: boolean;
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
}[];
includedDatabase: null | {
state: "active" | "failed" | "none" | "setting_up";
thisProject: "moving" | "not_using" | "owner" | "sharing";
projects: {
id: string;
name: any;
routed: boolean;
}[];
instance: null | {
gradeLabel: string;
deleteConfirmation: string;
billed: boolean;
category: string;
connectionPoolSize: any;
cpuCores: any;
createdAt: string (date-time);
dbName: any;
errorMessage: any;
graceExpiresAt: any;
highAvailability: boolean;
host: any;
id: string;
instanceType: string;
iops: any;
isPlanIncluded: boolean;
lastHealthCheck: any;
maxConnections: any;
memoryMb: any;
monthlyPriceCents: number;
orgId: string;
parentInstanceId: any;
port: any;
projectId: string;
provisionedAt: any;
restorePointInTime: any;
restoredFromInstanceId: any;
status: string;
storageOverageSubscriptionItemId: any;
storageSizeGb: any;
stripeSubscriptionItemId: any;
updatedAt: string (date-time);
};
};
routing: {
tenancyType: string;
};
}
POST /projects/{projectId}/infrastructure/provision
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
instanceType: "2xlarge" | "3xlarge" | "4xlarge" | "high-memory-large" | "high-memory-medium" | "high-memory-xlarge" | "large" | "medium" | "micro" | "small" | "xlarge";
category: "compute" | "database" | "storage";
provider?: string;
}
Response 200
No body.
Response 201 (application/json)
{
instance: {
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
POST /projects/{projectId}/infrastructure/provision-preview
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
instanceType: "2xlarge" | "3xlarge" | "4xlarge" | "high-memory-large" | "high-memory-medium" | "high-memory-xlarge" | "large" | "medium" | "micro" | "small" | "xlarge";
}
Response 200 (application/json)
{
instanceType: "2xlarge" | "3xlarge" | "4xlarge" | "high-memory-large" | "high-memory-medium" | "high-memory-xlarge" | "large" | "medium" | "micro" | "small" | "xlarge";
displayName: string;
monthlyPriceCents: number;
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
gradeLabel: string;
billedTo: "subscription";
storageOverageCentsPerGbMonth: number;
includedStorageGb: number;
proratedTodayCents: null;
chargedTodayCents: null;
chargedTodayTaxCents: null;
periodEnd: null;
prorationUnavailable: string;
} | {
instanceType: "2xlarge" | "3xlarge" | "4xlarge" | "high-memory-large" | "high-memory-medium" | "high-memory-xlarge" | "large" | "medium" | "micro" | "small" | "xlarge";
displayName: string;
monthlyPriceCents: number;
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
gradeLabel: string;
billedTo: "subscription";
storageOverageCentsPerGbMonth: number;
includedStorageGb: number;
proratedTodayCents: number;
chargedTodayCents: null | number;
chargedTodayTaxCents: null | number;
periodEnd: null | string;
prorationUnavailable: null;
}
POST /projects/{projectId}/infrastructure/included/retry
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
outcome: "existing" | "shared";
}
Response 202 (application/json)
{
ok: boolean;
outcome: "provisioned";
}
POST /projects/{projectId}/infrastructure/{instanceId}/resize
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Request body (application/json)
{
instanceType: "2xlarge" | "3xlarge" | "4xlarge" | "high-memory-large" | "high-memory-medium" | "high-memory-xlarge" | "large" | "medium" | "micro" | "small" | "xlarge";
}
Response 200 (application/json)
{
instance: {
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
GET /projects/{projectId}/infrastructure/{instanceId}/upgrade-options
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
instanceId: string;
currentInstanceType: string;
currentCostCents: number;
currentStorageGb: null | number;
options: {
instanceType: string;
displayName: string;
cpuCores: number;
memoryMb: number;
storageSizeGb: number;
maxConnections: number;
iops: number;
monthlyPriceCents: number;
costDiffCents: number;
direction: "downgrade" | "upgrade";
available: boolean;
reason: null | string;
description: string;
gradeLabel: string;
}[];
customSizing: {
available: boolean;
validVcpus: (16 | 1 | 2 | 32 | 4 | 64 | 8 | 96)[];
minRamPerVcpuGb: number;
maxRamPerVcpuGb: number;
maxStorageGb: number;
minStorageGb: number;
} | {
available: boolean;
};
}
POST /projects/{projectId}/infrastructure/provision-custom
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
category: "database";
vcpus: number;
ramGb: number;
storageGb: number;
enableHA?: boolean;
}
Response 200
No body.
Response 201 (application/json)
{
instance: {
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
POST /projects/{projectId}/infrastructure/{instanceId}/resize-custom
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Request body (application/json)
{
vcpus: number;
ramGb: number;
storageGb?: number;
enableHA?: boolean;
}
Response 200 (application/json)
{
instance: {
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
POST /projects/{projectId}/infrastructure/{instanceId}/stop
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
status: string;
billingContinues: boolean;
message: string;
}
POST /projects/{projectId}/infrastructure/{instanceId}/start
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
status: string;
}
DELETE /projects/{projectId}/infrastructure/{instanceId}
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Request body (application/json)
{
confirmation: string;
}
Response 200 (application/json)
{
ok: boolean;
}
POST /projects/{projectId}/infrastructure/{instanceId}/migrate-now
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
message: string;
}
GET /projects/{projectId}/infrastructure/{instanceId}/metrics
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
instanceId: string;
status: string;
source: string;
metrics: {
cpuPercent: number;
memoryPercent: number;
storageUsedGb: number;
storageTotalGb: number;
activeConnections: number;
maxConnections: number;
iopsUsed: number;
iopsMax: number;
};
lastHealthCheck: null | string (date-time);
collectedAt: string;
} | {
instanceId: string;
status: string;
source: string;
metrics: null;
lastHealthCheck: null | string (date-time);
collectedAt: string;
}
GET /projects/{projectId}/infrastructure/migration-status
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
migration: null;
} | {
ok: boolean;
migration: {
id: string;
status: string;
tablesTotal: number;
tablesCopied: number;
rowsTotal: number;
rowsCopied: number;
bytesTotal: number;
bytesCopied: number;
errorMessage: null | string;
retryCount: number;
maxRetries: number;
startedAt: null | string (date-time);
completedAt: null | string (date-time);
createdAt: string (date-time);
verifications: {
tableName: string;
sourceRowCount: null | number;
destRowCount: null | number;
matches: false | true | null;
verifiedAt: null | string (date-time);
}[];
};
}
POST /projects/{projectId}/infrastructure/migration/retry
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
jobId: string;
retryCount: number;
}
POST /projects/{projectId}/infrastructure/migration/rollback
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
jobId: string;
status: string;
}
GET /projects/{projectId}/infrastructure/migration/progress
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
jobId: string;
status: string;
tablesTotal: number;
tablesCopied: number;
rowsTotal: number;
rowsCopied: number;
errorMessage: null | string;
completedAt: null | string (date-time);
}
POST /projects/{projectId}/infrastructure/{instanceId}/replica
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200
No body.
Response 201 (application/json)
{
replica: {
id: string;
projectId: string;
orgId: string;
instanceType: string;
category: string;
parentInstanceId: null | string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string (date-time);
status: string;
errorMessage: null | string;
host: null | string;
port: null | number;
dbName: null | string;
connectionPoolSize: null | number;
cpuCores: null | number;
memoryMb: null | number;
storageSizeGb: null | number;
maxConnections: null | number;
iops: null | number;
monthlyPriceCents: number;
isPlanIncluded: boolean;
stripeSubscriptionItemId: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
storageOverageSubscriptionItemId: null | string;
provisionedAt: null | string (date-time);
lastHealthCheck: null | string (date-time);
createdAt: string (date-time);
updatedAt: string (date-time);
};
}
POST /projects/{projectId}/infrastructure/{instanceId}/replica-preview
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
instanceType: string;
displayName: null | string;
monthlyPriceCents: number;
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
gradeLabel: string;
billedTo: "subscription";
maxReplicas: number;
liveReplicas: number;
includedStorageGb: number;
storageOverageCentsPerGbMonth: number;
startingStorageOverageGb: null | number;
proratedTodayCents: null;
chargedTodayCents: null;
chargedTodayTaxCents: null;
periodEnd: null;
prorationUnavailable: string;
} | {
instanceType: string;
displayName: null | string;
monthlyPriceCents: number;
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
gradeLabel: string;
billedTo: "subscription";
maxReplicas: number;
liveReplicas: number;
includedStorageGb: number;
storageOverageCentsPerGbMonth: number;
startingStorageOverageGb: null | number;
proratedTodayCents: number;
chargedTodayCents: null | number;
chargedTodayTaxCents: null | number;
periodEnd: null | string;
prorationUnavailable: null;
}
GET /projects/{projectId}/infrastructure/{instanceId}/replicas
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Response 200 (application/json)
{
replicas: {
gradeLabel: string;
lagSeconds: null | number;
deleteConfirmation: string;
billed: boolean;
deletable: boolean;
category: string;
connectionPoolSize: null | number;
cpuCores: null | number;
createdAt: string (date-time);
dbName: null | string;
errorMessage: null | string;
graceExpiresAt: null | string (date-time);
highAvailability: boolean;
host: null | string;
id: string;
instanceType: string;
iops: null | number;
isPlanIncluded: boolean;
lastHealthCheck: null | string (date-time);
maxConnections: null | number;
memoryMb: null | number;
monthlyPriceCents: number;
orgId: string;
parentInstanceId: null | string;
port: null | number;
projectId: string;
provisionedAt: null | string (date-time);
restorePointInTime: null | string (date-time);
restoredFromInstanceId: null | string;
status: string;
storageOverageSubscriptionItemId: null | string;
storageSizeGb: null | number;
stripeSubscriptionItemId: null | string;
updatedAt: string (date-time);
}[];
eligibility: {
allowed: boolean;
code: null | "IS_REPLICA" | "LIMIT" | "NOT_ACTIVE" | "NOT_DATABASE" | "NOT_MANAGED" | "PAUSED" | "PLAN" | "SIZE";
reason: null | string;
maxReplicas: number;
liveReplicas: number;
instanceType: string;
displayName: null | string;
monthlyPriceCents: null | number;
};
}
GET /projects/{projectId}/infrastructure/restores
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
coverage: "dedicated" | "shared";
sharedRestore: "not_covered" | "on_request";
available: boolean;
reason: null | {
code: string;
message: string;
};
retentionDays: number;
window: null | {
earliest: null | string;
latest: null | string;
};
source: null | {
id: string;
instanceType: string;
displayName: string;
dbName: null | string;
isPlanIncluded: boolean;
isRestoredCopy: boolean;
};
readsInstanceId: null | string;
switchBack: null | {
instanceId: string;
available: boolean;
confirmation: string;
};
restores: {
id: string;
status: string;
instanceType: string;
displayName: string;
restoredFromInstanceId: null | string;
restorePointInTime: null | string;
monthlyPriceCents: number;
errorMessage: null | string;
createdAt: null | string;
provisionedAt: null | string;
inUse: boolean;
canSwitch: boolean;
confirmation: string;
}[];
maxCopies: number;
}
POST /projects/{projectId}/infrastructure/restores
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
pointInTime?: any;
}
Response 200
No body.
POST /projects/{projectId}/infrastructure/restores/preview
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
pointInTime?: any;
}
Response 200 (application/json)
{
instanceType: string;
displayName: string;
monthlyPriceCents: number;
gradeLabel: string;
billedTo: "subscription";
storageOverageCentsPerGbMonth: number;
includedStorageGb: number;
sourceDiskGb: null | number;
startingOverageGb: null | number;
startingOverageMonthlyCents: null | number;
discount: null | {
percentOff: null | number;
amountOffCents: null | number;
endsAt: null | string;
};
window: {
earliest: null | string;
latest: null | string;
retentionDays: number;
};
pointInTime: null | {
ok: false;
code: "RESTORE_POINT_INVALID" | "RESTORE_POINT_TOO_EARLY" | "RESTORE_POINT_TOO_LATE";
message: string;
} | {
ok: boolean;
at: null | string;
};
proratedTodayCents: null;
periodEnd: null;
prorationUnavailable: string;
} | {
instanceType: string;
displayName: string;
monthlyPriceCents: number;
gradeLabel: string;
billedTo: "subscription";
storageOverageCentsPerGbMonth: number;
includedStorageGb: number;
sourceDiskGb: null | number;
startingOverageGb: null | number;
startingOverageMonthlyCents: null | number;
discount: null | {
percentOff: null | number;
amountOffCents: null | number;
endsAt: null | string;
};
window: {
earliest: null | string;
latest: null | string;
retentionDays: number;
};
pointInTime: null | {
ok: false;
code: "RESTORE_POINT_INVALID" | "RESTORE_POINT_TOO_EARLY" | "RESTORE_POINT_TOO_LATE";
message: string;
} | {
ok: boolean;
at: null | string;
};
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
proratedTodayCents: null;
periodEnd: null;
prorationUnavailable: string;
} | {
instanceType: string;
displayName: string;
monthlyPriceCents: number;
gradeLabel: string;
billedTo: "subscription";
storageOverageCentsPerGbMonth: number;
includedStorageGb: number;
sourceDiskGb: null | number;
startingOverageGb: null | number;
startingOverageMonthlyCents: null | number;
window: {
earliest: null | string;
latest: null | string;
retentionDays: number;
};
pointInTime: null | {
ok: false;
code: "RESTORE_POINT_INVALID" | "RESTORE_POINT_TOO_EARLY" | "RESTORE_POINT_TOO_LATE";
message: string;
} | {
ok: boolean;
at: null | string;
};
billingInterval: "monthly" | "yearly";
annualPriceCents: null | number;
chargedNow: boolean;
proratedTodayCents: number;
periodEnd: null | string;
prorationUnavailable: null;
discount: null | {
percentOff: null | number;
amountOffCents: null | number;
endsAt: null | string;
};
chargedTodayCents: null | number;
chargedTodayTaxCents: null | number;
}
POST /projects/{projectId}/infrastructure/{instanceId}/switch
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
instanceId | path | string | Yes |
Request body (application/json)
{
confirmation?: string;
}
Response 200 (application/json)
{
ok: boolean;
readsInstanceId: string;
previousInstanceId: string;
}
POST /projects/{projectId}/github/connect
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
accessToken: string;
refreshToken?: string;
scope?: string;
}
Response 200 (application/json)
{
ok: boolean;
username: string;
avatarUrl: string;
}
GET /projects/{projectId}/github/status
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
connected: boolean;
} | {
id: string;
githubUsername: string;
githubAvatarUrl: null | string;
scope: string;
isActive: boolean;
lastUsedAt: null | string (date-time);
connected: boolean;
}
DELETE /projects/{projectId}/github/disconnect
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
}
GET /projects/{projectId}/github/repos
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
repos: {
id: any;
name: any;
fullName: any;
url: any;
private: any;
defaultBranch: any;
description: any;
updatedAt: any;
}[];
}
POST /projects/{projectId}/github/push
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
repoName: string;
repoFullName?: string;
branch?: string;
commitMessage?: string;
visibility?: string;
createNew?: boolean;
files?: {
path: string;
content: string;
}[];
}
Response 200 (application/json)
{
ok: boolean;
commitSha: string;
repoUrl: string;
branch: string;
stripped: string[];
}
POST /projects/{projectId}/github/pull
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
repoFullName: string;
branch?: string;
}
Response 200 (application/json)
{
ok: boolean;
files: {
path: string;
content: string;
}[];
branch: string;
}
GET /projects/{projectId}/github/branches
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
repo | query | string | No |
Response 200 (application/json)
{
branches: {
name: any;
sha: any;
protected: any;
}[];
}
POST /projects/{projectId}/github/branch
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Request body (application/json)
{
repo: string;
branchName: string;
fromBranch?: string;
}
Response 200 (application/json)
{
ok: boolean;
branch: string;
sha: any;
}
GET /projects/{projectId}/github/tracked-repos
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200 (application/json)
{
repos: {
id: string;
repoName: string;
repoFullName: string;
repoUrl: string;
repoVisibility: string;
defaultBranch: string;
lastCommitSha: null | string;
lastCommitMessage: null | string;
lastPushAt: null | string (date-time);
fileCount: number;
}[];
}
POST /projects/{projectId}/terminal/exec
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200
No body.
GET /projects/{projectId}/terminal/sessions
| Parameter | In | Type | Required |
|---|
projectId | path | string | Yes |
Response 200
No body.