Skip to content

Projects endpoints

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/

ParameterInTypeRequired
orgIdquerystringNo
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

ParameterInTypeRequired
orgIdquerystring (uuid)Yes
slugquerystringYes
Response 200 (application/json)
{
  slug: string;
  available: boolean;
  reason?: "taken" | "reserved" | "invalid";
}

Errors: 401, 403, with the error body.

GET /projects/{projectId}

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: true;
  purgeAfter: string;
  graceDays: number;
}

Errors: 401, 403, 404, 409, with the error body.

GET /projects/{projectId}/frontend

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
keyIdpathstringYes
Response 200 (application/json)
{
  apiKey: string;
}

Errors: 401, 403, 404, 409, with the error body.

POST /projects/{projectId}/api-keys/split

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
keyIdpathstringYes
Response 200 (application/json)
{
  apiKeyId: string;
  apiKey: string;
}

POST /projects/{projectId}/api-keys/{keyId}/revoke

ParameterInTypeRequired
projectIdpathstringYes
keyIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
}

PATCH /projects/{projectId}/api-keys/{keyId}

ParameterInTypeRequired
projectIdpathstringYes
keyIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  tier: string;
  diskSize: number;
  region: string;
  autoScaling: boolean;
  maxInstances: number;
}

PATCH /projects/{projectId}/settings/compute

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  algorithm: string;
  generation: number;
  lastRotated: null | string;
}

PATCH /projects/{projectId}/settings/jwt

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  generation: number;
  lastRotated: string;
  algorithm: string;
}

GET /projects/{projectId}/settings/addons

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  enabledAddons: ("ai-schema" | "edge-functions" | "realtime" | "storage")[];
  currentTier: "enterprise" | "free" | "scale";
}

PATCH /projects/{projectId}/settings/addons

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
Response 200 (application/json)
{
  ok: true;
  removed: boolean;
}

Errors: 400, 401, 403, 404, with the error body.

GET /projects/{projectId}/environments/promotion-order

ParameterInTypeRequired
projectIdpathstring (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.

PUT /projects/{projectId}/environments/promotion-order

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
}

GET /projects/{projectId}/environments/{envId}/domains

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
Request body (application/json)
{
  domain: string;
}
Response 200

No body.

POST /projects/{projectId}/environments/{envId}/domains/{domainId}/verify

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
domainIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
domainIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdpathstringYes
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)

ParameterInTypeRequired
refreshquery"true" | "false"No
idpathstring (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.

GET /projects/{projectId}/promotions/diff

ParameterInTypeRequired
projectIdpathstringYes
fromquerystringNo
toquerystringNo
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;
  };
}

GET /projects/{projectId}/promotions

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  promotions: any[];
}

POST /projects/{projectId}/promotions

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  branches: any[];
}

POST /projects/{projectId}/branches

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
branchNamepathstringYes
Response 200 (application/json)
{
  branchName: string;
  previewUrl: string;
  wildcardDnsConfigured: boolean;
  note: string;
}

DELETE /projects/{projectId}/branches/{branchName}

ParameterInTypeRequired
projectIdpathstringYes
branchNamepathstringYes
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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Request body (application/json)
{
  hidden: boolean;
}
Response 200 (application/json)
{
  hidden: boolean;
}

GET /projects/{projectId}/storage/settings

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
envIdquerystringNo
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

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
envVarIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
envVarIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  id: string;
}

GET /projects/{projectId}/security/advisor

ParameterInTypeRequired
envIdquerystringNo
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  message: string;
  serviceAccess: {
    revoked: string[];
    queued: string[];
    failed: string[];
  };
}

GET /projects/{projectId}/database/dedicated/status

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  status: string;
  message: null | string;
  host: null | string;
} | {
  status: string;
  message: null | string;
}

GET /projects/{projectId}/database/dedicated/connection

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  connectionString: string;
  host?: string;
  port: number;
  database: string;
  username: string;
  sslRequired: boolean;
}

POST /projects/{projectId}/database/dedicated/restart

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  message: string;
}

GET /projects/{projectId}/users

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
Response 200 (application/json)
{
  success: boolean;
}

POST /projects/{projectId}/users/{userId}/ban

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
Response 200 (application/json)
{
  success: boolean;
}

GET /projects/{projectId}/users/{userId}/sessions

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
sessionIdpathstringYes
Response 200 (application/json)
{
  success: boolean;
}

POST /projects/{projectId}/users/{userId}/sessions/revoke-all

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
Response 200 (application/json)
{
  success: boolean;
}

GET /projects/{projectId}/auth/settings

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  settings: any;
}

PATCH /projects/{projectId}/auth/settings

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  synced: number;
  errors: number;
  errorDetails?: string[];
}

GET /projects/{projectId}/auth/oauth-apps

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  apps: any[];
  providers: {
    id: "github" | "google";
    name: string;
    callbackUrl: string;
  }[];
  comingSoon: "apple"[];
}

PUT /projects/{projectId}/auth/oauth-apps/{provider}

ParameterInTypeRequired
projectIdpathstringYes
providerpathstringYes
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}

ParameterInTypeRequired
projectIdpathstringYes
providerpathstringYes
Response 200 (application/json)
{
  success: boolean;
}

POST /projects/{projectId}/auth/login

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  user: {
    id: any;
    email: any;
    phone: any;
    provider: any;
    metadata: any;
    emailVerifiedAt: any;
    createdAt: any;
  };
}

POST /projects/{projectId}/auth/logout

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
}

POST /projects/{projectId}/auth/signup

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  message: string;
} | {
  ok: boolean;
  message: string;
  verificationToken?: string;
}

POST /projects/{projectId}/auth/verify-email/confirm

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (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)

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (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)

ParameterInTypeRequired
tokenquerystringYes
refresh_modequery"cookie" | "body"No
projectIdpathstring (uuid)Yes
Response 200

No body.

GET /projects/{projectId}/auth/sessions

List the current project user's active device sessions

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (uuid)Yes
idpathstring (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

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstring (uuid)Yes
providerpathstringYes
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)

ParameterInTypeRequired
codequerystringNo
statequerystringNo
errorquerystringNo
error_descriptionquerystringNo
projectIdpathstring (uuid)Yes
providerpathstringYes
Response 200

No body.

POST /projects/{projectId}/auth/oauth/token

Exchange the one-time social sign-in code and PKCE verifier for a session

ParameterInTypeRequired
projectIdpathstring (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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
userIdquerystringNo
actionquerystringNo
limitquerynumberNo
offsetquerynumberNo
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

ParameterInTypeRequired
projectIdpathstringYes
userIdpathstringYes
Request body (application/json)
{
  redirectUrl?: string;
}
Response 200 (application/json)
{
  ok: boolean;
}

GET /projects/{projectId}/infrastructure

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  outcome: "existing" | "shared";
}
Response 202 (application/json)
{
  ok: boolean;
  outcome: "provisioned";
}

POST /projects/{projectId}/infrastructure/{instanceId}/resize

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  status: string;
  billingContinues: boolean;
  message: string;
}

POST /projects/{projectId}/infrastructure/{instanceId}/start

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  status: string;
}

DELETE /projects/{projectId}/infrastructure/{instanceId}

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
Request body (application/json)
{
  confirmation: string;
}
Response 200 (application/json)
{
  ok: boolean;
}

POST /projects/{projectId}/infrastructure/{instanceId}/migrate-now

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  message: string;
}

GET /projects/{projectId}/infrastructure/{instanceId}/metrics

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  jobId: string;
  retryCount: number;
}

POST /projects/{projectId}/infrastructure/migration/rollback

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
  jobId: string;
  status: string;
}

GET /projects/{projectId}/infrastructure/migration/progress

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Request body (application/json)
{
  pointInTime?: any;
}
Response 200

No body.

POST /projects/{projectId}/infrastructure/restores/preview

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
instanceIdpathstringYes
Request body (application/json)
{
  confirmation?: string;
}
Response 200 (application/json)
{
  ok: boolean;
  readsInstanceId: string;
  previousInstanceId: string;
}

POST /projects/{projectId}/github/connect

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200 (application/json)
{
  ok: boolean;
}

GET /projects/{projectId}/github/repos

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
repoquerystringNo
Response 200 (application/json)
{
  branches: {
    name: any;
    sha: any;
    protected: any;
  }[];
}

POST /projects/{projectId}/github/branch

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
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

ParameterInTypeRequired
projectIdpathstringYes
Response 200

No body.

GET /projects/{projectId}/terminal/sessions

ParameterInTypeRequired
projectIdpathstringYes
Response 200

No body.