Email
@@ -328,7 +345,7 @@ export class AccountComponent implements OnInit {
- {{ loading ? 'Loading ...' : 'Update' }}
+ {{ loading ? "Loading ..." : "Update" }}
@@ -342,33 +359,34 @@ export class AccountComponent implements OnInit {
### Launch!
-Now that we have all the components in place, let's update `AppComponent`:
+Now you have all the components in place, update `AppComponent`:
<$CodeTabs>
-```ts name=src/app/app.component.ts
+```ts name=src/app/app.ts
import { Component, OnInit } from '@angular/core'
import { SupabaseService } from './supabase.service'
@Component({
selector: 'app-root',
- templateUrl: './app.component.html',
- styleUrls: ['./app.component.css'],
+ templateUrl: './app.html',
+ styleUrls: ['./app.css'],
+ standalone: false,
})
export class AppComponent implements OnInit {
- title = 'angular-user-management'
-
- session = this.supabase.session
-
constructor(private readonly supabase: SupabaseService) {}
+ title = 'angular-user-management'
+ session: any
+
ngOnInit() {
+ this.session = this.supabase.session
this.supabase.authChanges((_, session) => (this.session = session))
}
}
```
-```html name=src/app/app.component.html
+```html name=src/app/app.html
@@ -379,7 +397,7 @@ export class AppComponent implements OnInit {
$CodeTabs>
-`app.module.ts` also needs to be modified to include the `ReactiveFormsModule` from the `@angular/forms` package.
+You also need to change `app.module.ts` to include the `ReactiveFormsModule` from the `@angular/forms` package.
<$CodeTabs>
@@ -387,32 +405,33 @@ export class AppComponent implements OnInit {
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
-import { AppComponent } from './app.component'
-import { AuthComponent } from './auth/auth.component'
-import { AccountComponent } from './account/account.component'
+import { AppComponent } from './app'
+import { AuthComponent } from './auth/auth'
+import { AccountComponent } from './account/account'
import { ReactiveFormsModule } from '@angular/forms'
-import { AvatarComponent } from './avatar/avatar.component'
+import { AvatarComponent } from './avatar/avatar'
@NgModule({
declarations: [AppComponent, AuthComponent, AccountComponent, AvatarComponent],
imports: [BrowserModule, ReactiveFormsModule],
providers: [],
bootstrap: [AppComponent],
+ exports: [AppComponent, AuthComponent, AccountComponent, AvatarComponent],
})
export class AppModule {}
```
$CodeTabs>
-Once that's done, run this in a terminal window:
+Once that's done, run the application in a terminal:
```bash
npm run start
```
-And then open the browser to [localhost:4200](http://localhost:4200) and you should see the completed app.
+Open the browser to [localhost:4200](http://localhost:4200) and you should see the completed app.
-
+
## Bonus: Profile photos
@@ -420,20 +439,21 @@ Every Supabase project is configured with [Storage](/docs/guides/storage) for ma
### Create an upload widget
-Let's create an avatar for the user so that they can upload a profile photo.
-Create an `AvatarComponent` with `ng g c avatar` Angular CLI command.
+Create an avatar for the user so that they can upload a profile photo.
+Create an `AvatarComponent` with `ng g c avatar` Angular CLI command and add the following code.
<$CodeTabs>
-```ts name=src/app/avatar/avatar.component.ts
+```ts name=src/app/avatar/avatar.ts
import { Component, EventEmitter, Input, Output } from '@angular/core'
import { SafeResourceUrl, DomSanitizer } from '@angular/platform-browser'
import { SupabaseService } from '../supabase.service'
@Component({
selector: 'app-avatar',
- templateUrl: './avatar.component.html',
- styleUrls: ['./avatar.component.css'],
+ templateUrl: './avatar.html',
+ styleUrls: ['./avatar.css'],
+ standalone: false,
})
export class AvatarComponent {
_avatarUrl: SafeResourceUrl | undefined
@@ -490,7 +510,7 @@ export class AvatarComponent {
}
```
-```html name=src/app/avatar/avatar.component.html
+```html name=src/app/avatar/avatar.html
- {{ uploading ? 'Uploading ...' : 'Upload' }}
+ {{ uploading ? "Uploading ..." : "Upload" }}
-```html name=src/app/account.component.html
+```html name=src/app/account.html
```
@@ -537,11 +557,11 @@ And add an `updateAvatar` function along with an `avatarUrl` getter to the `Acco
<$CodeTabs>
-```ts name=src/app/account.component.ts
+```ts name=src/app/account.ts
@Component({
selector: 'app-account',
- templateUrl: './account.component.html',
- styleUrls: ['./account.component.css'],
+ templateUrl: './account.html',
+ styleUrls: ['./account.css'],
})
export class AccountComponent implements OnInit {
// ...
diff --git a/apps/docs/content/guides/local-development.mdx b/apps/docs/content/guides/local-development.mdx
index e8ba56d4654..8545ceb1768 100644
--- a/apps/docs/content/guides/local-development.mdx
+++ b/apps/docs/content/guides/local-development.mdx
@@ -5,6 +5,17 @@ subtitle: Learn how to develop locally and use the Supabase CLI
Develop locally while running the Supabase stack on your machine.
+
+
+As a prerequisite, you must install a container runtime compatible with Docker APIs.
+
+- [Docker Desktop](https://docs.docker.com/desktop/) (macOS, Windows, Linux)
+- [Rancher Desktop](https://rancherdesktop.io/) (macOS, Windows, Linux)
+- [Podman](https://podman.io/) (macOS, Windows, Linux)
+- [OrbStack](https://orbstack.dev/) (macOS)
+
+
+
## Quickstart
1. Install the Supabase CLI:
@@ -101,17 +112,6 @@ Develop locally while running the Supabase stack on your machine.
-
-
- As a prerequisite, you must install a container runtime compatible with Docker APIs.
-
- - [Docker Desktop](https://docs.docker.com/desktop/) (macOS, Windows, Linux)
- - [Rancher Desktop](https://rancherdesktop.io/) (macOS, Windows, Linux)
- - [Podman](https://podman.io/) (macOS, Windows, Linux)
- - [OrbStack](https://orbstack.dev/) (macOS)
-
-
-
4. View your local Supabase instance at [http://localhost:54323](http://localhost:54323).
## Local development
diff --git a/apps/docs/content/guides/local-development/cli/getting-started.mdx b/apps/docs/content/guides/local-development/cli/getting-started.mdx
index 4240378957e..a65e54431ea 100644
--- a/apps/docs/content/guides/local-development/cli/getting-started.mdx
+++ b/apps/docs/content/guides/local-development/cli/getting-started.mdx
@@ -217,7 +217,7 @@ Started supabase local development setup.
API URL: http://localhost:54321
DB URL: postgresql://postgres:postgres@localhost:54322/postgres
Studio URL: http://localhost:54323
- Inbucket URL: http://localhost:54324
+ Mailpit URL: http://localhost:54324
anon key: eyJh......
service_role key: eyJh......
diff --git a/apps/docs/content/guides/local-development/cli/testing-and-linting.mdx b/apps/docs/content/guides/local-development/cli/testing-and-linting.mdx
index c3c8d2eb9a3..59e8bb4e0d1 100644
--- a/apps/docs/content/guides/local-development/cli/testing-and-linting.mdx
+++ b/apps/docs/content/guides/local-development/cli/testing-and-linting.mdx
@@ -36,11 +36,11 @@ Edge Functions are powered by Deno, which provides a [native set of testing tool
## Testing Auth emails
-The Supabase CLI uses [Inbucket](https://github.com/inbucket/inbucket) to capture emails sent from your local machine. This is useful for testing emails sent from Supabase Auth.
+The Supabase CLI uses [Mailpit](https://github.com/axllent/mailpit) to capture emails sent from your local machine. This is useful for testing emails sent from Supabase Auth.
-### Accessing Inbucket
+### Accessing Mailpit
-By default, Inbucket is available at [localhost:54324](http://localhost:54324) when you run `supabase start`. Open this URL in your browser to view the emails.
+By default, Mailpit is available at [localhost:54324](http://localhost:54324) when you run `supabase start`. Open this URL in your browser to view the emails.
### Going into production
diff --git a/apps/docs/content/guides/platform/access-control.mdx b/apps/docs/content/guides/platform/access-control.mdx
index 37b7b85dd52..2483a8f1ddb 100644
--- a/apps/docs/content/guides/platform/access-control.mdx
+++ b/apps/docs/content/guides/platform/access-control.mdx
@@ -260,20 +260,13 @@ The table below shows the actions each role can take on the resources belonging
| | View |
|
|
|
|
| | List |
|
|
|
|
| | Run |
|
|
|
|
-| Events Collections | Create |
|
|
|
|
-| | Update |
|
|
|
|
-| | Delete |
|
|
|
|
-| | View |
|
|
|
|
-| | List |
|
|
|
|
-| Warehouse Access Tokens | Create |
|
|
|
|
-| | Revoke |
|
|
|
|
-| | List |
|
|
|
|
|
**Branching** | | | | | |
-| Enable branching | - |
|
|
|
|
-| Disable branching | - |
|
|
|
|
+| Production Branch | Read |
|
|
|
|
+| | Write |
|
|
|
|
+| Development Branches | List |
|
|
|
|
| | Create |
|
|
|
|
+| | Update |
|
|
|
|
| | Delete |
|
|
|
|
-| | List |
|
|
|
|
[^1]: Available on the Team and Enterprise Plans.
[^2]: Sending anonymous data to OpenAI is opt in and can improve Studio AI Assistant's responses.
diff --git a/apps/docs/content/guides/platform/backups.mdx b/apps/docs/content/guides/platform/backups.mdx
index 64efb201ba5..ae79d74e7cf 100644
--- a/apps/docs/content/guides/platform/backups.mdx
+++ b/apps/docs/content/guides/platform/backups.mdx
@@ -131,6 +131,14 @@ If you enable PITR, Daily Backups will no longer be taken. PITR provides a finer
+When you disable PITR, all new backups will still be taken as physical backups only. Physical backups can still be used for restoration, but they are not available for direct download. If you need to download a backup after PITR is disabled, you’ll need to take a manual [logical backup using the Supabase CLI or pg_dump](https://supabase.com/docs/guides/platform/migrating-within-supabase/backup-restore#backup-database-using-the-cli).
+
+
+
+If PITR has been disabled, logical backups remain available until they pass the backup retention period for your plan. After that window passes, only physical backups will be shown.
+
+
+
### Backup process [#pitr-backup-process]
As discussed [here](https://supabase.com/blog/postgresql-physical-logical-backups), PITR is made possible by a combination of taking physical backups of a project, as well as archiving [Write Ahead Log (WAL)](https://www.postgresql.org/docs/current/wal-intro.html) files. Physical backups provide a snapshot of the underlying directory of the database, while WAL files contain records of every change made in the database.
diff --git a/apps/docs/content/guides/platform/credits.mdx b/apps/docs/content/guides/platform/credits.mdx
index a71d1574de0..625cfc8bd79 100644
--- a/apps/docs/content/guides/platform/credits.mdx
+++ b/apps/docs/content/guides/platform/credits.mdx
@@ -27,7 +27,7 @@ As an example, if you start a Pro Plan subscription on January 1 and downgrade t
## Credit top-ups
-You can top up credits at any time, with a maximum of
per top-up. These credits do not expire and are non-refundable.
+You can top up credits at any time, with a maximum of
per top-up. These credits do not expire and are non-refundable.
If you have any outstanding invoices, we’ll automatically use your credits to pay them off. Any remaining credits will be applied to future invoices.
diff --git a/apps/docs/content/guides/platform/migrating-to-supabase/firestore-data.mdx b/apps/docs/content/guides/platform/migrating-to-supabase/firestore-data.mdx
index 809d4e38b26..063eecdbad5 100644
--- a/apps/docs/content/guides/platform/migrating-to-supabase/firestore-data.mdx
+++ b/apps/docs/content/guides/platform/migrating-to-supabase/firestore-data.mdx
@@ -1,6 +1,6 @@
---
id: 'firestore-data'
-title: 'Migrated from Firebase Firestore to Supabase'
+title: 'Migrate from Firebase Firestore to Supabase'
description: 'Migrate your Firebase Firestore database to a Supabase Postgres database.'
subtitle: 'Migrate your Firebase Firestore database to a Supabase Postgres database.'
---
diff --git a/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx b/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx
index fd3644ed209..f26c2f72814 100644
--- a/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx
+++ b/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx
@@ -227,7 +227,7 @@ supabase db diff --linked --schema auth,storage > changes.sql
The new project has the old project's Storage buckets, but the Storage objects need to be migrated manually. Use this script to move storage objects from one project to another.
```js
-// npm install @supabase/supabase-js@1
+// npm install @supabase/supabase-js@2
const { createClient } = require('@supabase/supabase-js')
const OLD_PROJECT_URL = 'https://xxx.supabase.co'
@@ -238,7 +238,9 @@ const NEW_PROJECT_SERVICE_KEY = 'new-project-service-key-yyy'
;(async () => {
const oldSupabaseRestClient = createClient(OLD_PROJECT_URL, OLD_PROJECT_SERVICE_KEY, {
- schema: 'storage',
+ db: {
+ schema: 'storage',
+ },
})
const oldSupabaseClient = createClient(OLD_PROJECT_URL, OLD_PROJECT_SERVICE_KEY)
const newSupabaseClient = createClient(NEW_PROJECT_URL, NEW_PROJECT_SERVICE_KEY)
diff --git a/apps/docs/content/guides/queues/pgmq.mdx b/apps/docs/content/guides/queues/pgmq.mdx
index fa4f840a37c..d5c01326e8f 100644
--- a/apps/docs/content/guides/queues/pgmq.mdx
+++ b/apps/docs/content/guides/queues/pgmq.mdx
@@ -207,7 +207,7 @@ select * from pgmq.send_batch(
#### `read`
-Read 1 or more messages from a queue. The VT specifies the delay in seconds between reading and the message becoming invisible to other consumers.
+Read 1 or more messages from a queue. The VT specifies the duration of time in seconds that the message is invisible to other consumers. At the end of that duration, the message is visible again and could be read by other consumers.
{/* prettier-ignore */}
```sql
diff --git a/apps/docs/content/guides/storage/s3/authentication.mdx b/apps/docs/content/guides/storage/s3/authentication.mdx
index b6a09be5555..55c5102fcce 100644
--- a/apps/docs/content/guides/storage/s3/authentication.mdx
+++ b/apps/docs/content/guides/storage/s3/authentication.mdx
@@ -25,6 +25,14 @@ This is all the information you need to connect to Supabase Storage using any S3
+
+
+For optimal performance when uploading large files you should always use the direct storage hostname. This provides several performance enhancements that will greatly improve performance when uploading large files.
+
+Instead of `https://project-id.supabase.co` use `https://project-id.storage.supabase.co`
+
+
+
@@ -86,7 +94,7 @@ const {
const client = new S3Client({
forcePathStyle: true,
region: 'project_region',
- endpoint: 'https://project_ref.supabase.co/storage/v1/s3',
+ endpoint: 'https://project_ref.storage.supabase.co/storage/v1/s3',
credentials: {
accessKeyId: 'project_ref',
secretAccessKey: 'anonKey',
diff --git a/apps/docs/content/guides/storage/uploads/file-limits.mdx b/apps/docs/content/guides/storage/uploads/file-limits.mdx
index af1628c5bc9..d890c477687 100644
--- a/apps/docs/content/guides/storage/uploads/file-limits.mdx
+++ b/apps/docs/content/guides/storage/uploads/file-limits.mdx
@@ -8,13 +8,13 @@ sidebar_label: 'Limits'
## Global file size
-You can set the max file size across all your buckets by setting this global value in the dashboard [here](https://supabase.com/dashboard/project/_/settings/storage). For Free projects, the limit can't exceed 50 MB. On the Pro Plan and up, you can set this value to up to 50 GB. If you need more than 50 GB, [contact us](https://supabase.com/dashboard/support/new).
+You can set the max file size across all your buckets by setting this global value in the dashboard [here](https://supabase.com/dashboard/project/_/settings/storage). For Free projects, the limit can't exceed 50 MB. On the Pro Plan and up, you can set this value to up to 500 GB. If you need more than 500 GB, [contact us](https://supabase.com/dashboard/support/new).
| Plan | Max File Size Limit |
| ---------- | ------------------- |
| Free | 50 MB |
-| Pro | 50 GB |
-| Team | 50 GB |
+| Pro | 500 GB |
+| Team | 500 GB |
| Enterprise | Custom |
diff --git a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx
index d12d1cc6924..a7ac47b3031 100644
--- a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx
+++ b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx
@@ -14,6 +14,14 @@ The resumable upload method is recommended when:
Supabase Storage implements the [TUS protocol](https://tus.io/) to enable resumable uploads. TUS stands for The Upload Server and is an open protocol for supporting resumable uploads. The protocol allows the upload process to be resumed from where it left off in case of interruptions. This method can be implemented using the [`tus-js-client`](https://github.com/tus/tus-js-client) library, or other client-side libraries like [Uppy](https://uppy.io/docs/tus/) that support the TUS protocol.
+
+
+For optimal performance when uploading large files you should always use the direct storage hostname. This provides several performance enhancements that will greatly improve performance when uploading large files.
+
+Instead of `https://project-id.supabase.co` use `https://project-id.storage.supabase.co`
+
+
+
{
var upload = new tus.Upload(file, {
- endpoint: `https://${projectId}.supabase.co/storage/v1/upload/resumable`,
+ // Supabase TUS endpoint (with direct storage hostname)
+ endpoint: `https://${projectId}.storage.supabase.co/storage/v1/upload/resumable`,
retryDelays: [0, 3000, 5000, 10000, 20000],
headers: {
authorization: `Bearer ${session.access_token}`,
@@ -125,7 +134,7 @@ Supabase Storage implements the [TUS protocol](https://tus.io/) to enable resuma
// Initialize Uppy instance only once
const [uppy] = useState(() => new Uppy());
// Initialize Supabase client with project URL and anon key
- const supabase = createClient(projectURL, anonKey);
+ const supabase = createClient(`https://${projectId}.supabase.co`, anonKey);
useEffect(() => {
const initializeUppy = async () => {
@@ -135,7 +144,8 @@ Supabase Storage implements the [TUS protocol](https://tus.io/) to enable resuma
} = await supabase.auth.getSession();
uppy.use(Tus, {
- endpoint: `${projectURL}/storage/v1/upload/resumable`, // Supabase TUS endpoint
+ // Supabase TUS endpoint (with direct storage hostname)
+ endpoint: `https://${projectId}.storage.supabase.co/storage/v1/upload/resumable`,
retryDelays: [0, 3000, 5000, 10000, 20000], // Retry delays for resumable uploads
headers: {
authorization: `Bearer ${session?.access_token}`, // User session access token
diff --git a/apps/docs/content/guides/storage/uploads/s3-uploads.mdx b/apps/docs/content/guides/storage/uploads/s3-uploads.mdx
index 13f888e2fb5..93c3f4f2be9 100644
--- a/apps/docs/content/guides/storage/uploads/s3-uploads.mdx
+++ b/apps/docs/content/guides/storage/uploads/s3-uploads.mdx
@@ -17,7 +17,7 @@ The S3 protocol supports file upload using:
The `PutObject` action uploads the file in a single request. This matches the behavior of the Supabase SDK [Standard Upload](/docs/guides/storage/uploads/standard-uploads).
-Use `PutObject` to upload smaller files, where retrying the entire upload won't be an issue. The maximum file size on paid plans is 50 GB.
+Use `PutObject` to upload smaller files, where retrying the entire upload won't be an issue. The maximum file size on paid plans is 500 GB.
For example, using JavaScript and the `aws-sdk` client:
@@ -42,7 +42,7 @@ await s3Client.send(uploadCommand)
Multipart Uploads split the file into smaller parts and upload them in parallel, maximizing the upload speed on a fast network. When uploading large files, this allows you to retry the upload of individual parts in case of network issues.
-This method is preferable over [Resumable Upload](/docs/guides/storage/uploads/resumable-uploads) for server-side uploads, when you want to maximize upload speed at the cost of resumability. The maximum file size on paid plans is 50 GB.
+This method is preferable over [Resumable Upload](/docs/guides/storage/uploads/resumable-uploads) for server-side uploads, when you want to maximize upload speed at the cost of resumability. The maximum file size on paid plans is 500 GB.
### Upload a file in parts
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 1dd7f1f831c..96c1cdb065a 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -9,7 +9,7 @@
"build:llms": "tsx ./scripts/llms.ts",
"build:sitemap": "tsx ./internals/generate-sitemap.ts",
"clean": "rimraf .next .turbo node_modules features/docs/generated examples __generated__",
- "codegen:examples": "cp -r ../../examples ./examples",
+ "codegen:examples": "shx cp -r ../../examples ./examples",
"codegen:graphql": "tsx --conditions=react-server ./scripts/graphqlSchema.ts && graphql-codegen --config codegen.ts",
"codegen:references": "tsx features/docs/Reference.generated.script.ts",
"codemod:frontmatter": "node ./scripts/codemod/mdx-meta.mjs && prettier --cache --write \"content/**/*.mdx\"",
@@ -149,6 +149,7 @@
"openapi-types": "^12.1.3",
"postcss": "^8.5.3",
"shiki": "^3.2.1",
+ "shx": "^0.4.0",
"simple-git": "^3.24.0",
"slugify": "^1.6.6",
"smol-toml": "^1.3.1",
diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt
index 810fce67a7b..58db9f6a50c 100644
--- a/apps/docs/public/humans.txt
+++ b/apps/docs/public/humans.txt
@@ -26,18 +26,22 @@ Chris Caruso
Chris Chandler
Chris Copplestone
Chris Gwilliams
+Chris Martin
Chris Stockton
+Chris Ward
Craig Cannon
Danny White
Darren Cunningham
Dave Wilson
David A. Ventimiglia
+Deepthi Sigireddi
Deji I
Div Arora
Divit D
Eduardo Gurgel
Egor Romanov
Eleftheria Trivyzaki
+Emmett Folger
Etienne Stalmans
Fabrizio Fenoglio
Felipe Stival
@@ -53,6 +57,7 @@ Inian P
Ivan Vasilov
Jenny Kibiri
Jess Shears
+Jim Chanco Jr
John Pena
Jon M
Jonny Summers-Muir
@@ -76,9 +81,11 @@ Leonardo Santiago
Long Hoang
Luca Forstner
Łukasz Niemier
+Manan Gupta
Margarita Sandomirskaia
Mark Burggraf
Monica Khoury
+Mykhailo Mischa Lieibenson
Nyannyacha
Oli R
Pamela Chia
@@ -102,6 +109,7 @@ Stanislav M
Stephen Morgan
Steve Chavez
Stojan Dimitrovski
+Sugu Sougoumarane
Supun Sudaraka Kalidasa
Taryn King
Terry Sutton
diff --git a/apps/docs/spec/api_v1_openapi.json b/apps/docs/spec/api_v1_openapi.json
index 370f302ea3d..81dd92764b4 100644
--- a/apps/docs/spec/api_v1_openapi.json
+++ b/apps/docs/spec/api_v1_openapi.json
@@ -7,7 +7,13 @@
"summary": "Get database branch config",
"description": "Fetches configurations of the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -28,7 +34,13 @@
"summary": "Update database branch config",
"description": "Updates the configuration of the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -53,7 +65,13 @@
"summary": "Delete a database branch",
"description": "Deletes the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -76,8 +94,20 @@
"summary": "Pushes a database branch",
"description": "Pushes the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/BranchActionBody" } }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -99,8 +129,20 @@
"summary": "Merges a database branch",
"description": "Merges the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/BranchActionBody" } }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -122,8 +164,20 @@
"summary": "Resets a database branch",
"description": "Resets the specified database branch",
"parameters": [
- { "name": "branch_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/BranchActionBody" } }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -139,6 +193,37 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/branches/{branch_id}/diff": {
+ "get": {
+ "operationId": "v1-diff-a-branch",
+ "summary": "[Beta] Diffs a database branch",
+ "description": "Diffs the specified database branch",
+ "parameters": [
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "included_schemas",
+ "required": false,
+ "in": "query",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": { "text/plain": { "schema": { "type": "string" } } },
+ "description": ""
+ },
+ "500": { "description": "Failed to diff database branch" }
+ },
+ "tags": ["Environments"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/projects": {
"get": {
"operationId": "v1-list-all-projects",
@@ -168,9 +253,7 @@
"requestBody": {
"required": true,
"content": {
- "application/json": {
- "schema": { "$ref": "#/components/schemas/V1CreateProjectBodyDto" }
- }
+ "application/json": { "schema": { "$ref": "#/components/schemas/V1CreateProjectBody" } }
}
},
"responses": {
@@ -216,7 +299,7 @@
"required": true,
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/CreateOrganizationV1Dto" }
+ "schema": { "$ref": "#/components/schemas/CreateOrganizationV1" }
}
}
},
@@ -241,23 +324,16 @@
"summary": "[Beta] Authorize user through oauth",
"parameters": [
{
- "name": "code_challenge_method",
- "required": false,
+ "name": "client_id",
+ "required": true,
"in": "query",
- "schema": { "enum": ["plain", "sha256", "S256"], "type": "string" }
+ "schema": { "format": "uuid", "type": "string" }
},
- {
- "name": "code_challenge",
- "required": false,
- "in": "query",
- "schema": { "type": "string" }
- },
- { "name": "state", "required": false, "in": "query", "schema": { "type": "string" } },
{
"name": "response_type",
"required": true,
"in": "query",
- "schema": { "type": "string" }
+ "schema": { "enum": ["code", "token", "id_token token"], "type": "string" }
},
{
"name": "redirect_uri",
@@ -265,9 +341,35 @@
"in": "query",
"schema": { "type": "string" }
},
- { "name": "client_id", "required": true, "in": "query", "schema": { "type": "string" } }
+ { "name": "scope", "required": false, "in": "query", "schema": { "type": "string" } },
+ { "name": "state", "required": false, "in": "query", "schema": { "type": "string" } },
+ {
+ "name": "response_mode",
+ "required": false,
+ "in": "query",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "code_challenge",
+ "required": false,
+ "in": "query",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "code_challenge_method",
+ "required": false,
+ "in": "query",
+ "schema": { "enum": ["plain", "sha256", "S256"], "type": "string" }
+ },
+ {
+ "name": "organization_slug",
+ "required": false,
+ "in": "query",
+ "description": "Organization slug",
+ "schema": { "pattern": "^[\\w-]+$", "type": "string" }
+ }
],
- "responses": { "303": { "description": "" } },
+ "responses": { "204": { "description": "" } },
"tags": ["OAuth"],
"security": [{ "oauth2": ["read"] }]
}
@@ -308,7 +410,7 @@
"required": true,
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/OAuthRevokeTokenBodyDto" }
+ "schema": { "$ref": "#/components/schemas/OAuthRevokeTokenBody" }
}
}
},
@@ -317,11 +419,75 @@
"security": [{ "oauth2": ["write"] }]
}
},
+ "/v1/oauth/authorize/project-claim": {
+ "get": {
+ "operationId": "v1-oauth-authorize-project-claim",
+ "x-internal": true,
+ "summary": "Authorize user through oauth and claim a project",
+ "description": "Initiates the OAuth authorization flow for the specified provider. After successful authentication, the user can claim ownership of the specified project.",
+ "parameters": [
+ {
+ "name": "project_ref",
+ "required": true,
+ "in": "query",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "client_id",
+ "required": true,
+ "in": "query",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "response_type",
+ "required": true,
+ "in": "query",
+ "schema": { "enum": ["code", "token", "id_token token"], "type": "string" }
+ },
+ {
+ "name": "redirect_uri",
+ "required": true,
+ "in": "query",
+ "schema": { "type": "string" }
+ },
+ { "name": "state", "required": false, "in": "query", "schema": { "type": "string" } },
+ {
+ "name": "response_mode",
+ "required": false,
+ "in": "query",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "code_challenge",
+ "required": false,
+ "in": "query",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "code_challenge_method",
+ "required": false,
+ "in": "query",
+ "schema": { "enum": ["plain", "sha256", "S256"], "type": "string" }
+ }
+ ],
+ "responses": { "204": { "description": "" } },
+ "tags": ["OAuth"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/snippets": {
"get": {
"operationId": "v1-list-all-snippets",
"summary": "Lists SQL snippets for the logged in user",
"parameters": [
+ {
+ "name": "project_ref",
+ "required": false,
+ "in": "query",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{ "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } },
{
"name": "limit",
@@ -340,12 +506,6 @@
"required": false,
"in": "query",
"schema": { "enum": ["asc", "desc"], "type": "string" }
- },
- {
- "name": "project_ref",
- "required": false,
- "in": "query",
- "schema": { "type": "string" }
}
],
"responses": {
@@ -391,8 +551,20 @@
"operationId": "v1-get-project-api-keys",
"summary": "Get project api keys",
"parameters": [
- { "name": "reveal", "required": false, "in": "query", "schema": { "type": "boolean" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ }
],
"responses": {
"200": {
@@ -412,11 +584,23 @@
"security": [{ "bearer": [] }]
},
"post": {
- "operationId": "createApiKey",
- "summary": "[Alpha] Creates a new API key for the project",
+ "operationId": "v1-create-project-api-key",
+ "summary": "Creates a new API key for the project",
"parameters": [
- { "name": "reveal", "required": false, "in": "query", "schema": { "type": "boolean" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ }
],
"requestBody": {
"required": true,
@@ -437,14 +621,92 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/projects/{ref}/api-keys/legacy": {
+ "get": {
+ "operationId": "v1-get-project-legacy-api-keys",
+ "summary": "Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/LegacyApiKeysResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Secrets"],
+ "security": [{ "bearer": [] }]
+ },
+ "put": {
+ "operationId": "v1-update-project-legacy-api-keys",
+ "summary": "Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "enabled",
+ "required": true,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/LegacyApiKeysResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Secrets"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/projects/{ref}/api-keys/{id}": {
"patch": {
- "operationId": "updateApiKey",
- "summary": "[Alpha] Updates an API key for the project",
+ "operationId": "v1-update-project-api-key",
+ "summary": "Updates an API key for the project",
"parameters": [
- { "name": "reveal", "required": false, "in": "query", "schema": { "type": "boolean" } },
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ }
],
"requestBody": {
"required": true,
@@ -465,12 +727,29 @@
"security": [{ "bearer": [] }]
},
"get": {
- "operationId": "getApiKey",
- "summary": "[Alpha] Get API key",
+ "operationId": "v1-get-project-api-key",
+ "summary": "Get API key",
"parameters": [
- { "name": "reveal", "required": false, "in": "query", "schema": { "type": "boolean" } },
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ }
],
"responses": {
"200": {
@@ -485,12 +764,37 @@
"security": [{ "bearer": [] }]
},
"delete": {
- "operationId": "deleteApiKey",
- "summary": "[Alpha] Deletes an API key for the project",
+ "operationId": "v1-delete-project-api-key",
+ "summary": "Deletes an API key for the project",
"parameters": [
- { "name": "reveal", "required": false, "in": "query", "schema": { "type": "boolean" } },
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ },
+ {
+ "name": "was_compromised",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ },
+ { "name": "reason", "required": false, "in": "query", "schema": { "type": "string" } }
],
"responses": {
"200": {
@@ -511,7 +815,13 @@
"summary": "List all database branches",
"description": "Returns all database branches of the specified project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -536,7 +846,13 @@
"summary": "Create a database branch",
"description": "Creates a database branch from the specified project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -562,7 +878,13 @@
"summary": "Disables preview branching",
"description": "Disables preview branching for the specified project",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": { "description": "" },
@@ -573,6 +895,35 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/projects/{ref}/branches/{name}": {
+ "get": {
+ "operationId": "v1-get-a-branch",
+ "summary": "Get a database branch",
+ "description": "Fetches the specified database branch by its name.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ { "name": "name", "required": true, "in": "path", "schema": { "type": "string" } }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/BranchResponse" } }
+ }
+ },
+ "403": { "description": "" },
+ "500": { "description": "Failed to fetch database branch" }
+ },
+ "tags": ["Environments"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/projects/{ref}/custom-hostname": {
"get": {
"operationId": "v1-get-hostname-config",
@@ -583,7 +934,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -610,7 +961,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -632,7 +983,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -669,7 +1020,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -698,7 +1049,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -722,7 +1073,13 @@
"operationId": "v1-list-all-network-bans",
"summary": "[Beta] Gets project's network bans",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"201": {
@@ -740,12 +1097,47 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/projects/{ref}/network-bans/retrieve/enriched": {
+ "post": {
+ "operationId": "v1-list-all-network-bans-enriched",
+ "summary": "[Beta] Gets project's network bans with additional information about which databases they affect",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/NetworkBanResponseEnriched" }
+ }
+ }
+ },
+ "403": { "description": "" },
+ "500": { "description": "Failed to retrieve project's enriched network bans" }
+ },
+ "tags": ["Projects"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/projects/{ref}/network-bans": {
"delete": {
"operationId": "v1-delete-network-bans",
"summary": "[Beta] Remove network bans.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -769,7 +1161,13 @@
"operationId": "v1-get-network-restrictions",
"summary": "[Beta] Gets project's network restrictions",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -792,7 +1190,13 @@
"operationId": "v1-update-network-restrictions",
"summary": "[Beta] Updates project's network restrictions",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -823,7 +1227,13 @@
"operationId": "v1-get-pgsodium-config",
"summary": "[Beta] Gets project's pgsodium config",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -844,7 +1254,13 @@
"operationId": "v1-update-pgsodium-config",
"summary": "[Beta] Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -880,7 +1296,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -907,7 +1323,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -944,7 +1360,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -971,7 +1387,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -995,7 +1411,13 @@
"summary": "List all secrets",
"description": "Returns all secrets you've previously added to the specified project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1020,17 +1442,18 @@
"summary": "Bulk create secrets",
"description": "Creates multiple secrets and adds them to the specified project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
"content": {
- "application/json": {
- "schema": {
- "type": "array",
- "items": { "$ref": "#/components/schemas/CreateSecretBody" }
- }
- }
+ "application/json": { "schema": { "$ref": "#/components/schemas/CreateSecretBody" } }
}
},
"responses": {
@@ -1046,7 +1469,13 @@
"summary": "Bulk delete secrets",
"description": "Deletes all secrets with the given names from the specified project",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1055,10 +1484,7 @@
}
},
"responses": {
- "200": {
- "description": "",
- "content": { "application/json": { "schema": { "type": "object" } } }
- },
+ "200": { "description": "" },
"403": { "description": "" },
"500": { "description": "Failed to delete secrets with given names" }
},
@@ -1071,7 +1497,13 @@
"operationId": "v1-get-ssl-enforcement-config",
"summary": "[Beta] Get project's SSL enforcement configuration.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1092,7 +1524,13 @@
"operationId": "v1-update-ssl-enforcement-config",
"summary": "[Beta] Update project's SSL enforcement configuration.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1130,7 +1568,13 @@
"in": "query",
"schema": { "default": "public", "type": "string" }
},
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1153,7 +1597,13 @@
"operationId": "v1-get-vanity-subdomain-config",
"summary": "[Beta] Gets current vanity subdomain config",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1174,7 +1624,13 @@
"operationId": "v1-deactivate-vanity-subdomain-config",
"summary": "[Beta] Deletes a project's vanity subdomain configuration",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": { "description": "" },
@@ -1190,7 +1646,13 @@
"operationId": "v1-check-vanity-subdomain-availability",
"summary": "[Beta] Checks vanity subdomain availability",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1219,7 +1681,13 @@
"operationId": "v1-activate-vanity-subdomain-config",
"summary": "[Beta] Activates a vanity subdomain for a project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1248,7 +1716,13 @@
"operationId": "v1-upgrade-postgres-version",
"summary": "[Beta] Upgrades the project's Postgres version",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1277,7 +1751,13 @@
"operationId": "v1-get-postgres-upgrade-eligibility",
"summary": "[Beta] Returns the project's eligibility for upgrades",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1300,13 +1780,19 @@
"operationId": "v1-get-postgres-upgrade-status",
"summary": "[Beta] Gets the latest status of the project's upgrade",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{
"name": "tracking_id",
"required": false,
"in": "query",
"schema": { "type": "string" }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ }
],
"responses": {
"200": {
@@ -1334,7 +1820,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1363,7 +1849,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1380,7 +1866,13 @@
"operationId": "v1-setup-a-read-replica",
"summary": "[Beta] Set up a read replica",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1404,7 +1896,13 @@
"operationId": "v1-remove-a-read-replica",
"summary": "[Beta] Remove a read replica",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1433,13 +1931,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
- },
- {
- "name": "timeout_ms",
- "required": false,
- "in": "query",
- "schema": { "minimum": 0, "maximum": 10000, "type": "integer" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
{
"name": "services",
@@ -1452,6 +1944,12 @@
"enum": ["auth", "db", "pooler", "realtime", "rest", "storage"]
}
}
+ },
+ {
+ "name": "timeout_ms",
+ "required": false,
+ "in": "query",
+ "schema": { "minimum": 0, "maximum": 10000, "type": "integer" }
}
],
"responses": {
@@ -1473,12 +1971,72 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/projects/{ref}/config/auth/signing-keys/legacy": {
+ "post": {
+ "operationId": "v1-create-legacy-signing-key",
+ "summary": "Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SigningKeyResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Auth"],
+ "security": [{ "bearer": [] }]
+ },
+ "get": {
+ "operationId": "v1-get-legacy-signing-key",
+ "summary": "Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SigningKeyResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Auth"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/projects/{ref}/config/auth/signing-keys": {
"post": {
- "operationId": "createSigningKeyForProject",
- "summary": "[Alpha] Create a new signing key for the project in standby status",
+ "operationId": "v1-create-project-signing-key",
+ "summary": "Create a new signing key for the project in standby status",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1490,10 +2048,10 @@
},
"responses": {
"201": {
- "description": "[Alpha] Create a new signing key for the project in standby status",
+ "description": "",
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/CreateSigningKeyBody" }
+ "schema": { "$ref": "#/components/schemas/SigningKeyResponse" }
}
}
},
@@ -1503,10 +2061,16 @@
"security": [{ "bearer": [] }]
},
"get": {
- "operationId": "listSigningKeysForProject",
- "summary": "[Alpha] List all signing keys for the project",
+ "operationId": "v1-get-project-signing-keys",
+ "summary": "List all signing keys for the project",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1525,11 +2089,22 @@
},
"/v1/projects/{ref}/config/auth/signing-keys/{id}": {
"get": {
- "operationId": "getSigningKeyForProject",
- "summary": "[Alpha] Get information about a signing key",
+ "operationId": "v1-get-project-signing-key",
+ "summary": "Get information about a signing key",
"parameters": [
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1546,11 +2121,22 @@
"security": [{ "bearer": [] }]
},
"delete": {
- "operationId": "deleteSigningKey",
- "summary": "[Alpha] Remove a signing key from a project, where the status is previously_used",
+ "operationId": "v1-remove-project-signing-key",
+ "summary": "Remove a signing key from a project. Only possible if the key has been in revoked status for a while.",
"parameters": [
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1567,11 +2153,22 @@
"security": [{ "bearer": [] }]
},
"patch": {
- "operationId": "patchSigningKey",
- "summary": "[Alpha] Update a signing key, mainly its status",
+ "operationId": "v1-update-project-signing-key",
+ "summary": "Update a signing key, mainly its status",
"parameters": [
- { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ },
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -1606,7 +2203,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1633,7 +2230,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -1663,7 +2260,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1690,7 +2287,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -1727,7 +2324,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1747,7 +2344,7 @@
},
"/v1/projects/{ref}/config/database/pooler": {
"get": {
- "operationId": "getSupavisorConfig",
+ "operationId": "v1-get-pooler-config",
"summary": "Gets project's supavisor config",
"parameters": [
{
@@ -1755,7 +2352,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1776,7 +2373,7 @@
"security": [{ "bearer": [] }]
},
"patch": {
- "operationId": "updateSupavisorConfig",
+ "operationId": "v1-update-pooler-config",
"summary": "Updates project's supavisor config",
"parameters": [
{
@@ -1784,7 +2381,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -1821,7 +2418,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1848,7 +2445,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -1877,7 +2474,7 @@
},
"/v1/projects/{ref}/config/auth/third-party-auth": {
"post": {
- "operationId": "createTPAForProject",
+ "operationId": "v1-create-project-tpa-integration",
"summary": "Creates a new third-party auth integration",
"parameters": [
{
@@ -1885,7 +2482,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -1909,7 +2506,7 @@
"security": [{ "bearer": [] }]
},
"get": {
- "operationId": "listTPAForProject",
+ "operationId": "v1-list-project-tpa-integrations",
"summary": "Lists all third-party auth integrations",
"parameters": [
{
@@ -1917,7 +2514,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -1940,7 +2537,7 @@
},
"/v1/projects/{ref}/config/auth/third-party-auth/{tpa_id}": {
"delete": {
- "operationId": "deleteTPAForProject",
+ "operationId": "v1-delete-project-tpa-integration",
"summary": "Removes a third-party auth integration",
"parameters": [
{
@@ -1948,9 +2545,14 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
- { "name": "tpa_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "tpa_id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -1965,7 +2567,7 @@
"security": [{ "bearer": [] }]
},
"get": {
- "operationId": "getTPAForProject",
+ "operationId": "v1-get-project-tpa-integration",
"summary": "Get a third-party integration",
"parameters": [
{
@@ -1973,9 +2575,14 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
- { "name": "tpa_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "tpa_id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2000,7 +2607,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": { "200": { "description": "" }, "403": { "description": "" } },
@@ -2013,7 +2620,13 @@
"operationId": "v1-list-available-restore-versions",
"summary": "Lists available restore versions for the given project",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2035,16 +2648,14 @@
"operationId": "v1-restore-a-project",
"summary": "Restores the given project",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
- ],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": { "$ref": "#/components/schemas/RestoreProjectBodyDto" }
- }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
- },
+ ],
"responses": { "200": { "description": "" }, "403": { "description": "" } },
"tags": ["Projects"],
"security": [{ "bearer": [] }]
@@ -2055,7 +2666,13 @@
"operationId": "v1-cancel-a-project-restoration",
"summary": "Cancels the given project restoration",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": { "200": { "description": "" }, "403": { "description": "" } },
"tags": ["Projects"],
@@ -2067,33 +2684,46 @@
"operationId": "v1-list-project-addons",
"summary": "Lists project addons",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/ListProjectAddonsResponseDto" }
+ "schema": { "$ref": "#/components/schemas/ListProjectAddonsResponse" }
}
}
},
"403": { "description": "" },
"500": { "description": "Failed to list project addons" }
},
+ "tags": ["Billing"],
"security": [{ "bearer": [] }]
},
"patch": {
"operationId": "v1-apply-project-addon",
"summary": "Applies project addon",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/ApplyProjectAddonBodyDto" }
+ "schema": { "$ref": "#/components/schemas/ApplyProjectAddonBody" }
}
}
},
@@ -2102,6 +2732,7 @@
"403": { "description": "" },
"500": { "description": "Failed to apply project addon" }
},
+ "tags": ["Billing"],
"security": [{ "bearer": [] }]
}
},
@@ -2110,83 +2741,311 @@
"operationId": "v1-remove-project-addon",
"summary": "Removes project addon",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{
"name": "addon_variant",
"required": true,
"in": "path",
- "schema": {
- "enum": [
- "ci_micro",
- "ci_small",
- "ci_medium",
- "ci_large",
- "ci_xlarge",
- "ci_2xlarge",
- "ci_4xlarge",
- "ci_8xlarge",
- "ci_12xlarge",
- "ci_16xlarge",
- "cd_default",
- "pitr_7",
- "pitr_14",
- "pitr_28",
- "ipv4_default"
- ],
- "type": "string"
- }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "ci_micro",
+ "ci_small",
+ "ci_medium",
+ "ci_large",
+ "ci_xlarge",
+ "ci_2xlarge",
+ "ci_4xlarge",
+ "ci_8xlarge",
+ "ci_12xlarge",
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
+ ]
+ },
+ { "type": "string", "enum": ["cd_default"] },
+ { "type": "string", "enum": ["pitr_7", "pitr_14", "pitr_28"] },
+ { "type": "string", "enum": ["ipv4_default"] }
+ ],
+ "schema": {}
+ }
],
"responses": {
"200": { "description": "" },
"403": { "description": "" },
"500": { "description": "Failed to remove project addon" }
},
+ "tags": ["Billing"],
"security": [{ "bearer": [] }]
}
},
- "/v1/projects/{ref}/analytics/endpoints/logs.all": {
+ "/v1/projects/{ref}/claim-token": {
"get": {
- "operationId": "getLogs",
- "summary": "Gets project's logs",
+ "operationId": "v1-get-project-claim-token",
+ "x-internal": true,
+ "summary": "Gets project claim token",
"parameters": [
{
- "name": "iso_timestamp_end",
- "required": false,
- "in": "query",
- "schema": { "type": "string" }
- },
- {
- "name": "iso_timestamp_start",
- "required": false,
- "in": "query",
- "schema": { "type": "string" }
- },
- { "name": "sql", "required": false, "in": "query", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/V1AnalyticsResponse" }
+ "schema": { "$ref": "#/components/schemas/ProjectClaimTokenResponse" }
}
}
},
"403": { "description": "" }
},
+ "tags": ["Projects"],
+ "security": [{ "bearer": [] }]
+ },
+ "post": {
+ "operationId": "v1-create-project-claim-token",
+ "x-internal": true,
+ "summary": "Creates project claim token",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/CreateProjectClaimTokenResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Projects"],
+ "security": [{ "bearer": [] }]
+ },
+ "delete": {
+ "operationId": "v1-delete-project-claim-token",
+ "x-internal": true,
+ "summary": "Revokes project claim token",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": { "204": { "description": "" }, "403": { "description": "" } },
+ "tags": ["Projects"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/advisors/performance": {
+ "get": {
+ "operationId": "v1-get-performance-advisors",
+ "summary": "Gets project performance advisors.",
+ "description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
+ "deprecated": true,
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1ProjectAdvisorsResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Advisors"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/advisors/security": {
+ "get": {
+ "operationId": "v1-get-security-advisors",
+ "summary": "Gets project security advisors.",
+ "description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
+ "deprecated": true,
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "lint_type",
+ "required": false,
+ "in": "query",
+ "schema": { "enum": ["sql"], "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1ProjectAdvisorsResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Advisors"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/analytics/endpoints/logs.all": {
+ "get": {
+ "operationId": "v1-get-project-logs",
+ "summary": "Gets project's logs",
+ "description": "Executes a SQL query on the project's logs.\n\nEither the 'iso_timestamp_start' and 'iso_timestamp_end' parameters must be provided.\nIf both are not provided, only the last 1 minute of logs will be queried.\nThe timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.\n",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ { "name": "sql", "required": false, "in": "query", "schema": { "type": "string" } },
+ {
+ "name": "iso_timestamp_start",
+ "required": false,
+ "in": "query",
+ "schema": { "format": "date-time", "type": "string" }
+ },
+ {
+ "name": "iso_timestamp_end",
+ "required": false,
+ "in": "query",
+ "schema": { "format": "date-time", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsResponse" } }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Analytics"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/analytics/endpoints/usage.api-counts": {
+ "get": {
+ "operationId": "v1-get-project-usage-api-count",
+ "summary": "Gets project's usage api counts",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "interval",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "enum": ["15min", "30min", "1hr", "3hr", "1day", "3day", "7day"],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsResponse" } }
+ }
+ },
+ "403": { "description": "" },
+ "500": { "description": "Failed to get project's usage api counts" }
+ },
+ "tags": ["Analytics"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count": {
+ "get": {
+ "operationId": "v1-get-project-usage-request-count",
+ "summary": "Gets project's usage api requests count",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsResponse" } }
+ }
+ },
+ "500": { "description": "Failed to get project's usage api requests count" }
+ },
"tags": ["Analytics"],
"security": [{ "bearer": [] }]
}
},
"/v1/projects/{ref}/database/migrations": {
"get": {
- "operationId": "v1-list-migrations",
+ "operationId": "v1-list-migration-history",
"summary": "[Beta] List applied migration versions",
"description": "Only available to selected partner OAuth apps",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2208,18 +3067,72 @@
"summary": "[Beta] Apply a database migration",
"description": "Only available to selected partner OAuth apps",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
- ],
- "responses": {
- "200": {
- "description": "",
- "content": { "application/json": { "schema": { "type": "object" } } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
+ {
+ "name": "Idempotency-Key",
+ "required": false,
+ "in": "header",
+ "description": "A unique key to ensure the same migration is tracked only once.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1CreateMigrationBody" }
+ }
+ }
+ },
+ "responses": {
+ "200": { "description": "" },
"403": { "description": "" },
"500": { "description": "Failed to apply database migration" }
},
"tags": ["Database"],
"security": [{ "bearer": [] }]
+ },
+ "put": {
+ "operationId": "v1-upsert-a-migration",
+ "summary": "[Beta] Upsert a database migration without applying",
+ "description": "Only available to selected partner OAuth apps",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "Idempotency-Key",
+ "required": false,
+ "in": "header",
+ "description": "A unique key to ensure the same migration is tracked only once.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1UpsertMigrationBody" }
+ }
+ }
+ },
+ "responses": {
+ "200": { "description": "" },
+ "403": { "description": "" },
+ "500": { "description": "Failed to upsert database migration" }
+ },
+ "tags": ["Database"],
+ "security": [{ "bearer": [] }]
}
},
"/v1/projects/{ref}/database/query": {
@@ -2227,7 +3140,13 @@
"operationId": "v1-run-a-query",
"summary": "[Beta] Run sql query",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -2236,10 +3155,7 @@
}
},
"responses": {
- "201": {
- "description": "",
- "content": { "application/json": { "schema": { "type": "object" } } }
- },
+ "201": { "description": "" },
"403": { "description": "" },
"500": { "description": "Failed to run sql query" }
},
@@ -2257,7 +3173,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -2271,19 +3187,25 @@
},
"/v1/projects/{ref}/database/context": {
"get": {
- "operationId": "getDatabaseMetadata",
+ "operationId": "v1-get-database-metadata",
"summary": "Gets database metadata for the given project.",
"description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
"deprecated": true,
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
- "schema": { "$ref": "#/components/schemas/GetProjectDbMetadataResponseDto" }
+ "schema": { "$ref": "#/components/schemas/GetProjectDbMetadataResponse" }
}
}
},
@@ -2299,7 +3221,13 @@
"summary": "List all functions",
"description": "Returns all functions you've previously added to the specified project.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2324,12 +3252,45 @@
"summary": "Create a function",
"description": "This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project.",
"deprecated": true,
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/vnd.denoland.eszip": {
+ "schema": { "type": "string", "format": "binary" }
+ },
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1CreateFunctionBody" }
+ }
+ }
+ },
"parameters": [
{
- "name": "import_map_path",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "slug",
"required": false,
"in": "query",
- "schema": { "type": "string" }
+ "schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
+ },
+ { "name": "name", "required": false, "in": "query", "schema": { "type": "string" } },
+ {
+ "name": "verify_jwt",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ },
+ {
+ "name": "import_map",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
},
{
"name": "entrypoint_path",
@@ -2338,32 +3299,18 @@
"schema": { "type": "string" }
},
{
- "name": "import_map",
+ "name": "import_map_path",
"required": false,
"in": "query",
- "schema": { "type": "boolean" }
+ "schema": { "type": "string" }
},
{
- "name": "verify_jwt",
+ "name": "ezbr_sha256",
"required": false,
"in": "query",
- "schema": { "type": "boolean" }
- },
- { "name": "name", "required": false, "in": "query", "schema": { "type": "string" } },
- { "name": "slug", "required": false, "in": "query", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
- ],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": { "$ref": "#/components/schemas/V1CreateFunctionBody" }
- },
- "application/vnd.denoland.eszip": {
- "schema": { "$ref": "#/components/schemas/V1CreateFunctionBody" }
- }
+ "schema": { "type": "string" }
}
- },
+ ],
"responses": {
"201": {
"description": "",
@@ -2382,16 +3329,19 @@
"summary": "Bulk update functions",
"description": "Bulk update functions. It will create a new function or replace existing. The operation is idempotent. NOTE: You will need to manually bump the version.",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
"content": {
"application/json": {
- "schema": {
- "type": "array",
- "items": { "$ref": "#/components/schemas/BulkUpdateFunctionBody" }
- }
+ "schema": { "$ref": "#/components/schemas/BulkUpdateFunctionBody" }
}
}
},
@@ -2417,14 +3367,26 @@
"summary": "Deploy a function",
"description": "A new endpoint to deploy functions. It will create if function does not exist.",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "slug",
+ "required": false,
+ "in": "query",
+ "schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
+ },
{
"name": "bundleOnly",
"required": false,
"in": "query",
+ "description": "Boolean string, true or false",
"schema": { "type": "boolean" }
- },
- { "name": "slug", "required": false, "in": "query", "schema": { "type": "string" } },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ }
],
"requestBody": {
"required": true,
@@ -2456,13 +3418,20 @@
"summary": "Retrieve a function",
"description": "Retrieves a function with the specified slug and project.",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{
"name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ }
],
"responses": {
"200": {
@@ -2483,12 +3452,52 @@
"operationId": "v1-update-a-function",
"summary": "Update a function",
"description": "Updates a function with the specified slug and project.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/vnd.denoland.eszip": {
+ "schema": { "type": "string", "format": "binary" }
+ },
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1UpdateFunctionBody" }
+ }
+ }
+ },
"parameters": [
{
- "name": "import_map_path",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "function_slug",
+ "required": true,
+ "in": "path",
+ "description": "Function slug",
+ "schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
+ },
+ {
+ "name": "slug",
"required": false,
"in": "query",
- "schema": { "type": "string" }
+ "schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
+ },
+ { "name": "name", "required": false, "in": "query", "schema": { "type": "string" } },
+ {
+ "name": "verify_jwt",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
+ },
+ {
+ "name": "import_map",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": { "type": "boolean" }
},
{
"name": "entrypoint_path",
@@ -2497,37 +3506,18 @@
"schema": { "type": "string" }
},
{
- "name": "import_map",
+ "name": "import_map_path",
"required": false,
"in": "query",
- "schema": { "type": "boolean" }
+ "schema": { "type": "string" }
},
{
- "name": "verify_jwt",
+ "name": "ezbr_sha256",
"required": false,
"in": "query",
- "schema": { "type": "boolean" }
- },
- { "name": "name", "required": false, "in": "query", "schema": { "type": "string" } },
- {
- "name": "function_slug",
- "required": true,
- "in": "path",
- "schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
- ],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": { "$ref": "#/components/schemas/V1UpdateFunctionBody" }
- },
- "application/vnd.denoland.eszip": {
- "schema": { "$ref": "#/components/schemas/V1UpdateFunctionBody" }
- }
+ "schema": { "type": "string" }
}
- },
+ ],
"responses": {
"200": {
"description": "",
@@ -2546,13 +3536,20 @@
"summary": "Delete a function",
"description": "Deletes a function with the specified slug from the specified project.",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{
"name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ }
],
"responses": {
"200": { "description": "" },
@@ -2569,16 +3566,28 @@
"summary": "Retrieve a function body",
"description": "Retrieves a function body for the specified slug and project.",
"parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
{
"name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": { "pattern": "^[A-Za-z0-9_-]+$", "type": "string" }
- },
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ }
],
"responses": {
- "200": { "description": "" },
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/StreamableFile" } }
+ }
+ },
"403": { "description": "" },
"500": { "description": "Failed to retrieve function body with given slug" }
},
@@ -2596,7 +3605,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -2628,7 +3637,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"requestBody": {
@@ -2661,7 +3670,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -2690,9 +3699,14 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
- { "name": "provider_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "provider_id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2720,9 +3734,14 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
- { "name": "provider_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "provider_id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -2756,9 +3775,14 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
},
- { "name": "provider_id", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "provider_id",
+ "required": true,
+ "in": "path",
+ "schema": { "format": "uuid", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2788,7 +3812,7 @@
"required": true,
"in": "path",
"description": "Project ref",
- "schema": { "minLength": 20, "maxLength": 20, "type": "string" }
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
}
],
"responses": {
@@ -2810,7 +3834,13 @@
"operationId": "v1-restore-pitr-backup",
"summary": "Restores a PITR backup for a database",
"parameters": [
- { "name": "ref", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
],
"requestBody": {
"required": true,
@@ -2823,12 +3853,113 @@
"security": [{ "bearer": [] }]
}
},
+ "/v1/projects/{ref}/database/backups/restore-point": {
+ "post": {
+ "operationId": "v1-create-restore-point",
+ "x-internal": true,
+ "summary": "Initiates a creation of a restore point for a database",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1RestorePointPostBody" }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1RestorePointResponse" }
+ }
+ }
+ }
+ },
+ "tags": ["Database"],
+ "security": [{ "bearer": [] }]
+ },
+ "get": {
+ "operationId": "v1-get-restore-point",
+ "x-internal": true,
+ "summary": "Get restore points for project",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ },
+ {
+ "name": "name",
+ "required": false,
+ "in": "query",
+ "schema": { "maxLength": 20, "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/V1RestorePointResponse" }
+ }
+ }
+ },
+ "403": { "description": "" },
+ "500": { "description": "Failed to get requested restore points" }
+ },
+ "tags": ["Database"],
+ "security": [{ "bearer": [] }]
+ }
+ },
+ "/v1/projects/{ref}/database/backups/undo": {
+ "post": {
+ "operationId": "v1-undo",
+ "x-internal": true,
+ "summary": "Initiates an undo to a given restore point",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": { "schema": { "$ref": "#/components/schemas/V1UndoBody" } }
+ }
+ },
+ "responses": { "201": { "description": "" }, "403": { "description": "" } },
+ "tags": ["Database"],
+ "security": [{ "bearer": [] }]
+ }
+ },
"/v1/organizations/{slug}/members": {
"get": {
"operationId": "v1-list-organization-members",
"summary": "List members of an organization",
"parameters": [
- { "name": "slug", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": { "pattern": "^[\\w-]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2853,7 +3984,13 @@
"operationId": "v1-get-an-organization",
"summary": "Gets information about the organization",
"parameters": [
- { "name": "slug", "required": true, "in": "path", "schema": { "type": "string" } }
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": { "pattern": "^[\\w-]+$", "type": "string" }
+ }
],
"responses": {
"200": {
@@ -2869,6 +4006,54 @@
"tags": ["Organizations"],
"security": [{ "bearer": [] }]
}
+ },
+ "/v1/organizations/{slug}/project-claim/{token}": {
+ "get": {
+ "operationId": "v1-get-organization-project-claim",
+ "x-internal": true,
+ "summary": "Gets project details for the specified organization and claim token",
+ "parameters": [
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": { "pattern": "^[\\w-]+$", "type": "string" }
+ },
+ { "name": "token", "required": true, "in": "path", "schema": { "type": "string" } }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/OrganizationProjectClaimResponse" }
+ }
+ }
+ },
+ "403": { "description": "" }
+ },
+ "tags": ["Organizations"],
+ "security": [{ "bearer": [] }]
+ },
+ "post": {
+ "operationId": "v1-claim-project-for-organization",
+ "x-internal": true,
+ "summary": "Claims project for the specified organization",
+ "parameters": [
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": { "pattern": "^[\\w-]+$", "type": "string" }
+ },
+ { "name": "token", "required": true, "in": "path", "schema": { "type": "string" } }
+ ],
+ "responses": { "204": { "description": "" }, "403": { "description": "" } },
+ "tags": ["Organizations"],
+ "security": [{ "bearer": [] }]
+ }
}
},
"info": {
@@ -2878,7 +4063,10 @@
"contact": {}
},
"tags": [
+ { "name": "Advisors", "description": "Advisors related endpoints" },
+ { "name": "Analytics", "description": "Analytics related endpoints" },
{ "name": "Auth", "description": "Auth related endpoints" },
+ { "name": "Billing", "description": "Billing related endpoints" },
{ "name": "Database", "description": "Database related endpoints" },
{ "name": "Domains", "description": "Domains related endpoints" },
{ "name": "Edge Functions", "description": "Edge related endpoints" },
@@ -2922,7 +4110,7 @@
]
},
"db_host": { "type": "string" },
- "db_port": { "type": "number" },
+ "db_port": { "type": "integer", "minimum": 0, "exclusiveMinimum": true },
"db_user": { "type": "string" },
"db_pass": { "type": "string" },
"jwt_secret": { "type": "string" }
@@ -2958,13 +4146,14 @@
"FUNCTIONS_DEPLOYED",
"FUNCTIONS_FAILED"
]
- }
+ },
+ "request_review": { "type": "boolean" }
}
},
"BranchResponse": {
"type": "object",
"properties": {
- "id": { "type": "string" },
+ "id": { "type": "string", "format": "uuid" },
"name": { "type": "string" },
"project_ref": { "type": "string" },
"parent_project_ref": { "type": "string" },
@@ -2988,8 +4177,9 @@
"FUNCTIONS_FAILED"
]
},
- "created_at": { "type": "string" },
- "updated_at": { "type": "string" }
+ "created_at": { "type": "string", "format": "date-time" },
+ "updated_at": { "type": "string", "format": "date-time" },
+ "review_requested_at": { "type": "string", "format": "date-time" }
},
"required": [
"id",
@@ -3008,6 +4198,10 @@
"properties": { "message": { "type": "string", "enum": ["ok"] } },
"required": ["message"]
},
+ "BranchActionBody": {
+ "type": "object",
+ "properties": { "migration_version": { "type": "string" } }
+ },
"BranchUpdateResponse": {
"type": "object",
"properties": {
@@ -3016,16 +4210,6 @@
},
"required": ["workflow_run_id", "message"]
},
- "V1DatabaseResponse": {
- "type": "object",
- "properties": {
- "host": { "type": "string", "description": "Database host" },
- "version": { "type": "string", "description": "Database version" },
- "postgres_engine": { "type": "string", "description": "Database engine" },
- "release_channel": { "type": "string", "description": "Release channel" }
- },
- "required": ["host", "version", "postgres_engine", "release_channel"]
- },
"V1ProjectWithDatabaseResponse": {
"type": "object",
"properties": {
@@ -3062,15 +4246,24 @@
"RESIZING"
]
},
- "database": { "$ref": "#/components/schemas/V1DatabaseResponse" }
+ "database": {
+ "type": "object",
+ "properties": {
+ "host": { "type": "string", "description": "Database host" },
+ "version": { "type": "string", "description": "Database version" },
+ "postgres_engine": { "type": "string", "description": "Database engine" },
+ "release_channel": { "type": "string", "description": "Release channel" }
+ },
+ "required": ["host", "version", "postgres_engine", "release_channel"]
+ }
},
"required": ["id", "organization_id", "name", "region", "created_at", "status", "database"]
},
- "V1CreateProjectBodyDto": {
+ "V1CreateProjectBody": {
"type": "object",
"properties": {
"db_pass": { "type": "string", "description": "Database password" },
- "name": { "type": "string", "description": "Name of your project" },
+ "name": { "type": "string", "maxLength": 256, "description": "Name of your project" },
"organization_id": { "type": "string", "description": "Slug of your organization" },
"plan": {
"type": "string",
@@ -3110,6 +4303,8 @@
"desired_instance_size": {
"type": "string",
"enum": [
+ "pico",
+ "nano",
"micro",
"small",
"medium",
@@ -3119,7 +4314,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"template_url": {
@@ -3177,7 +4380,7 @@
"properties": { "id": { "type": "string" }, "name": { "type": "string" } },
"required": ["id", "name"]
},
- "CreateOrganizationV1Dto": {
+ "CreateOrganizationV1": {
"type": "object",
"properties": { "name": { "type": "string" } },
"required": ["name"],
@@ -3207,7 +4410,7 @@
"required": ["access_token", "refresh_token", "expires_in", "token_type"],
"additionalProperties": false
},
- "OAuthRevokeTokenBodyDto": {
+ "OAuthRevokeTokenBody": {
"type": "object",
"properties": {
"client_id": { "type": "string", "format": "uuid" },
@@ -3217,23 +4420,56 @@
"required": ["client_id", "client_secret", "refresh_token"],
"additionalProperties": false
},
- "SnippetProject": {
+ "SnippetList": {
"type": "object",
"properties": {
- "id": { "type": "integer", "format": "int64" },
- "name": { "type": "string" }
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "inserted_at": { "type": "string" },
+ "updated_at": { "type": "string" },
+ "type": { "type": "string", "enum": ["sql"] },
+ "visibility": { "type": "string", "enum": ["user", "project", "org", "public"] },
+ "name": { "type": "string" },
+ "description": { "type": "string", "nullable": true },
+ "project": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "name": { "type": "string" } },
+ "required": ["id", "name"]
+ },
+ "owner": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "username": { "type": "string" } },
+ "required": ["id", "username"]
+ },
+ "updated_by": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "username": { "type": "string" } },
+ "required": ["id", "username"]
+ }
+ },
+ "required": [
+ "id",
+ "inserted_at",
+ "updated_at",
+ "type",
+ "visibility",
+ "name",
+ "description",
+ "project",
+ "owner",
+ "updated_by"
+ ]
+ }
+ },
+ "cursor": { "type": "string" }
},
- "required": ["id", "name"]
+ "required": ["data"]
},
- "SnippetUser": {
- "type": "object",
- "properties": {
- "id": { "type": "integer", "format": "int64" },
- "username": { "type": "string" }
- },
- "required": ["id", "username"]
- },
- "SnippetMeta": {
+ "SnippetResponse": {
"type": "object",
"properties": {
"id": { "type": "string" },
@@ -3243,54 +4479,30 @@
"visibility": { "type": "string", "enum": ["user", "project", "org", "public"] },
"name": { "type": "string" },
"description": { "type": "string", "nullable": true },
- "project": { "$ref": "#/components/schemas/SnippetProject" },
- "owner": { "$ref": "#/components/schemas/SnippetUser" },
- "updated_by": { "$ref": "#/components/schemas/SnippetUser" }
- },
- "required": [
- "id",
- "inserted_at",
- "updated_at",
- "type",
- "visibility",
- "name",
- "description",
- "project",
- "owner",
- "updated_by"
- ]
- },
- "SnippetList": {
- "type": "object",
- "properties": {
- "data": { "type": "array", "items": { "$ref": "#/components/schemas/SnippetMeta" } },
- "cursor": { "type": "string" }
- },
- "required": ["data"]
- },
- "SnippetContent": {
- "type": "object",
- "properties": {
- "favorite": { "type": "boolean" },
- "schema_version": { "type": "string" },
- "sql": { "type": "string" }
- },
- "required": ["favorite", "schema_version", "sql"]
- },
- "SnippetResponse": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "inserted_at": { "type": "string" },
- "updated_at": { "type": "string" },
- "type": { "type": "string", "enum": ["sql"] },
- "visibility": { "enum": ["user", "project", "org", "public"], "type": "string" },
- "name": { "type": "string" },
- "description": { "type": "string", "nullable": true },
- "project": { "$ref": "#/components/schemas/SnippetProject" },
- "owner": { "$ref": "#/components/schemas/SnippetUser" },
- "updated_by": { "$ref": "#/components/schemas/SnippetUser" },
- "content": { "$ref": "#/components/schemas/SnippetContent" }
+ "project": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "name": { "type": "string" } },
+ "required": ["id", "name"]
+ },
+ "owner": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "username": { "type": "string" } },
+ "required": ["id", "username"]
+ },
+ "updated_by": {
+ "type": "object",
+ "properties": { "id": { "type": "number" }, "username": { "type": "string" } },
+ "required": ["id", "username"]
+ },
+ "content": {
+ "type": "object",
+ "properties": {
+ "favorite": { "type": "boolean" },
+ "schema_version": { "type": "string" },
+ "sql": { "type": "string" }
+ },
+ "required": ["favorite", "schema_version", "sql"]
+ }
},
"required": [
"id",
@@ -3309,15 +4521,15 @@
"ApiKeyResponse": {
"type": "object",
"properties": {
- "name": { "type": "string" },
- "api_key": { "type": "string" },
+ "api_key": { "type": "string", "nullable": true },
"id": { "type": "string", "nullable": true },
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": { "type": "string", "nullable": true },
+ "name": { "type": "string" },
"description": { "type": "string", "nullable": true },
"hash": { "type": "string", "nullable": true },
"secret_jwt_template": {
@@ -3329,12 +4541,23 @@
"inserted_at": { "type": "string", "format": "date-time", "nullable": true },
"updated_at": { "type": "string", "format": "date-time", "nullable": true }
},
- "required": ["name", "api_key"]
+ "required": ["name"]
+ },
+ "LegacyApiKeysResponse": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
},
"CreateApiKeyBody": {
"type": "object",
"properties": {
"type": { "type": "string", "enum": ["publishable", "secret"] },
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": { "type": "string", "nullable": true },
"secret_jwt_template": {
"type": "object",
@@ -3343,11 +4566,17 @@
"nullable": true
}
},
- "required": ["type"]
+ "required": ["type", "name"]
},
"UpdateApiKeyBody": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": { "type": "string", "nullable": true },
"secret_jwt_template": {
"type": "object",
@@ -3362,6 +4591,7 @@
"properties": {
"branch_name": { "type": "string", "minLength": 1 },
"git_branch": { "type": "string" },
+ "is_default": { "type": "boolean" },
"persistent": { "type": "boolean" },
"region": { "type": "string" },
"desired_instance_size": {
@@ -3378,7 +4608,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"release_channel": {
@@ -3388,92 +4626,96 @@
},
"postgres_engine": {
"type": "string",
- "enum": ["15", "17-oriole"],
+ "enum": ["15", "17", "17-oriole"],
"description": "Postgres engine version. If not provided, the latest version will be used."
},
- "secrets": { "type": "object", "additionalProperties": { "type": "string" } }
+ "secrets": { "type": "object", "additionalProperties": { "type": "string" } },
+ "with_data": { "type": "boolean" }
},
"required": ["branch_name"]
},
- "ValidationRecord": {
- "type": "object",
- "properties": { "txt_name": { "type": "string" }, "txt_value": { "type": "string" } },
- "required": ["txt_name", "txt_value"]
- },
- "ValidationError": {
- "type": "object",
- "properties": { "message": { "type": "string" } },
- "required": ["message"]
- },
- "SslValidation": {
- "type": "object",
- "properties": {
- "status": { "type": "string" },
- "validation_records": {
- "type": "array",
- "items": { "$ref": "#/components/schemas/ValidationRecord" }
- },
- "validation_errors": {
- "type": "array",
- "items": { "$ref": "#/components/schemas/ValidationError" }
- }
- },
- "required": ["status", "validation_records"]
- },
- "OwnershipVerification": {
- "type": "object",
- "properties": {
- "type": { "type": "string" },
- "name": { "type": "string" },
- "value": { "type": "string" }
- },
- "required": ["type", "name", "value"]
- },
- "CustomHostnameDetails": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "hostname": { "type": "string" },
- "ssl": { "$ref": "#/components/schemas/SslValidation" },
- "ownership_verification": { "$ref": "#/components/schemas/OwnershipVerification" },
- "custom_origin_server": { "type": "string" },
- "verification_errors": { "type": "array", "items": { "type": "string" } },
- "status": { "type": "string" }
- },
- "required": [
- "id",
- "hostname",
- "ssl",
- "ownership_verification",
- "custom_origin_server",
- "status"
- ]
- },
- "CfResponse": {
- "type": "object",
- "properties": {
- "success": { "type": "boolean" },
- "errors": { "type": "array", "items": { "type": "object" } },
- "messages": { "type": "array", "items": { "type": "object" } },
- "result": { "$ref": "#/components/schemas/CustomHostnameDetails" }
- },
- "required": ["success", "errors", "messages", "result"]
- },
"UpdateCustomHostnameResponse": {
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": { "type": "string" },
- "data": { "$ref": "#/components/schemas/CfResponse" }
+ "data": {
+ "type": "object",
+ "properties": {
+ "success": { "type": "boolean" },
+ "errors": {
+ "type": "array",
+ "items": { "description": "Any JSON-serializable value" }
+ },
+ "messages": {
+ "type": "array",
+ "items": { "description": "Any JSON-serializable value" }
+ },
+ "result": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "hostname": { "type": "string" },
+ "ssl": {
+ "type": "object",
+ "properties": {
+ "status": { "type": "string" },
+ "validation_records": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "txt_name": { "type": "string" },
+ "txt_value": { "type": "string" }
+ },
+ "required": ["txt_name", "txt_value"]
+ }
+ },
+ "validation_errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "message": { "type": "string" } },
+ "required": ["message"]
+ }
+ }
+ },
+ "required": ["status", "validation_records"]
+ },
+ "ownership_verification": {
+ "type": "object",
+ "properties": {
+ "type": { "type": "string" },
+ "name": { "type": "string" },
+ "value": { "type": "string" }
+ },
+ "required": ["type", "name", "value"]
+ },
+ "custom_origin_server": { "type": "string" },
+ "verification_errors": { "type": "array", "items": { "type": "string" } },
+ "status": { "type": "string" }
+ },
+ "required": [
+ "id",
+ "hostname",
+ "ssl",
+ "ownership_verification",
+ "custom_origin_server",
+ "status"
+ ]
+ }
+ },
+ "required": ["success", "errors", "messages", "result"]
+ }
},
"required": ["status", "custom_hostname", "data"]
},
@@ -3489,9 +4731,30 @@
},
"required": ["banned_ipv4_addresses"]
},
+ "NetworkBanResponseEnriched": {
+ "type": "object",
+ "properties": {
+ "banned_ipv4_addresses": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "banned_address": { "type": "string" },
+ "identifier": { "type": "string" },
+ "type": { "type": "string" }
+ },
+ "required": ["banned_address", "identifier", "type"]
+ }
+ }
+ },
+ "required": ["banned_ipv4_addresses"]
+ },
"RemoveNetworkBanRequest": {
"type": "object",
- "properties": { "ipv4_addresses": { "type": "array", "items": { "type": "string" } } },
+ "properties": {
+ "ipv4_addresses": { "type": "array", "items": { "type": "string" } },
+ "identifier": { "type": "string" }
+ },
"required": ["ipv4_addresses"]
},
"NetworkRestrictionsResponse": {
@@ -3576,7 +4839,7 @@
"V1ProjectRefResponse": {
"type": "object",
"properties": {
- "id": { "type": "integer", "format": "int64" },
+ "id": { "type": "integer" },
"ref": { "type": "string" },
"name": { "type": "string" }
},
@@ -3592,18 +4855,21 @@
"required": ["name", "value"]
},
"CreateSecretBody": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "maxLength": 256,
- "pattern": "^(?!SUPABASE_).*",
- "description": "Secret name must not start with the SUPABASE_ prefix.",
- "example": "string"
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 256,
+ "pattern": "^(?!SUPABASE_).*",
+ "description": "Secret name must not start with the SUPABASE_ prefix.",
+ "example": "string"
+ },
+ "value": { "type": "string", "maxLength": 24576 }
},
- "value": { "type": "string", "maxLength": 24576 }
- },
- "required": ["name", "value"]
+ "required": ["name", "value"]
+ }
},
"SslEnforcementResponse": {
"type": "object",
@@ -3687,7 +4953,7 @@
"items": {
"type": "object",
"properties": {
- "postgres_version": { "type": "string", "enum": ["15", "17-oriole"] },
+ "postgres_version": { "type": "string", "enum": ["15", "17", "17-oriole"] },
"release_channel": {
"type": "string",
"enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
@@ -3697,10 +4963,14 @@
"required": ["postgres_version", "release_channel", "app_version"]
}
},
- "potential_breaking_changes": { "type": "array", "items": { "type": "string" } },
"duration_estimate_hours": { "type": "number" },
"legacy_auth_custom_roles": { "type": "array", "items": { "type": "string" } },
- "extension_dependent_objects": { "type": "array", "items": { "type": "string" } }
+ "objects_to_be_dropped": { "type": "array", "items": { "type": "string" } },
+ "unsupported_extensions": { "type": "array", "items": { "type": "string" } },
+ "user_defined_objects_in_internal_schemas": {
+ "type": "array",
+ "items": { "type": "string" }
+ }
},
"required": [
"eligible",
@@ -3708,10 +4978,11 @@
"current_app_version_release_channel",
"latest_app_version",
"target_upgrade_versions",
- "potential_breaking_changes",
"duration_estimate_hours",
"legacy_auth_custom_roles",
- "extension_dependent_objects"
+ "objects_to_be_dropped",
+ "unsupported_extensions",
+ "user_defined_objects_in_internal_schemas"
]
},
"DatabaseUpgradeStatusResponse": {
@@ -3806,40 +5077,115 @@
"properties": { "database_identifier": { "type": "string" } },
"required": ["database_identifier"]
},
- "AuthHealthResponse": {
- "type": "object",
- "properties": { "name": { "type": "string", "enum": ["GoTrue"] } },
- "required": ["name"]
- },
- "RealtimeHealthResponse": {
- "type": "object",
- "properties": { "connected_cluster": { "type": "integer" } },
- "required": ["connected_cluster"]
- },
"V1ServiceHealthResponse": {
"type": "object",
"properties": {
- "info": {
- "oneOf": [
- { "$ref": "#/components/schemas/AuthHealthResponse" },
- { "$ref": "#/components/schemas/RealtimeHealthResponse" }
- ]
- },
"name": {
- "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"],
- "type": "string"
+ "type": "string",
+ "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"]
},
"healthy": { "type": "boolean" },
- "status": { "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"], "type": "string" },
+ "status": { "type": "string", "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"] },
+ "info": {
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string", "enum": ["GoTrue"] },
+ "version": { "type": "string" },
+ "description": { "type": "string" }
+ },
+ "required": ["name", "version", "description"]
+ },
+ {
+ "type": "object",
+ "properties": {
+ "healthy": { "type": "boolean" },
+ "db_connected": { "type": "boolean" },
+ "connected_cluster": { "type": "integer" }
+ },
+ "required": ["healthy", "db_connected", "connected_cluster"]
+ }
+ ]
+ },
"error": { "type": "string" }
},
"required": ["name", "healthy", "status"]
},
+ "SigningKeyResponse": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string", "format": "uuid" },
+ "algorithm": { "type": "string", "enum": ["EdDSA", "ES256", "RS256", "HS256"] },
+ "status": {
+ "type": "string",
+ "enum": ["in_use", "previously_used", "revoked", "standby"]
+ },
+ "public_jwk": { "nullable": true },
+ "created_at": { "type": "string", "format": "date-time" },
+ "updated_at": { "type": "string", "format": "date-time" }
+ },
+ "required": ["id", "algorithm", "status", "created_at", "updated_at"],
+ "additionalProperties": false
+ },
"CreateSigningKeyBody": {
"type": "object",
"properties": {
"algorithm": { "type": "string", "enum": ["EdDSA", "ES256", "RS256", "HS256"] },
- "status": { "type": "string", "enum": ["in_use", "standby"] }
+ "status": { "type": "string", "enum": ["in_use", "standby"] },
+ "private_jwk": {
+ "discriminator": { "propertyName": "kty" },
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "kty": { "type": "string", "enum": ["RSA"] },
+ "n": { "type": "string" },
+ "e": { "type": "string", "enum": ["AQAB"] },
+ "d": { "type": "string" },
+ "p": { "type": "string" },
+ "q": { "type": "string" },
+ "dp": { "type": "string" },
+ "dq": { "type": "string" },
+ "qi": { "type": "string" }
+ },
+ "required": ["kty", "n", "e", "d", "p", "q", "dp", "dq", "qi"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": { "type": "string", "enum": ["EC"] },
+ "crv": { "type": "string", "enum": ["P-256"] },
+ "x": { "type": "string" },
+ "y": { "type": "string" },
+ "d": { "type": "string" }
+ },
+ "required": ["kty", "crv", "x", "y", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": { "type": "string", "enum": ["OKP"] },
+ "crv": { "type": "string", "enum": ["Ed25519"] },
+ "x": { "type": "string" },
+ "d": { "type": "string" }
+ },
+ "required": ["kty", "crv", "x", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": { "type": "string", "enum": ["oct"] },
+ "k": { "type": "string", "minLength": 16 }
+ },
+ "required": ["kty", "k"],
+ "additionalProperties": false
+ }
+ ]
+ }
},
"required": ["algorithm"],
"additionalProperties": false
@@ -3870,22 +5216,6 @@
"required": ["keys"],
"additionalProperties": false
},
- "SigningKeyResponse": {
- "type": "object",
- "properties": {
- "id": { "type": "string", "format": "uuid" },
- "algorithm": { "type": "string", "enum": ["EdDSA", "ES256", "RS256", "HS256"] },
- "status": {
- "type": "string",
- "enum": ["in_use", "previously_used", "revoked", "standby"]
- },
- "public_jwk": { "nullable": true },
- "created_at": { "type": "string", "format": "date-time" },
- "updated_at": { "type": "string", "format": "date-time" }
- },
- "required": ["id", "algorithm", "status", "created_at", "updated_at"],
- "additionalProperties": false
- },
"UpdateSigningKeyBody": {
"type": "object",
"properties": {
@@ -3897,31 +5227,31 @@
"required": ["status"],
"additionalProperties": false
},
- "StorageFeatureImageTransformation": {
- "type": "object",
- "properties": { "enabled": { "type": "boolean" } },
- "required": ["enabled"]
- },
- "StorageFeatureS3Protocol": {
- "type": "object",
- "properties": { "enabled": { "type": "boolean" } },
- "required": ["enabled"]
- },
- "StorageFeatures": {
- "type": "object",
- "properties": {
- "imageTransformation": {
- "$ref": "#/components/schemas/StorageFeatureImageTransformation"
- },
- "s3Protocol": { "$ref": "#/components/schemas/StorageFeatureS3Protocol" }
- },
- "required": ["imageTransformation", "s3Protocol"]
- },
"StorageConfigResponse": {
"type": "object",
"properties": {
"fileSizeLimit": { "type": "integer", "format": "int64" },
- "features": { "$ref": "#/components/schemas/StorageFeatures" }
+ "features": {
+ "type": "object",
+ "properties": {
+ "imageTransformation": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ },
+ "s3Protocol": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ }
+ },
+ "required": ["imageTransformation", "s3Protocol"]
+ }
},
"required": ["fileSizeLimit", "features"]
},
@@ -3931,10 +5261,30 @@
"fileSizeLimit": {
"type": "integer",
"minimum": 0,
- "maximum": 53687091200,
+ "maximum": 536870912000,
"format": "int64"
},
- "features": { "$ref": "#/components/schemas/StorageFeatures" }
+ "features": {
+ "type": "object",
+ "properties": {
+ "imageTransformation": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ },
+ "s3Protocol": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" } },
+ "required": ["enabled"]
+ }
+ },
+ "required": ["imageTransformation", "s3Protocol"]
+ }
}
},
"PostgresConfigResponse": {
@@ -3956,13 +5306,13 @@
"max_wal_size": { "type": "string" },
"max_wal_senders": { "type": "integer" },
"max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 },
+ "session_replication_role": { "type": "string", "enum": ["origin", "replica", "local"] },
"shared_buffers": { "type": "string" },
"statement_timeout": { "type": "string" },
"track_commit_timestamp": { "type": "boolean" },
"wal_keep_size": { "type": "string" },
"wal_sender_timeout": { "type": "string" },
- "work_mem": { "type": "string" },
- "session_replication_role": { "enum": ["origin", "replica", "local"], "type": "string" }
+ "work_mem": { "type": "string" }
}
},
"UpdatePostgresConfigBody": {
@@ -3984,59 +5334,59 @@
"max_wal_size": { "type": "string" },
"max_wal_senders": { "type": "integer" },
"max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 },
+ "session_replication_role": { "type": "string", "enum": ["origin", "replica", "local"] },
"shared_buffers": { "type": "string" },
"statement_timeout": { "type": "string" },
"track_commit_timestamp": { "type": "boolean" },
"wal_keep_size": { "type": "string" },
"wal_sender_timeout": { "type": "string" },
"work_mem": { "type": "string" },
- "restart_database": { "type": "boolean" },
- "session_replication_role": { "enum": ["origin", "replica", "local"], "type": "string" }
+ "restart_database": { "type": "boolean" }
}
},
"V1PgbouncerConfigResponse": {
"type": "object",
"properties": {
- "pool_mode": { "type": "string", "enum": ["transaction", "session", "statement"] },
- "default_pool_size": { "type": "number" },
+ "default_pool_size": { "type": "integer" },
"ignore_startup_parameters": { "type": "string" },
- "max_client_conn": { "type": "number" },
- "connection_string": { "type": "string" }
+ "max_client_conn": { "type": "integer" },
+ "pool_mode": { "type": "string", "enum": ["transaction", "session", "statement"] },
+ "connection_string": { "type": "string" },
+ "server_idle_timeout": { "type": "integer" },
+ "server_lifetime": { "type": "integer" },
+ "query_wait_timeout": { "type": "integer" },
+ "reserve_pool_size": { "type": "integer" }
}
},
"SupavisorConfigResponse": {
"type": "object",
"properties": {
- "database_type": { "type": "string", "enum": ["PRIMARY", "READ_REPLICA"] },
- "db_port": { "type": "integer" },
- "connectionString": {
- "type": "string",
- "deprecated": true,
- "description": "Use connection_string instead"
- },
- "default_pool_size": { "type": "integer", "nullable": true },
- "max_client_conn": { "type": "integer", "nullable": true },
- "pool_mode": { "enum": ["transaction", "session"], "type": "string" },
"identifier": { "type": "string" },
+ "database_type": { "type": "string", "enum": ["PRIMARY", "READ_REPLICA"] },
"is_using_scram_auth": { "type": "boolean" },
"db_user": { "type": "string" },
"db_host": { "type": "string" },
+ "db_port": { "type": "integer" },
"db_name": { "type": "string" },
- "connection_string": { "type": "string" }
+ "connection_string": { "type": "string" },
+ "connectionString": { "type": "string", "description": "Use connection_string instead" },
+ "default_pool_size": { "type": "integer", "nullable": true },
+ "max_client_conn": { "type": "integer", "nullable": true },
+ "pool_mode": { "type": "string", "enum": ["transaction", "session"] }
},
"required": [
- "database_type",
- "db_port",
- "connectionString",
- "default_pool_size",
- "max_client_conn",
- "pool_mode",
"identifier",
+ "database_type",
"is_using_scram_auth",
"db_user",
"db_host",
+ "db_port",
"db_name",
- "connection_string"
+ "connection_string",
+ "connectionString",
+ "default_pool_size",
+ "max_client_conn",
+ "pool_mode"
]
},
"UpdateSupavisorConfigBody": {
@@ -4044,15 +5394,14 @@
"properties": {
"default_pool_size": {
"type": "integer",
- "nullable": true,
"minimum": 0,
- "maximum": 1000
+ "maximum": 3000,
+ "nullable": true
},
"pool_mode": {
- "enum": ["transaction", "session"],
"type": "string",
- "description": "Dedicated pooler mode for the project",
- "deprecated": true
+ "enum": ["transaction", "session"],
+ "description": "Dedicated pooler mode for the project"
}
}
},
@@ -4069,26 +5418,6 @@
"properties": {
"api_max_request_duration": { "type": "integer", "nullable": true },
"db_max_pool_size": { "type": "integer", "nullable": true },
- "jwt_exp": { "type": "integer", "nullable": true },
- "mailer_otp_exp": { "type": "integer" },
- "mailer_otp_length": { "type": "integer", "nullable": true },
- "mfa_max_enrolled_factors": { "type": "integer", "nullable": true },
- "mfa_phone_otp_length": { "type": "integer" },
- "mfa_phone_max_frequency": { "type": "integer", "nullable": true },
- "password_min_length": { "type": "integer", "nullable": true },
- "rate_limit_anonymous_users": { "type": "integer", "nullable": true },
- "rate_limit_email_sent": { "type": "integer", "nullable": true },
- "rate_limit_sms_sent": { "type": "integer", "nullable": true },
- "rate_limit_token_refresh": { "type": "integer", "nullable": true },
- "rate_limit_verify": { "type": "integer", "nullable": true },
- "rate_limit_otp": { "type": "integer", "nullable": true },
- "security_refresh_token_reuse_interval": { "type": "integer", "nullable": true },
- "sessions_inactivity_timeout": { "type": "integer", "nullable": true },
- "sessions_timebox": { "type": "integer", "nullable": true },
- "sms_max_frequency": { "type": "integer", "nullable": true },
- "sms_otp_exp": { "type": "integer", "nullable": true },
- "sms_otp_length": { "type": "integer" },
- "smtp_max_frequency": { "type": "integer", "nullable": true },
"disable_signup": { "type": "boolean", "nullable": true },
"external_anonymous_users_enabled": { "type": "boolean", "nullable": true },
"external_apple_additional_client_ids": { "type": "string", "nullable": true },
@@ -4157,6 +5486,7 @@
"external_workos_enabled": { "type": "boolean", "nullable": true },
"external_workos_secret": { "type": "string", "nullable": true },
"external_workos_url": { "type": "string", "nullable": true },
+ "external_web3_solana_enabled": { "type": "boolean", "nullable": true },
"external_zoom_client_id": { "type": "string", "nullable": true },
"external_zoom_enabled": { "type": "boolean", "nullable": true },
"external_zoom_secret": { "type": "string", "nullable": true },
@@ -4175,8 +5505,14 @@
"hook_send_email_enabled": { "type": "boolean", "nullable": true },
"hook_send_email_uri": { "type": "string", "nullable": true },
"hook_send_email_secrets": { "type": "string", "nullable": true },
+ "hook_before_user_created_enabled": { "type": "boolean", "nullable": true },
+ "hook_before_user_created_uri": { "type": "string", "nullable": true },
+ "hook_before_user_created_secrets": { "type": "string", "nullable": true },
+ "jwt_exp": { "type": "integer", "nullable": true },
"mailer_allow_unverified_email_sign_ins": { "type": "boolean", "nullable": true },
"mailer_autoconfirm": { "type": "boolean", "nullable": true },
+ "mailer_otp_exp": { "type": "integer" },
+ "mailer_otp_length": { "type": "integer", "nullable": true },
"mailer_secure_email_change_enabled": { "type": "boolean", "nullable": true },
"mailer_subjects_confirmation": { "type": "string", "nullable": true },
"mailer_subjects_email_change": { "type": "string", "nullable": true },
@@ -4190,37 +5526,71 @@
"mailer_templates_magic_link_content": { "type": "string", "nullable": true },
"mailer_templates_reauthentication_content": { "type": "string", "nullable": true },
"mailer_templates_recovery_content": { "type": "string", "nullable": true },
+ "mfa_max_enrolled_factors": { "type": "integer", "nullable": true },
"mfa_totp_enroll_enabled": { "type": "boolean", "nullable": true },
"mfa_totp_verify_enabled": { "type": "boolean", "nullable": true },
"mfa_phone_enroll_enabled": { "type": "boolean", "nullable": true },
"mfa_phone_verify_enabled": { "type": "boolean", "nullable": true },
"mfa_web_authn_enroll_enabled": { "type": "boolean", "nullable": true },
"mfa_web_authn_verify_enabled": { "type": "boolean", "nullable": true },
+ "mfa_phone_otp_length": { "type": "integer" },
"mfa_phone_template": { "type": "string", "nullable": true },
+ "mfa_phone_max_frequency": { "type": "integer", "nullable": true },
"password_hibp_enabled": { "type": "boolean", "nullable": true },
- "password_required_characters": { "type": "string", "nullable": true },
+ "password_min_length": { "type": "integer", "nullable": true },
+ "password_required_characters": {
+ "type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "rate_limit_anonymous_users": { "type": "integer", "nullable": true },
+ "rate_limit_email_sent": { "type": "integer", "nullable": true },
+ "rate_limit_sms_sent": { "type": "integer", "nullable": true },
+ "rate_limit_token_refresh": { "type": "integer", "nullable": true },
+ "rate_limit_verify": { "type": "integer", "nullable": true },
+ "rate_limit_otp": { "type": "integer", "nullable": true },
+ "rate_limit_web3": { "type": "integer", "nullable": true },
"refresh_token_rotation_enabled": { "type": "boolean", "nullable": true },
"saml_enabled": { "type": "boolean", "nullable": true },
"saml_external_url": { "type": "string", "nullable": true },
"saml_allow_encrypted_assertions": { "type": "boolean", "nullable": true },
"security_captcha_enabled": { "type": "boolean", "nullable": true },
- "security_captcha_provider": { "type": "string", "nullable": true },
+ "security_captcha_provider": {
+ "type": "string",
+ "enum": ["turnstile", "hcaptcha"],
+ "nullable": true
+ },
"security_captcha_secret": { "type": "string", "nullable": true },
"security_manual_linking_enabled": { "type": "boolean", "nullable": true },
+ "security_refresh_token_reuse_interval": { "type": "integer", "nullable": true },
"security_update_password_require_reauthentication": {
"type": "boolean",
"nullable": true
},
+ "sessions_inactivity_timeout": { "type": "integer", "nullable": true },
"sessions_single_per_user": { "type": "boolean", "nullable": true },
"sessions_tags": { "type": "string", "nullable": true },
+ "sessions_timebox": { "type": "integer", "nullable": true },
"site_url": { "type": "string", "nullable": true },
"sms_autoconfirm": { "type": "boolean", "nullable": true },
+ "sms_max_frequency": { "type": "integer", "nullable": true },
"sms_messagebird_access_key": { "type": "string", "nullable": true },
"sms_messagebird_originator": { "type": "string", "nullable": true },
- "sms_provider": { "type": "string", "nullable": true },
+ "sms_otp_exp": { "type": "integer", "nullable": true },
+ "sms_otp_length": { "type": "integer" },
+ "sms_provider": {
+ "type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
+ "nullable": true
+ },
"sms_template": { "type": "string", "nullable": true },
"sms_test_otp": { "type": "string", "nullable": true },
- "sms_test_otp_valid_until": { "type": "string", "nullable": true },
+ "sms_test_otp_valid_until": { "type": "string", "format": "date-time", "nullable": true },
"sms_textlocal_api_key": { "type": "string", "nullable": true },
"sms_textlocal_sender": { "type": "string", "nullable": true },
"sms_twilio_account_sid": { "type": "string", "nullable": true },
@@ -4233,8 +5603,9 @@
"sms_vonage_api_key": { "type": "string", "nullable": true },
"sms_vonage_api_secret": { "type": "string", "nullable": true },
"sms_vonage_from": { "type": "string", "nullable": true },
- "smtp_admin_email": { "type": "string", "nullable": true },
+ "smtp_admin_email": { "type": "string", "format": "email", "nullable": true },
"smtp_host": { "type": "string", "nullable": true },
+ "smtp_max_frequency": { "type": "integer", "nullable": true },
"smtp_pass": { "type": "string", "nullable": true },
"smtp_port": { "type": "string", "nullable": true },
"smtp_sender_name": { "type": "string", "nullable": true },
@@ -4244,26 +5615,6 @@
"required": [
"api_max_request_duration",
"db_max_pool_size",
- "jwt_exp",
- "mailer_otp_exp",
- "mailer_otp_length",
- "mfa_max_enrolled_factors",
- "mfa_phone_otp_length",
- "mfa_phone_max_frequency",
- "password_min_length",
- "rate_limit_anonymous_users",
- "rate_limit_email_sent",
- "rate_limit_sms_sent",
- "rate_limit_token_refresh",
- "rate_limit_verify",
- "rate_limit_otp",
- "security_refresh_token_reuse_interval",
- "sessions_inactivity_timeout",
- "sessions_timebox",
- "sms_max_frequency",
- "sms_otp_exp",
- "sms_otp_length",
- "smtp_max_frequency",
"disable_signup",
"external_anonymous_users_enabled",
"external_apple_additional_client_ids",
@@ -4332,6 +5683,7 @@
"external_workos_enabled",
"external_workos_secret",
"external_workos_url",
+ "external_web3_solana_enabled",
"external_zoom_client_id",
"external_zoom_enabled",
"external_zoom_secret",
@@ -4350,8 +5702,14 @@
"hook_send_email_enabled",
"hook_send_email_uri",
"hook_send_email_secrets",
+ "hook_before_user_created_enabled",
+ "hook_before_user_created_uri",
+ "hook_before_user_created_secrets",
+ "jwt_exp",
"mailer_allow_unverified_email_sign_ins",
"mailer_autoconfirm",
+ "mailer_otp_exp",
+ "mailer_otp_length",
"mailer_secure_email_change_enabled",
"mailer_subjects_confirmation",
"mailer_subjects_email_change",
@@ -4365,15 +5723,26 @@
"mailer_templates_magic_link_content",
"mailer_templates_reauthentication_content",
"mailer_templates_recovery_content",
+ "mfa_max_enrolled_factors",
"mfa_totp_enroll_enabled",
"mfa_totp_verify_enabled",
"mfa_phone_enroll_enabled",
"mfa_phone_verify_enabled",
"mfa_web_authn_enroll_enabled",
"mfa_web_authn_verify_enabled",
+ "mfa_phone_otp_length",
"mfa_phone_template",
+ "mfa_phone_max_frequency",
"password_hibp_enabled",
+ "password_min_length",
"password_required_characters",
+ "rate_limit_anonymous_users",
+ "rate_limit_email_sent",
+ "rate_limit_sms_sent",
+ "rate_limit_token_refresh",
+ "rate_limit_verify",
+ "rate_limit_otp",
+ "rate_limit_web3",
"refresh_token_rotation_enabled",
"saml_enabled",
"saml_external_url",
@@ -4382,13 +5751,19 @@
"security_captcha_provider",
"security_captcha_secret",
"security_manual_linking_enabled",
+ "security_refresh_token_reuse_interval",
"security_update_password_require_reauthentication",
+ "sessions_inactivity_timeout",
"sessions_single_per_user",
"sessions_tags",
+ "sessions_timebox",
"site_url",
"sms_autoconfirm",
+ "sms_max_frequency",
"sms_messagebird_access_key",
"sms_messagebird_originator",
+ "sms_otp_exp",
+ "sms_otp_length",
"sms_provider",
"sms_template",
"sms_test_otp",
@@ -4407,6 +5782,7 @@
"sms_vonage_from",
"smtp_admin_email",
"smtp_host",
+ "smtp_max_frequency",
"smtp_pass",
"smtp_port",
"smtp_sender_name",
@@ -4417,71 +5793,113 @@
"UpdateAuthConfigBody": {
"type": "object",
"properties": {
- "jwt_exp": { "type": "integer", "minimum": 0, "maximum": 604800 },
- "smtp_max_frequency": { "type": "integer", "minimum": 0, "maximum": 32767 },
- "mfa_max_enrolled_factors": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
- "sessions_timebox": { "type": "integer", "minimum": 0 },
- "sessions_inactivity_timeout": { "type": "integer", "minimum": 0 },
- "rate_limit_anonymous_users": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "rate_limit_email_sent": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "rate_limit_sms_sent": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "rate_limit_verify": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "rate_limit_token_refresh": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "rate_limit_otp": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
- "password_min_length": { "type": "integer", "minimum": 6, "maximum": 32767 },
- "security_refresh_token_reuse_interval": {
+ "site_url": { "type": "string", "pattern": "^[^,]+$", "nullable": true },
+ "disable_signup": { "type": "boolean", "nullable": true },
+ "jwt_exp": { "type": "integer", "minimum": 0, "maximum": 604800, "nullable": true },
+ "smtp_admin_email": { "type": "string", "format": "email", "nullable": true },
+ "smtp_host": { "type": "string", "nullable": true },
+ "smtp_port": { "type": "string", "nullable": true },
+ "smtp_user": { "type": "string", "nullable": true },
+ "smtp_pass": { "type": "string", "nullable": true },
+ "smtp_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 32767,
+ "nullable": true
},
- "mailer_otp_exp": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
- "mailer_otp_length": { "type": "integer", "minimum": 6, "maximum": 10 },
- "sms_max_frequency": { "type": "integer", "minimum": 0, "maximum": 32767 },
- "sms_otp_exp": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
- "sms_otp_length": { "type": "integer", "minimum": 0, "maximum": 32767 },
- "db_max_pool_size": { "type": "integer" },
- "api_max_request_duration": { "type": "integer" },
- "mfa_phone_max_frequency": { "type": "integer", "minimum": 0, "maximum": 32767 },
- "mfa_phone_otp_length": { "type": "integer", "minimum": 0, "maximum": 32767 },
- "site_url": { "type": "string", "pattern": "/^[^,]+$/" },
- "disable_signup": { "type": "boolean" },
- "smtp_admin_email": { "type": "string" },
- "smtp_host": { "type": "string" },
- "smtp_port": { "type": "string" },
- "smtp_user": { "type": "string" },
- "smtp_pass": { "type": "string" },
- "smtp_sender_name": { "type": "string" },
- "mailer_allow_unverified_email_sign_ins": { "type": "boolean" },
- "mailer_autoconfirm": { "type": "boolean" },
- "mailer_subjects_invite": { "type": "string" },
- "mailer_subjects_confirmation": { "type": "string" },
- "mailer_subjects_recovery": { "type": "string" },
- "mailer_subjects_email_change": { "type": "string" },
- "mailer_subjects_magic_link": { "type": "string" },
- "mailer_subjects_reauthentication": { "type": "string" },
- "mailer_templates_invite_content": { "type": "string" },
- "mailer_templates_confirmation_content": { "type": "string" },
- "mailer_templates_recovery_content": { "type": "string" },
- "mailer_templates_email_change_content": { "type": "string" },
- "mailer_templates_magic_link_content": { "type": "string" },
- "mailer_templates_reauthentication_content": { "type": "string" },
- "uri_allow_list": { "type": "string" },
- "external_anonymous_users_enabled": { "type": "boolean" },
- "external_email_enabled": { "type": "boolean" },
- "external_phone_enabled": { "type": "boolean" },
- "saml_enabled": { "type": "boolean" },
- "saml_external_url": { "type": "string", "pattern": "/^[^,]+$/" },
- "security_captcha_enabled": { "type": "boolean" },
- "security_captcha_provider": { "type": "string" },
- "security_captcha_secret": { "type": "string" },
- "sessions_single_per_user": { "type": "boolean" },
+ "smtp_sender_name": { "type": "string", "nullable": true },
+ "mailer_allow_unverified_email_sign_ins": { "type": "boolean", "nullable": true },
+ "mailer_autoconfirm": { "type": "boolean", "nullable": true },
+ "mailer_subjects_invite": { "type": "string", "nullable": true },
+ "mailer_subjects_confirmation": { "type": "string", "nullable": true },
+ "mailer_subjects_recovery": { "type": "string", "nullable": true },
+ "mailer_subjects_email_change": { "type": "string", "nullable": true },
+ "mailer_subjects_magic_link": { "type": "string", "nullable": true },
+ "mailer_subjects_reauthentication": { "type": "string", "nullable": true },
+ "mailer_templates_invite_content": { "type": "string", "nullable": true },
+ "mailer_templates_confirmation_content": { "type": "string", "nullable": true },
+ "mailer_templates_recovery_content": { "type": "string", "nullable": true },
+ "mailer_templates_email_change_content": { "type": "string", "nullable": true },
+ "mailer_templates_magic_link_content": { "type": "string", "nullable": true },
+ "mailer_templates_reauthentication_content": { "type": "string", "nullable": true },
+ "mfa_max_enrolled_factors": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "uri_allow_list": { "type": "string", "nullable": true },
+ "external_anonymous_users_enabled": { "type": "boolean", "nullable": true },
+ "external_email_enabled": { "type": "boolean", "nullable": true },
+ "external_phone_enabled": { "type": "boolean", "nullable": true },
+ "saml_enabled": { "type": "boolean", "nullable": true },
+ "saml_external_url": { "type": "string", "pattern": "^[^,]+$", "nullable": true },
+ "security_captcha_enabled": { "type": "boolean", "nullable": true },
+ "security_captcha_provider": {
+ "type": "string",
+ "enum": ["turnstile", "hcaptcha"],
+ "nullable": true
+ },
+ "security_captcha_secret": { "type": "string", "nullable": true },
+ "sessions_timebox": { "type": "integer", "minimum": 0, "nullable": true },
+ "sessions_inactivity_timeout": { "type": "integer", "minimum": 0, "nullable": true },
+ "sessions_single_per_user": { "type": "boolean", "nullable": true },
"sessions_tags": {
"type": "string",
- "pattern": "/^\\s*([a-z0-9_-]+(\\s*,+\\s*)?)*\\s*$/i"
+ "pattern": "^\\s*([a-zA-Z0-9_-]+(\\s*,+\\s*)?)*\\s*$",
+ "nullable": true
+ },
+ "rate_limit_anonymous_users": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_email_sent": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_sms_sent": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_verify": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_token_refresh": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_otp": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "mailer_secure_email_change_enabled": { "type": "boolean", "nullable": true },
+ "refresh_token_rotation_enabled": { "type": "boolean", "nullable": true },
+ "password_hibp_enabled": { "type": "boolean", "nullable": true },
+ "password_min_length": {
+ "type": "integer",
+ "minimum": 6,
+ "maximum": 32767,
+ "nullable": true
},
- "mailer_secure_email_change_enabled": { "type": "boolean" },
- "refresh_token_rotation_enabled": { "type": "boolean" },
- "password_hibp_enabled": { "type": "boolean" },
"password_required_characters": {
"type": "string",
"enum": [
@@ -4489,118 +5907,169 @@
"abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
"abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
""
- ]
+ ],
+ "nullable": true
},
- "security_manual_linking_enabled": { "type": "boolean" },
- "security_update_password_require_reauthentication": { "type": "boolean" },
- "sms_autoconfirm": { "type": "boolean" },
- "sms_provider": { "type": "string" },
- "sms_messagebird_access_key": { "type": "string" },
- "sms_messagebird_originator": { "type": "string" },
- "sms_test_otp": { "type": "string", "pattern": "/^([0-9]{1,15}=[0-9]+,?)*$/" },
- "sms_test_otp_valid_until": { "type": "string" },
- "sms_textlocal_api_key": { "type": "string" },
- "sms_textlocal_sender": { "type": "string" },
- "sms_twilio_account_sid": { "type": "string" },
- "sms_twilio_auth_token": { "type": "string" },
- "sms_twilio_content_sid": { "type": "string" },
- "sms_twilio_message_service_sid": { "type": "string" },
- "sms_twilio_verify_account_sid": { "type": "string" },
- "sms_twilio_verify_auth_token": { "type": "string" },
- "sms_twilio_verify_message_service_sid": { "type": "string" },
- "sms_vonage_api_key": { "type": "string" },
- "sms_vonage_api_secret": { "type": "string" },
- "sms_vonage_from": { "type": "string" },
- "sms_template": { "type": "string" },
- "hook_mfa_verification_attempt_enabled": { "type": "boolean" },
- "hook_mfa_verification_attempt_uri": { "type": "string" },
- "hook_mfa_verification_attempt_secrets": { "type": "string" },
- "hook_password_verification_attempt_enabled": { "type": "boolean" },
- "hook_password_verification_attempt_uri": { "type": "string" },
- "hook_password_verification_attempt_secrets": { "type": "string" },
- "hook_custom_access_token_enabled": { "type": "boolean" },
- "hook_custom_access_token_uri": { "type": "string" },
- "hook_custom_access_token_secrets": { "type": "string" },
- "hook_send_sms_enabled": { "type": "boolean" },
- "hook_send_sms_uri": { "type": "string" },
- "hook_send_sms_secrets": { "type": "string" },
- "hook_send_email_enabled": { "type": "boolean" },
- "hook_send_email_uri": { "type": "string" },
- "hook_send_email_secrets": { "type": "string" },
- "external_apple_enabled": { "type": "boolean" },
- "external_apple_client_id": { "type": "string" },
- "external_apple_secret": { "type": "string" },
- "external_apple_additional_client_ids": { "type": "string" },
- "external_azure_enabled": { "type": "boolean" },
- "external_azure_client_id": { "type": "string" },
- "external_azure_secret": { "type": "string" },
- "external_azure_url": { "type": "string" },
- "external_bitbucket_enabled": { "type": "boolean" },
- "external_bitbucket_client_id": { "type": "string" },
- "external_bitbucket_secret": { "type": "string" },
- "external_discord_enabled": { "type": "boolean" },
- "external_discord_client_id": { "type": "string" },
- "external_discord_secret": { "type": "string" },
- "external_facebook_enabled": { "type": "boolean" },
- "external_facebook_client_id": { "type": "string" },
- "external_facebook_secret": { "type": "string" },
- "external_figma_enabled": { "type": "boolean" },
- "external_figma_client_id": { "type": "string" },
- "external_figma_secret": { "type": "string" },
- "external_github_enabled": { "type": "boolean" },
- "external_github_client_id": { "type": "string" },
- "external_github_secret": { "type": "string" },
- "external_gitlab_enabled": { "type": "boolean" },
- "external_gitlab_client_id": { "type": "string" },
- "external_gitlab_secret": { "type": "string" },
- "external_gitlab_url": { "type": "string" },
- "external_google_enabled": { "type": "boolean" },
- "external_google_client_id": { "type": "string" },
- "external_google_secret": { "type": "string" },
- "external_google_additional_client_ids": { "type": "string" },
- "external_google_skip_nonce_check": { "type": "boolean" },
- "external_kakao_enabled": { "type": "boolean" },
- "external_kakao_client_id": { "type": "string" },
- "external_kakao_secret": { "type": "string" },
- "external_keycloak_enabled": { "type": "boolean" },
- "external_keycloak_client_id": { "type": "string" },
- "external_keycloak_secret": { "type": "string" },
- "external_keycloak_url": { "type": "string" },
- "external_linkedin_oidc_enabled": { "type": "boolean" },
- "external_linkedin_oidc_client_id": { "type": "string" },
- "external_linkedin_oidc_secret": { "type": "string" },
- "external_slack_oidc_enabled": { "type": "boolean" },
- "external_slack_oidc_client_id": { "type": "string" },
- "external_slack_oidc_secret": { "type": "string" },
- "external_notion_enabled": { "type": "boolean" },
- "external_notion_client_id": { "type": "string" },
- "external_notion_secret": { "type": "string" },
- "external_slack_enabled": { "type": "boolean" },
- "external_slack_client_id": { "type": "string" },
- "external_slack_secret": { "type": "string" },
- "external_spotify_enabled": { "type": "boolean" },
- "external_spotify_client_id": { "type": "string" },
- "external_spotify_secret": { "type": "string" },
- "external_twitch_enabled": { "type": "boolean" },
- "external_twitch_client_id": { "type": "string" },
- "external_twitch_secret": { "type": "string" },
- "external_twitter_enabled": { "type": "boolean" },
- "external_twitter_client_id": { "type": "string" },
- "external_twitter_secret": { "type": "string" },
- "external_workos_enabled": { "type": "boolean" },
- "external_workos_client_id": { "type": "string" },
- "external_workos_secret": { "type": "string" },
- "external_workos_url": { "type": "string" },
- "external_zoom_enabled": { "type": "boolean" },
- "external_zoom_client_id": { "type": "string" },
- "external_zoom_secret": { "type": "string" },
- "mfa_totp_enroll_enabled": { "type": "boolean" },
- "mfa_totp_verify_enabled": { "type": "boolean" },
- "mfa_web_authn_enroll_enabled": { "type": "boolean" },
- "mfa_web_authn_verify_enabled": { "type": "boolean" },
- "mfa_phone_enroll_enabled": { "type": "boolean" },
- "mfa_phone_verify_enabled": { "type": "boolean" },
- "mfa_phone_template": { "type": "string" }
+ "security_manual_linking_enabled": { "type": "boolean", "nullable": true },
+ "security_update_password_require_reauthentication": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "security_refresh_token_reuse_interval": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "mailer_otp_exp": { "type": "integer", "minimum": 0, "maximum": 2147483647 },
+ "mailer_otp_length": { "type": "integer", "minimum": 6, "maximum": 10, "nullable": true },
+ "sms_autoconfirm": { "type": "boolean", "nullable": true },
+ "sms_max_frequency": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 32767,
+ "nullable": true
+ },
+ "sms_otp_exp": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "sms_otp_length": { "type": "integer", "minimum": 0, "maximum": 32767 },
+ "sms_provider": {
+ "type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
+ "nullable": true
+ },
+ "sms_messagebird_access_key": { "type": "string", "nullable": true },
+ "sms_messagebird_originator": { "type": "string", "nullable": true },
+ "sms_test_otp": {
+ "type": "string",
+ "pattern": "^([0-9]{1,15}=[0-9]+,?)*$",
+ "nullable": true
+ },
+ "sms_test_otp_valid_until": { "type": "string", "format": "date-time", "nullable": true },
+ "sms_textlocal_api_key": { "type": "string", "nullable": true },
+ "sms_textlocal_sender": { "type": "string", "nullable": true },
+ "sms_twilio_account_sid": { "type": "string", "nullable": true },
+ "sms_twilio_auth_token": { "type": "string", "nullable": true },
+ "sms_twilio_content_sid": { "type": "string", "nullable": true },
+ "sms_twilio_message_service_sid": { "type": "string", "nullable": true },
+ "sms_twilio_verify_account_sid": { "type": "string", "nullable": true },
+ "sms_twilio_verify_auth_token": { "type": "string", "nullable": true },
+ "sms_twilio_verify_message_service_sid": { "type": "string", "nullable": true },
+ "sms_vonage_api_key": { "type": "string", "nullable": true },
+ "sms_vonage_api_secret": { "type": "string", "nullable": true },
+ "sms_vonage_from": { "type": "string", "nullable": true },
+ "sms_template": { "type": "string", "nullable": true },
+ "hook_mfa_verification_attempt_enabled": { "type": "boolean", "nullable": true },
+ "hook_mfa_verification_attempt_uri": { "type": "string", "nullable": true },
+ "hook_mfa_verification_attempt_secrets": { "type": "string", "nullable": true },
+ "hook_password_verification_attempt_enabled": { "type": "boolean", "nullable": true },
+ "hook_password_verification_attempt_uri": { "type": "string", "nullable": true },
+ "hook_password_verification_attempt_secrets": { "type": "string", "nullable": true },
+ "hook_custom_access_token_enabled": { "type": "boolean", "nullable": true },
+ "hook_custom_access_token_uri": { "type": "string", "nullable": true },
+ "hook_custom_access_token_secrets": { "type": "string", "nullable": true },
+ "hook_send_sms_enabled": { "type": "boolean", "nullable": true },
+ "hook_send_sms_uri": { "type": "string", "nullable": true },
+ "hook_send_sms_secrets": { "type": "string", "nullable": true },
+ "hook_send_email_enabled": { "type": "boolean", "nullable": true },
+ "hook_send_email_uri": { "type": "string", "nullable": true },
+ "hook_send_email_secrets": { "type": "string", "nullable": true },
+ "hook_before_user_created_enabled": { "type": "boolean", "nullable": true },
+ "hook_before_user_created_uri": { "type": "string", "nullable": true },
+ "hook_before_user_created_secrets": { "type": "string", "nullable": true },
+ "external_apple_enabled": { "type": "boolean", "nullable": true },
+ "external_apple_client_id": { "type": "string", "nullable": true },
+ "external_apple_secret": { "type": "string", "nullable": true },
+ "external_apple_additional_client_ids": { "type": "string", "nullable": true },
+ "external_azure_enabled": { "type": "boolean", "nullable": true },
+ "external_azure_client_id": { "type": "string", "nullable": true },
+ "external_azure_secret": { "type": "string", "nullable": true },
+ "external_azure_url": { "type": "string", "nullable": true },
+ "external_bitbucket_enabled": { "type": "boolean", "nullable": true },
+ "external_bitbucket_client_id": { "type": "string", "nullable": true },
+ "external_bitbucket_secret": { "type": "string", "nullable": true },
+ "external_discord_enabled": { "type": "boolean", "nullable": true },
+ "external_discord_client_id": { "type": "string", "nullable": true },
+ "external_discord_secret": { "type": "string", "nullable": true },
+ "external_facebook_enabled": { "type": "boolean", "nullable": true },
+ "external_facebook_client_id": { "type": "string", "nullable": true },
+ "external_facebook_secret": { "type": "string", "nullable": true },
+ "external_figma_enabled": { "type": "boolean", "nullable": true },
+ "external_figma_client_id": { "type": "string", "nullable": true },
+ "external_figma_secret": { "type": "string", "nullable": true },
+ "external_github_enabled": { "type": "boolean", "nullable": true },
+ "external_github_client_id": { "type": "string", "nullable": true },
+ "external_github_secret": { "type": "string", "nullable": true },
+ "external_gitlab_enabled": { "type": "boolean", "nullable": true },
+ "external_gitlab_client_id": { "type": "string", "nullable": true },
+ "external_gitlab_secret": { "type": "string", "nullable": true },
+ "external_gitlab_url": { "type": "string", "nullable": true },
+ "external_google_enabled": { "type": "boolean", "nullable": true },
+ "external_google_client_id": { "type": "string", "nullable": true },
+ "external_google_secret": { "type": "string", "nullable": true },
+ "external_google_additional_client_ids": { "type": "string", "nullable": true },
+ "external_google_skip_nonce_check": { "type": "boolean", "nullable": true },
+ "external_kakao_enabled": { "type": "boolean", "nullable": true },
+ "external_kakao_client_id": { "type": "string", "nullable": true },
+ "external_kakao_secret": { "type": "string", "nullable": true },
+ "external_keycloak_enabled": { "type": "boolean", "nullable": true },
+ "external_keycloak_client_id": { "type": "string", "nullable": true },
+ "external_keycloak_secret": { "type": "string", "nullable": true },
+ "external_keycloak_url": { "type": "string", "nullable": true },
+ "external_linkedin_oidc_enabled": { "type": "boolean", "nullable": true },
+ "external_linkedin_oidc_client_id": { "type": "string", "nullable": true },
+ "external_linkedin_oidc_secret": { "type": "string", "nullable": true },
+ "external_slack_oidc_enabled": { "type": "boolean", "nullable": true },
+ "external_slack_oidc_client_id": { "type": "string", "nullable": true },
+ "external_slack_oidc_secret": { "type": "string", "nullable": true },
+ "external_notion_enabled": { "type": "boolean", "nullable": true },
+ "external_notion_client_id": { "type": "string", "nullable": true },
+ "external_notion_secret": { "type": "string", "nullable": true },
+ "external_slack_enabled": { "type": "boolean", "nullable": true },
+ "external_slack_client_id": { "type": "string", "nullable": true },
+ "external_slack_secret": { "type": "string", "nullable": true },
+ "external_spotify_enabled": { "type": "boolean", "nullable": true },
+ "external_spotify_client_id": { "type": "string", "nullable": true },
+ "external_spotify_secret": { "type": "string", "nullable": true },
+ "external_twitch_enabled": { "type": "boolean", "nullable": true },
+ "external_twitch_client_id": { "type": "string", "nullable": true },
+ "external_twitch_secret": { "type": "string", "nullable": true },
+ "external_twitter_enabled": { "type": "boolean", "nullable": true },
+ "external_twitter_client_id": { "type": "string", "nullable": true },
+ "external_twitter_secret": { "type": "string", "nullable": true },
+ "external_workos_enabled": { "type": "boolean", "nullable": true },
+ "external_workos_client_id": { "type": "string", "nullable": true },
+ "external_workos_secret": { "type": "string", "nullable": true },
+ "external_workos_url": { "type": "string", "nullable": true },
+ "external_web3_solana_enabled": { "type": "boolean", "nullable": true },
+ "external_zoom_enabled": { "type": "boolean", "nullable": true },
+ "external_zoom_client_id": { "type": "string", "nullable": true },
+ "external_zoom_secret": { "type": "string", "nullable": true },
+ "db_max_pool_size": { "type": "integer", "nullable": true },
+ "api_max_request_duration": { "type": "integer", "nullable": true },
+ "mfa_totp_enroll_enabled": { "type": "boolean", "nullable": true },
+ "mfa_totp_verify_enabled": { "type": "boolean", "nullable": true },
+ "mfa_web_authn_enroll_enabled": { "type": "boolean", "nullable": true },
+ "mfa_web_authn_verify_enabled": { "type": "boolean", "nullable": true },
+ "mfa_phone_enroll_enabled": { "type": "boolean", "nullable": true },
+ "mfa_phone_verify_enabled": { "type": "boolean", "nullable": true },
+ "mfa_phone_max_frequency": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 32767,
+ "nullable": true
+ },
+ "mfa_phone_otp_length": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 32767,
+ "nullable": true
+ },
+ "mfa_phone_template": { "type": "string", "nullable": true }
}
},
"CreateThirdPartyAuthBody": {
@@ -4608,52 +6077,49 @@
"properties": {
"oidc_issuer_url": { "type": "string" },
"jwks_url": { "type": "string" },
- "custom_jwks": { "type": "object" }
+ "custom_jwks": {}
}
},
"ThirdPartyAuth": {
"type": "object",
"properties": {
- "id": { "type": "string" },
+ "id": { "type": "string", "format": "uuid" },
"type": { "type": "string" },
"oidc_issuer_url": { "type": "string", "nullable": true },
"jwks_url": { "type": "string", "nullable": true },
- "custom_jwks": { "type": "object", "nullable": true },
- "resolved_jwks": { "type": "object", "nullable": true },
+ "custom_jwks": { "nullable": true },
+ "resolved_jwks": { "nullable": true },
"inserted_at": { "type": "string" },
"updated_at": { "type": "string" },
"resolved_at": { "type": "string", "nullable": true }
},
"required": ["id", "type", "inserted_at", "updated_at"]
},
- "ProjectAvailableRestoreVersion": {
- "type": "object",
- "properties": {
- "version": { "type": "string" },
- "release_channel": {
- "type": "string",
- "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
- },
- "postgres_engine": { "type": "string", "enum": ["13", "14", "15", "17", "17-oriole"] }
- },
- "required": ["version", "release_channel", "postgres_engine"]
- },
"GetProjectAvailableRestoreVersionsResponse": {
"type": "object",
"properties": {
"available_versions": {
"type": "array",
- "items": { "$ref": "#/components/schemas/ProjectAvailableRestoreVersion" }
+ "items": {
+ "type": "object",
+ "properties": {
+ "version": { "type": "string" },
+ "release_channel": {
+ "type": "string",
+ "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
+ },
+ "postgres_engine": {
+ "type": "string",
+ "enum": ["13", "14", "15", "17", "17-oriole"]
+ }
+ },
+ "required": ["version", "release_channel", "postgres_engine"]
+ }
}
},
"required": ["available_versions"]
},
- "RestoreProjectBodyDto": {
- "type": "object",
- "properties": {},
- "hideDefinitions": ["release_channel", "postgres_engine"]
- },
- "ListProjectAddonsResponseDto": {
+ "ListProjectAddonsResponse": {
"type": "object",
"properties": {
"selected_addons": {
@@ -4690,7 +6156,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{ "type": "string", "enum": ["cd_default"] },
@@ -4712,17 +6186,7 @@
},
"required": ["description", "type", "interval", "amount"]
},
- "meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- { "type": "number" },
- { "type": "boolean" },
- { "type": "string" },
- { "type": "array", "items": { "type": "string" } }
- ]
- }
- }
+ "meta": { "description": "Any JSON-serializable value" }
},
"required": ["id", "name", "price"]
}
@@ -4767,7 +6231,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{ "type": "string", "enum": ["cd_default"] },
@@ -4789,17 +6261,7 @@
},
"required": ["description", "type", "interval", "amount"]
},
- "meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- { "type": "number" },
- { "type": "boolean" },
- { "type": "string" },
- { "type": "array", "items": { "type": "string" } }
- ]
- }
- }
+ "meta": { "description": "Any JSON-serializable value" }
},
"required": ["id", "name", "price"]
}
@@ -4811,7 +6273,7 @@
},
"required": ["selected_addons", "available_addons"]
},
- "ApplyProjectAddonBodyDto": {
+ "ApplyProjectAddonBody": {
"type": "object",
"properties": {
"addon_variant": {
@@ -4828,7 +6290,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{ "type": "string", "enum": ["cd_default"] },
@@ -4851,34 +6321,142 @@
},
"required": ["addon_variant", "addon_type"]
},
- "V1AnalyticsResponse": {
+ "ProjectClaimTokenResponse": {
"type": "object",
"properties": {
+ "token_alias": { "type": "string" },
+ "expires_at": { "type": "string" },
+ "created_at": { "type": "string" },
+ "created_by": { "type": "string", "format": "uuid" }
+ },
+ "required": ["token_alias", "expires_at", "created_at", "created_by"]
+ },
+ "CreateProjectClaimTokenResponse": {
+ "type": "object",
+ "properties": {
+ "token": { "type": "string" },
+ "token_alias": { "type": "string" },
+ "expires_at": { "type": "string" },
+ "created_at": { "type": "string" },
+ "created_by": { "type": "string", "format": "uuid" }
+ },
+ "required": ["token", "token_alias", "expires_at", "created_at", "created_by"]
+ },
+ "V1ProjectAdvisorsResponse": {
+ "type": "object",
+ "properties": {
+ "lints": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "enum": [
+ "unindexed_foreign_keys",
+ "auth_users_exposed",
+ "auth_rls_initplan",
+ "no_primary_key",
+ "unused_index",
+ "multiple_permissive_policies",
+ "policy_exists_rls_disabled",
+ "rls_enabled_no_policy",
+ "duplicate_index",
+ "security_definer_view",
+ "function_search_path_mutable",
+ "rls_disabled_in_public",
+ "extension_in_public",
+ "rls_references_user_metadata",
+ "materialized_view_in_api",
+ "foreign_table_in_api",
+ "unsupported_reg_types",
+ "auth_otp_long_expiry",
+ "auth_otp_short_length",
+ "ssl_not_enforced",
+ "network_restrictions_not_set",
+ "password_requirements_min_length",
+ "pitr_not_enabled",
+ "auth_leaked_password_protection",
+ "auth_insufficient_mfa_options",
+ "auth_password_policy_missing",
+ "leaked_service_key",
+ "no_backup_admin"
+ ]
+ },
+ "title": { "type": "string" },
+ "level": { "type": "string", "enum": ["ERROR", "WARN", "INFO"] },
+ "facing": { "type": "string", "enum": ["EXTERNAL"] },
+ "categories": {
+ "type": "array",
+ "items": { "type": "string", "enum": ["PERFORMANCE", "SECURITY"] }
+ },
+ "description": { "type": "string" },
+ "detail": { "type": "string" },
+ "remediation": { "type": "string" },
+ "metadata": {
+ "type": "object",
+ "properties": {
+ "schema": { "type": "string" },
+ "name": { "type": "string" },
+ "entity": { "type": "string" },
+ "type": {
+ "type": "string",
+ "enum": ["table", "view", "auth", "function", "extension", "compliance"]
+ },
+ "fkey_name": { "type": "string" },
+ "fkey_columns": { "type": "array", "items": { "type": "number" } }
+ }
+ },
+ "cache_key": { "type": "string" }
+ },
+ "required": [
+ "name",
+ "title",
+ "level",
+ "facing",
+ "categories",
+ "description",
+ "detail",
+ "remediation",
+ "cache_key"
+ ]
+ }
+ }
+ },
+ "required": ["lints"]
+ },
+ "AnalyticsResponse": {
+ "type": "object",
+ "properties": {
+ "result": { "type": "array", "items": {} },
"error": {
"oneOf": [
+ { "type": "string" },
{
+ "type": "object",
"properties": {
"code": { "type": "number" },
"errors": {
"type": "array",
"items": {
+ "type": "object",
"properties": {
"domain": { "type": "string" },
"location": { "type": "string" },
"locationType": { "type": "string" },
"message": { "type": "string" },
"reason": { "type": "string" }
- }
+ },
+ "required": ["domain", "location", "locationType", "message", "reason"]
}
},
"message": { "type": "string" },
"status": { "type": "string" }
- }
- },
- { "type": "string" }
+ },
+ "required": ["code", "errors", "message", "status"]
+ }
]
- },
- "result": { "type": "array", "items": { "type": "object" } }
+ }
}
},
"V1ListMigrationsResponse": {
@@ -4892,12 +6470,31 @@
"required": ["version"]
}
},
- "V1RunQueryBody": {
+ "V1CreateMigrationBody": {
"type": "object",
- "properties": { "query": { "type": "string", "minLength": 1 } },
+ "properties": {
+ "query": { "type": "string", "minLength": 1 },
+ "name": { "type": "string" }
+ },
"required": ["query"]
},
- "GetProjectDbMetadataResponseDto": {
+ "V1UpsertMigrationBody": {
+ "type": "object",
+ "properties": {
+ "query": { "type": "string", "minLength": 1 },
+ "name": { "type": "string" }
+ },
+ "required": ["query"]
+ },
+ "V1RunQueryBody": {
+ "type": "object",
+ "properties": {
+ "query": { "type": "string", "minLength": 1 },
+ "read_only": { "type": "boolean" }
+ },
+ "required": ["query"]
+ },
+ "GetProjectDbMetadataResponse": {
"type": "object",
"properties": {
"databases": {
@@ -4931,12 +6528,13 @@
"name": { "type": "string" },
"status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
"version": { "type": "integer" },
- "created_at": { "type": "integer" },
- "updated_at": { "type": "integer" },
+ "created_at": { "type": "integer", "format": "int64" },
+ "updated_at": { "type": "integer", "format": "int64" },
"verify_jwt": { "type": "boolean" },
"import_map": { "type": "boolean" },
"entrypoint_path": { "type": "string" },
- "import_map_path": { "type": "string" }
+ "import_map_path": { "type": "string" },
+ "ezbr_sha256": { "type": "string" }
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
},
@@ -4951,20 +6549,24 @@
"required": ["slug", "name", "body"]
},
"BulkUpdateFunctionBody": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "slug": { "type": "string", "pattern": "^[A-Za-z0-9_-]+$" },
- "name": { "type": "string" },
- "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
- "version": { "type": "integer" },
- "created_at": { "type": "integer" },
- "verify_jwt": { "type": "boolean" },
- "import_map": { "type": "boolean" },
- "entrypoint_path": { "type": "string" },
- "import_map_path": { "type": "string" }
- },
- "required": ["id", "slug", "name", "status", "version"]
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "slug": { "type": "string", "pattern": "^[A-Za-z0-9_-]+$" },
+ "name": { "type": "string" },
+ "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
+ "version": { "type": "integer" },
+ "created_at": { "type": "integer", "format": "int64" },
+ "verify_jwt": { "type": "boolean" },
+ "import_map": { "type": "boolean" },
+ "entrypoint_path": { "type": "string" },
+ "import_map_path": { "type": "string" },
+ "ezbr_sha256": { "type": "string" }
+ },
+ "required": ["id", "slug", "name", "status", "version"]
+ }
},
"BulkUpdateFunctionResponse": {
"type": "object",
@@ -4979,12 +6581,13 @@
"name": { "type": "string" },
"status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
"version": { "type": "integer" },
- "created_at": { "type": "integer" },
- "updated_at": { "type": "integer" },
+ "created_at": { "type": "integer", "format": "int64" },
+ "updated_at": { "type": "integer", "format": "int64" },
"verify_jwt": { "type": "boolean" },
"import_map": { "type": "boolean" },
"entrypoint_path": { "type": "string" },
- "import_map_path": { "type": "string" }
+ "import_map_path": { "type": "string" },
+ "ezbr_sha256": { "type": "string" }
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
}
@@ -5018,12 +6621,13 @@
"name": { "type": "string" },
"status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
"version": { "type": "integer" },
- "created_at": { "type": "integer" },
- "updated_at": { "type": "integer" },
+ "created_at": { "type": "integer", "format": "int64" },
+ "updated_at": { "type": "integer", "format": "int64" },
"verify_jwt": { "type": "boolean" },
"import_map": { "type": "boolean" },
"entrypoint_path": { "type": "string" },
- "import_map_path": { "type": "string" }
+ "import_map_path": { "type": "string" },
+ "ezbr_sha256": { "type": "string" }
},
"required": ["id", "slug", "name", "status", "version"]
},
@@ -5035,15 +6639,17 @@
"name": { "type": "string" },
"status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] },
"version": { "type": "integer" },
- "created_at": { "type": "integer" },
- "updated_at": { "type": "integer" },
+ "created_at": { "type": "integer", "format": "int64" },
+ "updated_at": { "type": "integer", "format": "int64" },
"verify_jwt": { "type": "boolean" },
"import_map": { "type": "boolean" },
"entrypoint_path": { "type": "string" },
- "import_map_path": { "type": "string" }
+ "import_map_path": { "type": "string" },
+ "ezbr_sha256": { "type": "string" }
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
},
+ "StreamableFile": { "type": "object", "properties": {} },
"V1UpdateFunctionBody": {
"type": "object",
"properties": {
@@ -5064,32 +6670,6 @@
},
"required": ["id", "name", "owner", "created_at", "updated_at", "public"]
},
- "AttributeValue": {
- "type": "object",
- "properties": {
- "default": {
- "oneOf": [
- { "type": "object" },
- { "type": "number" },
- { "type": "string" },
- { "type": "boolean" }
- ]
- },
- "name": { "type": "string" },
- "names": { "type": "array", "items": { "type": "string" } },
- "array": { "type": "boolean" }
- }
- },
- "AttributeMapping": {
- "type": "object",
- "properties": {
- "keys": {
- "type": "object",
- "additionalProperties": { "$ref": "#/components/schemas/AttributeValue" }
- }
- },
- "required": ["keys"]
- },
"CreateProviderBody": {
"type": "object",
"properties": {
@@ -5101,48 +6681,86 @@
"metadata_xml": { "type": "string" },
"metadata_url": { "type": "string" },
"domains": { "type": "array", "items": { "type": "string" } },
- "attribute_mapping": { "$ref": "#/components/schemas/AttributeMapping" }
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
},
"required": ["type"]
},
- "SamlDescriptor": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "entity_id": { "type": "string" },
- "metadata_url": { "type": "string" },
- "metadata_xml": { "type": "string" },
- "attribute_mapping": { "$ref": "#/components/schemas/AttributeMapping" }
- },
- "required": ["id", "entity_id"]
- },
- "Domain": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "domain": { "type": "string" },
- "created_at": { "type": "string" },
- "updated_at": { "type": "string" }
- },
- "required": ["id"]
- },
"CreateProviderResponse": {
"type": "object",
"properties": {
"id": { "type": "string" },
- "saml": { "$ref": "#/components/schemas/SamlDescriptor" },
- "domains": { "type": "array", "items": { "$ref": "#/components/schemas/Domain" } },
- "created_at": { "type": "string" },
- "updated_at": { "type": "string" }
- },
- "required": ["id"]
- },
- "Provider": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "saml": { "$ref": "#/components/schemas/SamlDescriptor" },
- "domains": { "type": "array", "items": { "$ref": "#/components/schemas/Domain" } },
+ "saml": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "entity_id": { "type": "string" },
+ "metadata_url": { "type": "string" },
+ "metadata_xml": { "type": "string" },
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
+ },
+ "required": ["id", "entity_id"]
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "domain": { "type": "string" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ },
"created_at": { "type": "string" },
"updated_at": { "type": "string" }
},
@@ -5151,7 +6769,66 @@
"ListProvidersResponse": {
"type": "object",
"properties": {
- "items": { "type": "array", "items": { "$ref": "#/components/schemas/Provider" } }
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "saml": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "entity_id": { "type": "string" },
+ "metadata_url": { "type": "string" },
+ "metadata_xml": { "type": "string" },
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
+ },
+ "required": ["id", "entity_id"]
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "domain": { "type": "string" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ }
},
"required": ["items"]
},
@@ -5159,8 +6836,54 @@
"type": "object",
"properties": {
"id": { "type": "string" },
- "saml": { "$ref": "#/components/schemas/SamlDescriptor" },
- "domains": { "type": "array", "items": { "$ref": "#/components/schemas/Domain" } },
+ "saml": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "entity_id": { "type": "string" },
+ "metadata_url": { "type": "string" },
+ "metadata_xml": { "type": "string" },
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
+ },
+ "required": ["id", "entity_id"]
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "domain": { "type": "string" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ },
"created_at": { "type": "string" },
"updated_at": { "type": "string" }
},
@@ -5172,15 +6895,85 @@
"metadata_xml": { "type": "string" },
"metadata_url": { "type": "string" },
"domains": { "type": "array", "items": { "type": "string" } },
- "attribute_mapping": { "$ref": "#/components/schemas/AttributeMapping" }
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
}
},
"UpdateProviderResponse": {
"type": "object",
"properties": {
"id": { "type": "string" },
- "saml": { "$ref": "#/components/schemas/SamlDescriptor" },
- "domains": { "type": "array", "items": { "$ref": "#/components/schemas/Domain" } },
+ "saml": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "entity_id": { "type": "string" },
+ "metadata_url": { "type": "string" },
+ "metadata_xml": { "type": "string" },
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
+ },
+ "required": ["id", "entity_id"]
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "domain": { "type": "string" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ },
"created_at": { "type": "string" },
"updated_at": { "type": "string" }
},
@@ -5190,40 +6983,87 @@
"type": "object",
"properties": {
"id": { "type": "string" },
- "saml": { "$ref": "#/components/schemas/SamlDescriptor" },
- "domains": { "type": "array", "items": { "$ref": "#/components/schemas/Domain" } },
+ "saml": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "entity_id": { "type": "string" },
+ "metadata_url": { "type": "string" },
+ "metadata_xml": { "type": "string" },
+ "attribute_mapping": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "names": { "type": "array", "items": { "type": "string" } },
+ "default": {
+ "oneOf": [
+ { "type": "object", "properties": {} },
+ { "type": "number" },
+ { "type": "string" },
+ { "type": "boolean" }
+ ]
+ },
+ "array": { "type": "boolean" }
+ }
+ }
+ }
+ },
+ "required": ["keys"]
+ }
+ },
+ "required": ["id", "entity_id"]
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "domain": { "type": "string" },
+ "created_at": { "type": "string" },
+ "updated_at": { "type": "string" }
+ },
+ "required": ["id"]
+ }
+ },
"created_at": { "type": "string" },
"updated_at": { "type": "string" }
},
"required": ["id"]
},
- "V1Backup": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string",
- "enum": ["COMPLETED", "FAILED", "PENDING", "REMOVED", "ARCHIVED", "CANCELLED"]
- },
- "is_physical_backup": { "type": "boolean" },
- "inserted_at": { "type": "string" }
- },
- "required": ["status", "is_physical_backup", "inserted_at"]
- },
- "V1PhysicalBackup": {
- "type": "object",
- "properties": {
- "earliest_physical_backup_date_unix": { "type": "integer", "format": "int64" },
- "latest_physical_backup_date_unix": { "type": "integer", "format": "int64" }
- }
- },
"V1BackupsResponse": {
"type": "object",
"properties": {
"region": { "type": "string" },
"walg_enabled": { "type": "boolean" },
"pitr_enabled": { "type": "boolean" },
- "backups": { "type": "array", "items": { "$ref": "#/components/schemas/V1Backup" } },
- "physical_backup_data": { "$ref": "#/components/schemas/V1PhysicalBackup" }
+ "backups": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "is_physical_backup": { "type": "boolean" },
+ "status": {
+ "type": "string",
+ "enum": ["COMPLETED", "FAILED", "PENDING", "REMOVED", "ARCHIVED", "CANCELLED"]
+ },
+ "inserted_at": { "type": "string" }
+ },
+ "required": ["is_physical_backup", "status", "inserted_at"]
+ }
+ },
+ "physical_backup_data": {
+ "type": "object",
+ "properties": {
+ "earliest_physical_backup_date_unix": { "type": "integer" },
+ "latest_physical_backup_date_unix": { "type": "integer" }
+ }
+ }
},
"required": ["region", "walg_enabled", "pitr_enabled", "backups", "physical_backup_data"]
},
@@ -5234,6 +7074,24 @@
},
"required": ["recovery_time_target_unix"]
},
+ "V1RestorePointPostBody": {
+ "type": "object",
+ "properties": { "name": { "type": "string", "maxLength": 20 } },
+ "required": ["name"]
+ },
+ "V1RestorePointResponse": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "status": { "type": "string", "enum": ["AVAILABLE", "PENDING", "REMOVED"] }
+ },
+ "required": ["name", "status"]
+ },
+ "V1UndoBody": {
+ "type": "object",
+ "properties": { "name": { "type": "string", "maxLength": 20 } },
+ "required": ["name"]
+ },
"V1OrganizationMemberResponse": {
"type": "object",
"properties": {
@@ -5245,27 +7103,106 @@
},
"required": ["user_id", "user_name", "role_name", "mfa_enabled"]
},
- "BillingPlanId": { "type": "string", "enum": ["free", "pro", "team", "enterprise"] },
- "ReleaseChannel": {
- "type": "string",
- "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
- },
"V1OrganizationSlugResponse": {
"type": "object",
"properties": {
- "plan": { "$ref": "#/components/schemas/BillingPlanId" },
+ "id": { "type": "string" },
+ "name": { "type": "string" },
+ "plan": { "type": "string", "enum": ["free", "pro", "team", "enterprise"] },
"opt_in_tags": {
"type": "array",
- "items": { "type": "string", "enum": ["AI_SQL_GENERATOR_OPT_IN"] }
+ "items": {
+ "type": "string",
+ "enum": [
+ "AI_SQL_GENERATOR_OPT_IN",
+ "AI_DATA_GENERATOR_OPT_IN",
+ "AI_LOG_GENERATOR_OPT_IN"
+ ]
+ }
},
"allowed_release_channels": {
"type": "array",
- "items": { "$ref": "#/components/schemas/ReleaseChannel" }
- },
- "id": { "type": "string" },
- "name": { "type": "string" }
+ "items": {
+ "type": "string",
+ "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
+ }
+ }
},
- "required": ["opt_in_tags", "allowed_release_channels", "id", "name"]
+ "required": ["id", "name", "opt_in_tags", "allowed_release_channels"]
+ },
+ "OrganizationProjectClaimResponse": {
+ "type": "object",
+ "properties": {
+ "project": {
+ "type": "object",
+ "properties": { "ref": { "type": "string" }, "name": { "type": "string" } },
+ "required": ["ref", "name"]
+ },
+ "preview": {
+ "type": "object",
+ "properties": {
+ "valid": { "type": "boolean" },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "key": { "type": "string" }, "message": { "type": "string" } },
+ "required": ["key", "message"]
+ }
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "key": { "type": "string" }, "message": { "type": "string" } },
+ "required": ["key", "message"]
+ }
+ },
+ "info": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "key": { "type": "string" }, "message": { "type": "string" } },
+ "required": ["key", "message"]
+ }
+ },
+ "members_exceeding_free_project_limit": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "limit": { "type": "number" } },
+ "required": ["name", "limit"]
+ }
+ },
+ "target_organization_eligible": { "type": "boolean", "nullable": true },
+ "target_organization_has_free_project_slots": { "type": "boolean", "nullable": true },
+ "source_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"]
+ },
+ "target_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"],
+ "nullable": true
+ }
+ },
+ "required": [
+ "valid",
+ "warnings",
+ "errors",
+ "info",
+ "members_exceeding_free_project_limit",
+ "target_organization_eligible",
+ "target_organization_has_free_project_slots",
+ "source_subscription_plan",
+ "target_subscription_plan"
+ ]
+ },
+ "expires_at": { "type": "string" },
+ "created_at": { "type": "string" },
+ "created_by": { "type": "string", "format": "uuid" }
+ },
+ "required": ["project", "preview", "expires_at", "created_at", "created_by"]
}
}
}
diff --git a/apps/docs/spec/common-api-sections.json b/apps/docs/spec/common-api-sections.json
index c2549bc3b09..733b6ffb814 100644
--- a/apps/docs/spec/common-api-sections.json
+++ b/apps/docs/spec/common-api-sections.json
@@ -6,6 +6,48 @@
"type": "markdown",
"items": []
},
+ {
+ "type": "category",
+ "title": "Advisors",
+ "items": [
+ {
+ "id": "v1-get-performance-advisors",
+ "title": "Get performance advisors",
+ "slug": "v1-get-performance-advisors",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-security-advisors",
+ "title": "Get security advisors",
+ "slug": "v1-get-security-advisors",
+ "type": "operation"
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "title": "Analytics",
+ "items": [
+ {
+ "id": "v1-get-project-logs",
+ "title": "Get project logs",
+ "slug": "v1-get-project-logs",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-project-usage-api-count",
+ "title": "Get project usage api count",
+ "slug": "v1-get-project-usage-api-count",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-project-usage-request-count",
+ "title": "Get project usage request count",
+ "slug": "v1-get-project-usage-request-count",
+ "type": "operation"
+ }
+ ]
+ },
{
"type": "category",
"title": "Auth",
@@ -16,12 +58,36 @@
"slug": "v1-create-a-sso-provider",
"type": "operation"
},
+ {
+ "id": "v1-create-legacy-signing-key",
+ "title": "Create legacy signing key",
+ "slug": "v1-create-legacy-signing-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-create-project-signing-key",
+ "title": "Create project signing key",
+ "slug": "v1-create-project-signing-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-create-project-tpa-integration",
+ "title": "Create project tpa integration",
+ "slug": "v1-create-project-tpa-integration",
+ "type": "operation"
+ },
{
"id": "v1-delete-a-sso-provider",
"title": "Delete a sso provider",
"slug": "v1-delete-a-sso-provider",
"type": "operation"
},
+ {
+ "id": "v1-delete-project-tpa-integration",
+ "title": "Delete project tpa integration",
+ "slug": "v1-delete-project-tpa-integration",
+ "type": "operation"
+ },
{
"id": "v1-get-a-sso-provider",
"title": "Get a sso provider",
@@ -34,12 +100,48 @@
"slug": "v1-get-auth-service-config",
"type": "operation"
},
+ {
+ "id": "v1-get-legacy-signing-key",
+ "title": "Get legacy signing key",
+ "slug": "v1-get-legacy-signing-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-project-signing-key",
+ "title": "Get project signing key",
+ "slug": "v1-get-project-signing-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-project-signing-keys",
+ "title": "Get project signing keys",
+ "slug": "v1-get-project-signing-keys",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-project-tpa-integration",
+ "title": "Get project tpa integration",
+ "slug": "v1-get-project-tpa-integration",
+ "type": "operation"
+ },
{
"id": "v1-list-all-sso-provider",
"title": "List all sso provider",
"slug": "v1-list-all-sso-provider",
"type": "operation"
},
+ {
+ "id": "v1-list-project-tpa-integrations",
+ "title": "List project tpa integrations",
+ "slug": "v1-list-project-tpa-integrations",
+ "type": "operation"
+ },
+ {
+ "id": "v1-remove-project-signing-key",
+ "title": "Remove project signing key",
+ "slug": "v1-remove-project-signing-key",
+ "type": "operation"
+ },
{
"id": "v1-update-a-sso-provider",
"title": "Update a sso provider",
@@ -51,6 +153,36 @@
"title": "Update auth service config",
"slug": "v1-update-auth-service-config",
"type": "operation"
+ },
+ {
+ "id": "v1-update-project-signing-key",
+ "title": "Update project signing key",
+ "slug": "v1-update-project-signing-key",
+ "type": "operation"
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "title": "Billing",
+ "items": [
+ {
+ "id": "v1-apply-project-addon",
+ "title": "Apply project addon",
+ "slug": "v1-apply-project-addon",
+ "type": "operation"
+ },
+ {
+ "id": "v1-list-project-addons",
+ "title": "List project addons",
+ "slug": "v1-list-project-addons",
+ "type": "operation"
+ },
+ {
+ "id": "v1-remove-project-addon",
+ "title": "Remove project addon",
+ "slug": "v1-remove-project-addon",
+ "type": "operation"
}
]
},
@@ -64,6 +196,12 @@
"slug": "v1-apply-a-migration",
"type": "operation"
},
+ {
+ "id": "v1-create-restore-point",
+ "title": "Create restore point",
+ "slug": "v1-create-restore-point",
+ "type": "operation"
+ },
{
"id": "v1-disable-readonly-mode-temporarily",
"title": "Disable readonly mode temporarily",
@@ -88,6 +226,18 @@
"slug": "v1-get-a-snippet",
"type": "operation"
},
+ {
+ "id": "v1-get-database-metadata",
+ "title": "Get database metadata",
+ "slug": "v1-get-database-metadata",
+ "type": "operation"
+ },
+ {
+ "id": "v1-get-pooler-config",
+ "title": "Get pooler config",
+ "slug": "v1-get-pooler-config",
+ "type": "operation"
+ },
{
"id": "v1-get-postgres-config",
"title": "Get postgres config",
@@ -106,6 +256,12 @@
"slug": "v1-get-readonly-mode-status",
"type": "operation"
},
+ {
+ "id": "v1-get-restore-point",
+ "title": "Get restore point",
+ "slug": "v1-get-restore-point",
+ "type": "operation"
+ },
{
"id": "v1-get-ssl-enforcement-config",
"title": "Get ssl enforcement config",
@@ -125,9 +281,9 @@
"type": "operation"
},
{
- "id": "v1-list-migrations",
- "title": "List migrations",
- "slug": "v1-list-migrations",
+ "id": "v1-list-migration-history",
+ "title": "List migration history",
+ "slug": "v1-list-migration-history",
"type": "operation"
},
{
@@ -154,6 +310,18 @@
"slug": "v1-setup-a-read-replica",
"type": "operation"
},
+ {
+ "id": "v1-undo",
+ "title": "Undo",
+ "slug": "v1-undo",
+ "type": "operation"
+ },
+ {
+ "id": "v1-update-pooler-config",
+ "title": "Update pooler config",
+ "slug": "v1-update-pooler-config",
+ "type": "operation"
+ },
{
"id": "v1-update-postgres-config",
"title": "Update postgres config",
@@ -165,6 +333,12 @@
"title": "Update ssl enforcement config",
"slug": "v1-update-ssl-enforcement-config",
"type": "operation"
+ },
+ {
+ "id": "v1-upsert-a-migration",
+ "title": "Upsert a migration",
+ "slug": "v1-upsert-a-migration",
+ "type": "operation"
}
]
},
@@ -292,12 +466,24 @@
"slug": "v1-delete-a-branch",
"type": "operation"
},
+ {
+ "id": "v1-diff-a-branch",
+ "title": "Diff a branch",
+ "slug": "v1-diff-a-branch",
+ "type": "operation"
+ },
{
"id": "v1-disable-preview-branching",
"title": "Disable preview branching",
"slug": "v1-disable-preview-branching",
"type": "operation"
},
+ {
+ "id": "v1-get-a-branch",
+ "title": "Get a branch",
+ "slug": "v1-get-a-branch",
+ "type": "operation"
+ },
{
"id": "v1-get-a-branch-config",
"title": "Get a branch config",
@@ -352,6 +538,12 @@
"slug": "v1-exchange-oauth-token",
"type": "operation"
},
+ {
+ "id": "v1-oauth-authorize-project-claim",
+ "title": "Oauth authorize project claim",
+ "slug": "v1-oauth-authorize-project-claim",
+ "type": "operation"
+ },
{
"id": "v1-revoke-token",
"title": "Revoke token",
@@ -364,6 +556,12 @@
"type": "category",
"title": "Organizations",
"items": [
+ {
+ "id": "v1-claim-project-for-organization",
+ "title": "Claim project for organization",
+ "slug": "v1-claim-project-for-organization",
+ "type": "operation"
+ },
{
"id": "v1-create-an-organization",
"title": "Create an organization",
@@ -376,6 +574,12 @@
"slug": "v1-get-an-organization",
"type": "operation"
},
+ {
+ "id": "v1-get-organization-project-claim",
+ "title": "Get organization project claim",
+ "slug": "v1-get-organization-project-claim",
+ "type": "operation"
+ },
{
"id": "v1-list-all-organizations",
"title": "List all organizations",
@@ -406,6 +610,12 @@
"slug": "v1-create-a-project",
"type": "operation"
},
+ {
+ "id": "v1-create-project-claim-token",
+ "title": "Create project claim token",
+ "slug": "v1-create-project-claim-token",
+ "type": "operation"
+ },
{
"id": "v1-delete-a-project",
"title": "Delete a project",
@@ -418,6 +628,12 @@
"slug": "v1-delete-network-bans",
"type": "operation"
},
+ {
+ "id": "v1-delete-project-claim-token",
+ "title": "Delete project claim token",
+ "slug": "v1-delete-project-claim-token",
+ "type": "operation"
+ },
{
"id": "v1-get-network-restrictions",
"title": "Get network restrictions",
@@ -442,6 +658,12 @@
"slug": "v1-get-project",
"type": "operation"
},
+ {
+ "id": "v1-get-project-claim-token",
+ "title": "Get project claim token",
+ "slug": "v1-get-project-claim-token",
+ "type": "operation"
+ },
{
"id": "v1-get-services-health",
"title": "Get services health",
@@ -454,6 +676,12 @@
"slug": "v1-list-all-network-bans",
"type": "operation"
},
+ {
+ "id": "v1-list-all-network-bans-enriched",
+ "title": "List all network bans enriched",
+ "slug": "v1-list-all-network-bans-enriched",
+ "type": "operation"
+ },
{
"id": "v1-list-all-projects",
"title": "List all projects",
@@ -526,18 +754,42 @@
"slug": "v1-bulk-delete-secrets",
"type": "operation"
},
+ {
+ "id": "v1-create-project-api-key",
+ "title": "Create project api key",
+ "slug": "v1-create-project-api-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-delete-project-api-key",
+ "title": "Delete project api key",
+ "slug": "v1-delete-project-api-key",
+ "type": "operation"
+ },
{
"id": "v1-get-pgsodium-config",
"title": "Get pgsodium config",
"slug": "v1-get-pgsodium-config",
"type": "operation"
},
+ {
+ "id": "v1-get-project-api-key",
+ "title": "Get project api key",
+ "slug": "v1-get-project-api-key",
+ "type": "operation"
+ },
{
"id": "v1-get-project-api-keys",
"title": "Get project api keys",
"slug": "v1-get-project-api-keys",
"type": "operation"
},
+ {
+ "id": "v1-get-project-legacy-api-keys",
+ "title": "Get project legacy api keys",
+ "slug": "v1-get-project-legacy-api-keys",
+ "type": "operation"
+ },
{
"id": "v1-list-all-secrets",
"title": "List all secrets",
@@ -549,6 +801,18 @@
"title": "Update pgsodium config",
"slug": "v1-update-pgsodium-config",
"type": "operation"
+ },
+ {
+ "id": "v1-update-project-api-key",
+ "title": "Update project api key",
+ "slug": "v1-update-project-api-key",
+ "type": "operation"
+ },
+ {
+ "id": "v1-update-project-legacy-api-keys",
+ "title": "Update project legacy api keys",
+ "slug": "v1-update-project-legacy-api-keys",
+ "type": "operation"
}
]
},
diff --git a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json
index 9815cec79d5..3231de60004 100644
--- a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json
+++ b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json
@@ -8,10 +8,22 @@
},
"servers": [],
"tags": [
+ {
+ "name": "Advisors",
+ "description": "Advisors related endpoints"
+ },
+ {
+ "name": "Analytics",
+ "description": "Analytics related endpoints"
+ },
{
"name": "Auth",
"description": "Auth related endpoints"
},
+ {
+ "name": "Billing",
+ "description": "Billing related endpoints"
+ },
{
"name": "Database",
"description": "Database related endpoints"
@@ -64,7 +76,9 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -113,7 +127,9 @@
"type": "string"
},
"db_port": {
- "type": "number"
+ "type": "integer",
+ "minimum": 0,
+ "exclusiveMinimum": true
},
"db_user": {
"type": "string"
@@ -158,7 +174,9 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -194,6 +212,9 @@
"FUNCTIONS_DEPLOYED",
"FUNCTIONS_FAILED"
]
+ },
+ "request_review": {
+ "type": "boolean"
}
}
}
@@ -209,7 +230,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"name": {
"type": "string"
@@ -250,10 +272,16 @@
]
},
"created_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
},
"updated_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
+ },
+ "review_requested_at": {
+ "type": "string",
+ "format": "date-time"
}
},
"required": [
@@ -291,7 +319,9 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -336,11 +366,28 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "migration_version": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -384,11 +431,28 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "migration_version": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -432,11 +496,28 @@
"name": "branch_id",
"required": true,
"in": "path",
+ "description": "Branch ID",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "migration_version": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
"responses": {
"201": {
"description": "",
@@ -470,6 +551,54 @@
]
}
},
+ "/v1/branches/{branch_id}/diff": {
+ "get": {
+ "operationId": "v1-diff-a-branch",
+ "summary": "[Beta] Diffs a database branch",
+ "description": "Diffs the specified database branch",
+ "parameters": [
+ {
+ "name": "branch_id",
+ "required": true,
+ "in": "path",
+ "description": "Branch ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "name": "included_schemas",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "text/plain": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to diff database branch"
+ }
+ },
+ "tags": ["Environments"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/projects": {
"get": {
"operationId": "v1-list-all-projects",
@@ -590,6 +719,7 @@
},
"name": {
"type": "string",
+ "maxLength": 256,
"description": "Name of your project"
},
"organization_id": {
@@ -634,6 +764,8 @@
"desired_instance_size": {
"type": "string",
"enum": [
+ "pico",
+ "nano",
"micro",
"small",
"medium",
@@ -643,7 +775,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"template_url": {
@@ -824,16 +964,33 @@
"summary": "[Beta] Authorize user through oauth",
"parameters": [
{
- "name": "code_challenge_method",
- "required": false,
+ "name": "client_id",
+ "required": true,
"in": "query",
"schema": {
- "enum": ["plain", "sha256", "S256"],
+ "format": "uuid",
"type": "string"
}
},
{
- "name": "code_challenge",
+ "name": "response_type",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "enum": ["code", "token", "id_token token"],
+ "type": "string"
+ }
+ },
+ {
+ "name": "redirect_uri",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "scope",
"required": false,
"in": "query",
"schema": {
@@ -849,32 +1006,43 @@
}
},
{
- "name": "response_type",
- "required": true,
+ "name": "response_mode",
+ "required": false,
"in": "query",
"schema": {
"type": "string"
}
},
{
- "name": "redirect_uri",
- "required": true,
+ "name": "code_challenge",
+ "required": false,
"in": "query",
"schema": {
"type": "string"
}
},
{
- "name": "client_id",
- "required": true,
+ "name": "code_challenge_method",
+ "required": false,
"in": "query",
"schema": {
+ "enum": ["plain", "sha256", "S256"],
+ "type": "string"
+ }
+ },
+ {
+ "name": "organization_slug",
+ "required": false,
+ "in": "query",
+ "description": "Organization slug",
+ "schema": {
+ "pattern": "^[\\w-]+$",
"type": "string"
}
}
],
"responses": {
- "303": {
+ "204": {
"description": ""
}
},
@@ -1006,11 +1174,115 @@
]
}
},
+ "/v1/oauth/authorize/project-claim": {
+ "get": {
+ "operationId": "v1-oauth-authorize-project-claim",
+ "x-internal": true,
+ "summary": "Authorize user through oauth and claim a project",
+ "description": "Initiates the OAuth authorization flow for the specified provider. After successful authentication, the user can claim ownership of the specified project.",
+ "parameters": [
+ {
+ "name": "project_ref",
+ "required": true,
+ "in": "query",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "client_id",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "name": "response_type",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "enum": ["code", "token", "id_token token"],
+ "type": "string"
+ }
+ },
+ {
+ "name": "redirect_uri",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "state",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "response_mode",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "code_challenge",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "code_challenge_method",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "enum": ["plain", "sha256", "S256"],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": ""
+ }
+ },
+ "tags": ["OAuth"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/snippets": {
"get": {
"operationId": "v1-list-all-snippets",
"summary": "Lists SQL snippets for the logged in user",
"parameters": [
+ {
+ "name": "project_ref",
+ "required": false,
+ "in": "query",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
{
"name": "cursor",
"required": false,
@@ -1046,14 +1318,6 @@
"enum": ["asc", "desc"],
"type": "string"
}
- },
- {
- "name": "project_ref",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
}
],
"responses": {
@@ -1097,8 +1361,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"name": {
"type": "string"
@@ -1110,8 +1373,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -1123,8 +1385,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -1205,8 +1466,8 @@
"enum": ["sql"]
},
"visibility": {
- "enum": ["user", "project", "org", "public"],
- "type": "string"
+ "type": "string",
+ "enum": ["user", "project", "org", "public"]
},
"name": {
"type": "string"
@@ -1219,8 +1480,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"name": {
"type": "string"
@@ -1232,8 +1492,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -1245,8 +1504,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -1304,21 +1562,26 @@
"operationId": "v1-get-project-api-keys",
"summary": "Get project api keys",
"parameters": [
- {
- "name": "reveal",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
{
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
}
],
"responses": {
@@ -1331,11 +1594,9 @@
"items": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -1343,13 +1604,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1380,7 +1644,7 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
}
}
}
@@ -1398,24 +1662,29 @@
]
},
"post": {
- "operationId": "createApiKey",
- "summary": "[Alpha] Creates a new API key for the project",
+ "operationId": "v1-create-project-api-key",
+ "summary": "Creates a new API key for the project",
"parameters": [
- {
- "name": "reveal",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
{
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
+ },
+ {
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
}
],
"requestBody": {
@@ -1429,6 +1698,12 @@
"type": "string",
"enum": ["publishable", "secret"]
},
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1445,7 +1720,7 @@
"nullable": true
}
},
- "required": ["type"]
+ "required": ["type", "name"]
}
}
}
@@ -1458,11 +1733,9 @@
"schema": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -1470,13 +1743,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1507,7 +1783,108 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Secrets"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/api-keys/legacy": {
+ "get": {
+ "operationId": "v1-get-project-legacy-api-keys",
+ "summary": "Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Secrets"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "put": {
+ "operationId": "v1-update-project-legacy-api-keys",
+ "summary": "Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "enabled",
+ "required": true,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
}
}
}
@@ -1526,15 +1903,19 @@
},
"/v1/projects/{ref}/api-keys/{id}": {
"patch": {
- "operationId": "updateApiKey",
- "summary": "[Alpha] Updates an API key for the project",
+ "operationId": "v1-update-project-api-key",
+ "summary": "Updates an API key for the project",
"parameters": [
{
- "name": "reveal",
- "required": false,
- "in": "query",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
"schema": {
- "type": "boolean"
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
}
},
{
@@ -1542,15 +1923,17 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
{
- "name": "ref",
- "required": true,
- "in": "path",
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
"schema": {
- "type": "string"
+ "type": "boolean"
}
}
],
@@ -1561,6 +1944,12 @@
"schema": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1589,11 +1978,9 @@
"schema": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -1601,13 +1988,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1638,7 +2028,7 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
}
}
}
@@ -1655,15 +2045,19 @@
]
},
"get": {
- "operationId": "getApiKey",
- "summary": "[Alpha] Get API key",
+ "operationId": "v1-get-project-api-key",
+ "summary": "Get API key",
"parameters": [
{
- "name": "reveal",
- "required": false,
- "in": "query",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
"schema": {
- "type": "boolean"
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
}
},
{
@@ -1671,15 +2065,17 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
{
- "name": "ref",
- "required": true,
- "in": "path",
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
"schema": {
- "type": "string"
+ "type": "boolean"
}
}
],
@@ -1691,11 +2087,9 @@
"schema": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -1703,13 +2097,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1740,7 +2137,7 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
}
}
}
@@ -1757,15 +2154,19 @@
]
},
"delete": {
- "operationId": "deleteApiKey",
- "summary": "[Alpha] Deletes an API key for the project",
+ "operationId": "v1-delete-project-api-key",
+ "summary": "Deletes an API key for the project",
"parameters": [
{
- "name": "reveal",
- "required": false,
- "in": "query",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
"schema": {
- "type": "boolean"
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
}
},
{
@@ -1773,13 +2174,32 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
{
- "name": "ref",
- "required": true,
- "in": "path",
+ "name": "reveal",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "was_compromised",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "reason",
+ "required": false,
+ "in": "query",
"schema": {
"type": "string"
}
@@ -1793,11 +2213,9 @@
"schema": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -1805,13 +2223,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -1842,7 +2263,7 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
}
}
}
@@ -1869,7 +2290,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -1885,7 +2310,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"name": {
"type": "string"
@@ -1926,10 +2352,16 @@
]
},
"created_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
},
"updated_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
+ },
+ "review_requested_at": {
+ "type": "string",
+ "format": "date-time"
}
},
"required": [
@@ -1971,7 +2403,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -1990,6 +2426,9 @@
"git_branch": {
"type": "string"
},
+ "is_default": {
+ "type": "boolean"
+ },
"persistent": {
"type": "boolean"
},
@@ -2010,7 +2449,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"release_channel": {
@@ -2020,7 +2467,7 @@
},
"postgres_engine": {
"type": "string",
- "enum": ["15", "17-oriole"],
+ "enum": ["15", "17", "17-oriole"],
"description": "Postgres engine version. If not provided, the latest version will be used."
},
"secrets": {
@@ -2028,6 +2475,9 @@
"additionalProperties": {
"type": "string"
}
+ },
+ "with_data": {
+ "type": "boolean"
}
},
"required": ["branch_name"]
@@ -2044,7 +2494,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"name": {
"type": "string"
@@ -2085,10 +2536,16 @@
]
},
"created_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
},
"updated_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
+ },
+ "review_requested_at": {
+ "type": "string",
+ "format": "date-time"
}
},
"required": [
@@ -2129,7 +2586,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2153,6 +2614,126 @@
]
}
},
+ "/v1/projects/{ref}/branches/{name}": {
+ "get": {
+ "operationId": "v1-get-a-branch",
+ "summary": "Get a database branch",
+ "description": "Fetches the specified database branch by its name.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "required": true,
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "name": {
+ "type": "string"
+ },
+ "project_ref": {
+ "type": "string"
+ },
+ "parent_project_ref": {
+ "type": "string"
+ },
+ "is_default": {
+ "type": "boolean"
+ },
+ "git_branch": {
+ "type": "string"
+ },
+ "pr_number": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "latest_check_run_id": {
+ "type": "number",
+ "description": "This field is deprecated and will not be populated.",
+ "deprecated": true
+ },
+ "persistent": {
+ "type": "boolean"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "CREATING_PROJECT",
+ "RUNNING_MIGRATIONS",
+ "MIGRATIONS_PASSED",
+ "MIGRATIONS_FAILED",
+ "FUNCTIONS_DEPLOYED",
+ "FUNCTIONS_FAILED"
+ ]
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "review_requested_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "project_ref",
+ "parent_project_ref",
+ "is_default",
+ "persistent",
+ "status",
+ "created_at",
+ "updated_at"
+ ]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to fetch database branch"
+ }
+ },
+ "tags": ["Environments"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/projects/{ref}/custom-hostname": {
"get": {
"operationId": "v1-get-hostname-config",
@@ -2166,6 +2747,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2179,14 +2761,14 @@
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": {
"type": "string"
@@ -2200,13 +2782,13 @@
"errors": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"messages": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"result": {
@@ -2326,6 +2908,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2362,6 +2945,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2391,14 +2975,14 @@
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": {
"type": "string"
@@ -2412,13 +2996,13 @@
"errors": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"messages": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"result": {
@@ -2540,6 +3124,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2553,14 +3138,14 @@
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": {
"type": "string"
@@ -2574,13 +3159,13 @@
"errors": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"messages": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"result": {
@@ -2702,6 +3287,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2715,14 +3301,14 @@
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": {
"type": "string"
@@ -2736,13 +3322,13 @@
"errors": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"messages": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"result": {
@@ -2860,7 +3446,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2900,6 +3490,71 @@
]
}
},
+ "/v1/projects/{ref}/network-bans/retrieve/enriched": {
+ "post": {
+ "operationId": "v1-list-all-network-bans-enriched",
+ "summary": "[Beta] Gets project's network bans with additional information about which databases they affect",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "banned_ipv4_addresses": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "banned_address": {
+ "type": "string"
+ },
+ "identifier": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": ["banned_address", "identifier", "type"]
+ }
+ }
+ },
+ "required": ["banned_ipv4_addresses"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to retrieve project's enriched network bans"
+ }
+ },
+ "tags": ["Projects"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/projects/{ref}/network-bans": {
"delete": {
"operationId": "v1-delete-network-bans",
@@ -2909,7 +3564,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -2926,6 +3585,9 @@
"items": {
"type": "string"
}
+ },
+ "identifier": {
+ "type": "string"
}
},
"required": ["ipv4_addresses"]
@@ -2961,7 +3623,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3048,7 +3714,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3159,7 +3829,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3203,7 +3877,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3267,6 +3945,9 @@
"in": "path",
"description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3326,6 +4007,9 @@
"in": "path",
"description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3414,6 +4098,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3530,6 +4215,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3543,8 +4229,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
},
"ref": {
"type": "string"
@@ -3580,7 +4265,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3634,7 +4323,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3693,7 +4386,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3713,14 +4410,7 @@
},
"responses": {
"200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "type": "object"
- }
- }
- }
+ "description": ""
},
"403": {
"description": ""
@@ -3746,7 +4436,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3799,7 +4493,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3886,7 +4584,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3932,7 +4634,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -3980,7 +4686,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4013,7 +4723,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4075,7 +4789,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4137,7 +4855,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4203,7 +4925,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4236,7 +4962,7 @@
"properties": {
"postgres_version": {
"type": "string",
- "enum": ["15", "17-oriole"]
+ "enum": ["15", "17", "17-oriole"]
},
"release_channel": {
"type": "string",
@@ -4249,12 +4975,6 @@
"required": ["postgres_version", "release_channel", "app_version"]
}
},
- "potential_breaking_changes": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"duration_estimate_hours": {
"type": "number"
},
@@ -4264,7 +4984,19 @@
"type": "string"
}
},
- "extension_dependent_objects": {
+ "objects_to_be_dropped": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "unsupported_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "user_defined_objects_in_internal_schemas": {
"type": "array",
"items": {
"type": "string"
@@ -4277,10 +5009,11 @@
"current_app_version_release_channel",
"latest_app_version",
"target_upgrade_versions",
- "potential_breaking_changes",
"duration_estimate_hours",
"legacy_auth_custom_roles",
- "extension_dependent_objects"
+ "objects_to_be_dropped",
+ "unsupported_extensions",
+ "user_defined_objects_in_internal_schemas"
]
}
}
@@ -4307,17 +5040,21 @@
"summary": "[Beta] Gets the latest status of the project's upgrade",
"parameters": [
{
- "name": "tracking_id",
- "required": false,
- "in": "query",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
{
- "name": "ref",
- "required": true,
- "in": "path",
+ "name": "tracking_id",
+ "required": false,
+ "in": "query",
"schema": {
"type": "string"
}
@@ -4414,6 +5151,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4469,6 +5207,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4501,7 +5240,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4572,7 +5315,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4625,19 +5372,10 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
- {
- "name": "timeout_ms",
- "required": false,
- "in": "query",
- "schema": {
- "minimum": 0,
- "maximum": 10000,
- "type": "integer"
- }
- },
{
"name": "services",
"required": true,
@@ -4649,6 +5387,16 @@
"enum": ["auth", "db", "pooler", "realtime", "rest", "storage"]
}
}
+ },
+ {
+ "name": "timeout_ms",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "minimum": 0,
+ "maximum": 10000,
+ "type": "integer"
+ }
}
],
"responses": {
@@ -4661,6 +5409,17 @@
"items": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string",
+ "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"]
+ },
+ "healthy": {
+ "type": "boolean"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"]
+ },
"info": {
"oneOf": [
{
@@ -4669,32 +5428,33 @@
"name": {
"type": "string",
"enum": ["GoTrue"]
+ },
+ "version": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
}
},
- "required": ["name"]
+ "required": ["name", "version", "description"]
},
{
"type": "object",
"properties": {
+ "healthy": {
+ "type": "boolean"
+ },
+ "db_connected": {
+ "type": "boolean"
+ },
"connected_cluster": {
"type": "integer"
}
},
- "required": ["connected_cluster"]
+ "required": ["healthy", "db_connected", "connected_cluster"]
}
]
},
- "name": {
- "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"],
- "type": "string"
- },
- "healthy": {
- "type": "boolean"
- },
- "status": {
- "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"],
- "type": "string"
- },
"error": {
"type": "string"
}
@@ -4720,16 +5480,154 @@
]
}
},
- "/v1/projects/{ref}/config/auth/signing-keys": {
+ "/v1/projects/{ref}/config/auth/signing-keys/legacy": {
"post": {
- "operationId": "createSigningKeyForProject",
- "summary": "[Alpha] Create a new signing key for the project in standby status",
+ "operationId": "v1-create-legacy-signing-key",
+ "summary": "Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found.",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "algorithm": {
+ "type": "string",
+ "enum": ["EdDSA", "ES256", "RS256", "HS256"]
+ },
+ "status": {
+ "type": "string",
+ "enum": ["in_use", "previously_used", "revoked", "standby"]
+ },
+ "public_jwk": {
+ "nullable": true
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "required": ["id", "algorithm", "status", "created_at", "updated_at"],
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Auth"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "get": {
+ "operationId": "v1-get-legacy-signing-key",
+ "summary": "Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found.",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "algorithm": {
+ "type": "string",
+ "enum": ["EdDSA", "ES256", "RS256", "HS256"]
+ },
+ "status": {
+ "type": "string",
+ "enum": ["in_use", "previously_used", "revoked", "standby"]
+ },
+ "public_jwk": {
+ "nullable": true
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "required": ["id", "algorithm", "status", "created_at", "updated_at"],
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Auth"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/config/auth/signing-keys": {
+ "post": {
+ "operationId": "v1-create-project-signing-key",
+ "summary": "Create a new signing key for the project in standby status",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4748,6 +5646,109 @@
"status": {
"type": "string",
"enum": ["in_use", "standby"]
+ },
+ "private_jwk": {
+ "discriminator": {
+ "propertyName": "kty"
+ },
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["RSA"]
+ },
+ "n": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string",
+ "enum": ["AQAB"]
+ },
+ "d": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "n", "e", "d", "p", "q", "dp", "dq", "qi"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["EC"]
+ },
+ "crv": {
+ "type": "string",
+ "enum": ["P-256"]
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "crv", "x", "y", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["OKP"]
+ },
+ "crv": {
+ "type": "string",
+ "enum": ["Ed25519"]
+ },
+ "x": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "crv", "x", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["oct"]
+ },
+ "k": {
+ "type": "string",
+ "minLength": 16
+ }
+ },
+ "required": ["kty", "k"],
+ "additionalProperties": false
+ }
+ ]
}
},
"required": ["algorithm"],
@@ -4758,22 +5759,37 @@
},
"responses": {
"201": {
- "description": "[Alpha] Create a new signing key for the project in standby status",
+ "description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
"algorithm": {
"type": "string",
"enum": ["EdDSA", "ES256", "RS256", "HS256"]
},
"status": {
"type": "string",
- "enum": ["in_use", "standby"]
+ "enum": ["in_use", "previously_used", "revoked", "standby"]
+ },
+ "public_jwk": {
+ "nullable": true
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
}
},
- "required": ["algorithm"],
+ "required": ["id", "algorithm", "status", "created_at", "updated_at"],
"additionalProperties": false
}
}
@@ -4791,14 +5807,18 @@
]
},
"get": {
- "operationId": "listSigningKeysForProject",
- "summary": "[Alpha] List all signing keys for the project",
+ "operationId": "v1-get-project-signing-keys",
+ "summary": "List all signing keys for the project",
"parameters": [
{
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4865,14 +5885,15 @@
},
"/v1/projects/{ref}/config/auth/signing-keys/{id}": {
"get": {
- "operationId": "getSigningKeyForProject",
- "summary": "[Alpha] Get information about a signing key",
+ "operationId": "v1-get-project-signing-key",
+ "summary": "Get information about a signing key",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
@@ -4880,7 +5901,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -4935,14 +5960,15 @@
]
},
"delete": {
- "operationId": "deleteSigningKey",
- "summary": "[Alpha] Remove a signing key from a project, where the status is previously_used",
+ "operationId": "v1-remove-project-signing-key",
+ "summary": "Remove a signing key from a project. Only possible if the key has been in revoked status for a while.",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
@@ -4950,7 +5976,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5005,14 +6035,15 @@
]
},
"patch": {
- "operationId": "patchSigningKey",
- "summary": "[Alpha] Update a signing key, mainly its status",
+ "operationId": "v1-update-project-signing-key",
+ "summary": "Update a signing key, mainly its status",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
@@ -5020,7 +6051,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5106,6 +6141,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5142,6 +6178,15 @@
}
},
"required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
}
},
"required": ["imageTransformation", "s3Protocol"]
@@ -5178,6 +6223,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5192,7 +6238,7 @@
"fileSizeLimit": {
"type": "integer",
"minimum": 0,
- "maximum": 53687091200,
+ "maximum": 536870912000,
"format": "int64"
},
"features": {
@@ -5215,6 +6261,15 @@
}
},
"required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
}
},
"required": ["imageTransformation", "s3Protocol"]
@@ -5256,6 +6311,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5328,6 +6384,10 @@
"minimum": 0,
"maximum": 262143
},
+ "session_replication_role": {
+ "type": "string",
+ "enum": ["origin", "replica", "local"]
+ },
"shared_buffers": {
"type": "string"
},
@@ -5345,10 +6405,6 @@
},
"work_mem": {
"type": "string"
- },
- "session_replication_role": {
- "enum": ["origin", "replica", "local"],
- "type": "string"
}
}
}
@@ -5381,6 +6437,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5452,6 +6509,10 @@
"minimum": 0,
"maximum": 262143
},
+ "session_replication_role": {
+ "type": "string",
+ "enum": ["origin", "replica", "local"]
+ },
"shared_buffers": {
"type": "string"
},
@@ -5472,10 +6533,6 @@
},
"restart_database": {
"type": "boolean"
- },
- "session_replication_role": {
- "enum": ["origin", "replica", "local"],
- "type": "string"
}
}
}
@@ -5550,6 +6607,10 @@
"minimum": 0,
"maximum": 262143
},
+ "session_replication_role": {
+ "type": "string",
+ "enum": ["origin", "replica", "local"]
+ },
"shared_buffers": {
"type": "string"
},
@@ -5567,10 +6628,6 @@
},
"work_mem": {
"type": "string"
- },
- "session_replication_role": {
- "enum": ["origin", "replica", "local"],
- "type": "string"
}
}
}
@@ -5605,6 +6662,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5617,21 +6675,33 @@
"schema": {
"type": "object",
"properties": {
- "pool_mode": {
- "type": "string",
- "enum": ["transaction", "session", "statement"]
- },
"default_pool_size": {
- "type": "number"
+ "type": "integer"
},
"ignore_startup_parameters": {
"type": "string"
},
"max_client_conn": {
- "type": "number"
+ "type": "integer"
+ },
+ "pool_mode": {
+ "type": "string",
+ "enum": ["transaction", "session", "statement"]
},
"connection_string": {
"type": "string"
+ },
+ "server_idle_timeout": {
+ "type": "integer"
+ },
+ "server_lifetime": {
+ "type": "integer"
+ },
+ "query_wait_timeout": {
+ "type": "integer"
+ },
+ "reserve_pool_size": {
+ "type": "integer"
}
}
}
@@ -5650,7 +6720,7 @@
},
"/v1/projects/{ref}/config/database/pooler": {
"get": {
- "operationId": "getSupavisorConfig",
+ "operationId": "v1-get-pooler-config",
"summary": "Gets project's supavisor config",
"parameters": [
{
@@ -5661,6 +6731,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5675,16 +6746,33 @@
"items": {
"type": "object",
"properties": {
+ "identifier": {
+ "type": "string"
+ },
"database_type": {
"type": "string",
"enum": ["PRIMARY", "READ_REPLICA"]
},
+ "is_using_scram_auth": {
+ "type": "boolean"
+ },
+ "db_user": {
+ "type": "string"
+ },
+ "db_host": {
+ "type": "string"
+ },
"db_port": {
"type": "integer"
},
+ "db_name": {
+ "type": "string"
+ },
+ "connection_string": {
+ "type": "string"
+ },
"connectionString": {
"type": "string",
- "deprecated": true,
"description": "Use connection_string instead"
},
"default_pool_size": {
@@ -5696,41 +6784,23 @@
"nullable": true
},
"pool_mode": {
- "enum": ["transaction", "session"],
- "type": "string"
- },
- "identifier": {
- "type": "string"
- },
- "is_using_scram_auth": {
- "type": "boolean"
- },
- "db_user": {
- "type": "string"
- },
- "db_host": {
- "type": "string"
- },
- "db_name": {
- "type": "string"
- },
- "connection_string": {
- "type": "string"
+ "type": "string",
+ "enum": ["transaction", "session"]
}
},
"required": [
- "database_type",
- "db_port",
- "connectionString",
- "default_pool_size",
- "max_client_conn",
- "pool_mode",
"identifier",
+ "database_type",
"is_using_scram_auth",
"db_user",
"db_host",
+ "db_port",
"db_name",
- "connection_string"
+ "connection_string",
+ "connectionString",
+ "default_pool_size",
+ "max_client_conn",
+ "pool_mode"
]
}
}
@@ -5749,7 +6819,7 @@
]
},
"patch": {
- "operationId": "updateSupavisorConfig",
+ "operationId": "v1-update-pooler-config",
"summary": "Updates project's supavisor config",
"parameters": [
{
@@ -5760,6 +6830,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5773,15 +6844,14 @@
"properties": {
"default_pool_size": {
"type": "integer",
- "nullable": true,
"minimum": 0,
- "maximum": 1000
+ "maximum": 3000,
+ "nullable": true
},
"pool_mode": {
- "enum": ["transaction", "session"],
"type": "string",
- "description": "Dedicated pooler mode for the project",
- "deprecated": true
+ "enum": ["transaction", "session"],
+ "description": "Dedicated pooler mode for the project"
}
}
}
@@ -5837,6 +6907,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -5857,83 +6928,6 @@
"type": "integer",
"nullable": true
},
- "jwt_exp": {
- "type": "integer",
- "nullable": true
- },
- "mailer_otp_exp": {
- "type": "integer"
- },
- "mailer_otp_length": {
- "type": "integer",
- "nullable": true
- },
- "mfa_max_enrolled_factors": {
- "type": "integer",
- "nullable": true
- },
- "mfa_phone_otp_length": {
- "type": "integer"
- },
- "mfa_phone_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "password_min_length": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_anonymous_users": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_email_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_sms_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_token_refresh": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_verify": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_otp": {
- "type": "integer",
- "nullable": true
- },
- "security_refresh_token_reuse_interval": {
- "type": "integer",
- "nullable": true
- },
- "sessions_inactivity_timeout": {
- "type": "integer",
- "nullable": true
- },
- "sessions_timebox": {
- "type": "integer",
- "nullable": true
- },
- "sms_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_exp": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_length": {
- "type": "integer"
- },
- "smtp_max_frequency": {
- "type": "integer",
- "nullable": true
- },
"disable_signup": {
"type": "boolean",
"nullable": true
@@ -6206,6 +7200,10 @@
"type": "string",
"nullable": true
},
+ "external_web3_solana_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
"external_zoom_client_id": {
"type": "string",
"nullable": true
@@ -6278,6 +7276,22 @@
"type": "string",
"nullable": true
},
+ "hook_before_user_created_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_before_user_created_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "jwt_exp": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_allow_unverified_email_sign_ins": {
"type": "boolean",
"nullable": true
@@ -6286,6 +7300,13 @@
"type": "boolean",
"nullable": true
},
+ "mailer_otp_exp": {
+ "type": "integer"
+ },
+ "mailer_otp_length": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_secure_email_change_enabled": {
"type": "boolean",
"nullable": true
@@ -6338,6 +7359,10 @@
"type": "string",
"nullable": true
},
+ "mfa_max_enrolled_factors": {
+ "type": "integer",
+ "nullable": true
+ },
"mfa_totp_enroll_enabled": {
"type": "boolean",
"nullable": true
@@ -6362,16 +7387,61 @@
"type": "boolean",
"nullable": true
},
+ "mfa_phone_otp_length": {
+ "type": "integer"
+ },
"mfa_phone_template": {
"type": "string",
"nullable": true
},
+ "mfa_phone_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"password_hibp_enabled": {
"type": "boolean",
"nullable": true
},
+ "password_min_length": {
+ "type": "integer",
+ "nullable": true
+ },
"password_required_characters": {
"type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "rate_limit_anonymous_users": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_email_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_sms_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_token_refresh": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_verify": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_otp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
"nullable": true
},
"refresh_token_rotation_enabled": {
@@ -6396,6 +7466,7 @@
},
"security_captcha_provider": {
"type": "string",
+ "enum": ["turnstile", "hcaptcha"],
"nullable": true
},
"security_captcha_secret": {
@@ -6406,10 +7477,18 @@
"type": "boolean",
"nullable": true
},
+ "security_refresh_token_reuse_interval": {
+ "type": "integer",
+ "nullable": true
+ },
"security_update_password_require_reauthentication": {
"type": "boolean",
"nullable": true
},
+ "sessions_inactivity_timeout": {
+ "type": "integer",
+ "nullable": true
+ },
"sessions_single_per_user": {
"type": "boolean",
"nullable": true
@@ -6418,6 +7497,10 @@
"type": "string",
"nullable": true
},
+ "sessions_timebox": {
+ "type": "integer",
+ "nullable": true
+ },
"site_url": {
"type": "string",
"nullable": true
@@ -6426,6 +7509,10 @@
"type": "boolean",
"nullable": true
},
+ "sms_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"sms_messagebird_access_key": {
"type": "string",
"nullable": true
@@ -6434,8 +7521,16 @@
"type": "string",
"nullable": true
},
+ "sms_otp_exp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "sms_otp_length": {
+ "type": "integer"
+ },
"sms_provider": {
"type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
"nullable": true
},
"sms_template": {
@@ -6448,6 +7543,7 @@
},
"sms_test_otp_valid_until": {
"type": "string",
+ "format": "date-time",
"nullable": true
},
"sms_textlocal_api_key": {
@@ -6500,12 +7596,17 @@
},
"smtp_admin_email": {
"type": "string",
+ "format": "email",
"nullable": true
},
"smtp_host": {
"type": "string",
"nullable": true
},
+ "smtp_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"smtp_pass": {
"type": "string",
"nullable": true
@@ -6530,26 +7631,6 @@
"required": [
"api_max_request_duration",
"db_max_pool_size",
- "jwt_exp",
- "mailer_otp_exp",
- "mailer_otp_length",
- "mfa_max_enrolled_factors",
- "mfa_phone_otp_length",
- "mfa_phone_max_frequency",
- "password_min_length",
- "rate_limit_anonymous_users",
- "rate_limit_email_sent",
- "rate_limit_sms_sent",
- "rate_limit_token_refresh",
- "rate_limit_verify",
- "rate_limit_otp",
- "security_refresh_token_reuse_interval",
- "sessions_inactivity_timeout",
- "sessions_timebox",
- "sms_max_frequency",
- "sms_otp_exp",
- "sms_otp_length",
- "smtp_max_frequency",
"disable_signup",
"external_anonymous_users_enabled",
"external_apple_additional_client_ids",
@@ -6618,6 +7699,7 @@
"external_workos_enabled",
"external_workos_secret",
"external_workos_url",
+ "external_web3_solana_enabled",
"external_zoom_client_id",
"external_zoom_enabled",
"external_zoom_secret",
@@ -6636,8 +7718,14 @@
"hook_send_email_enabled",
"hook_send_email_uri",
"hook_send_email_secrets",
+ "hook_before_user_created_enabled",
+ "hook_before_user_created_uri",
+ "hook_before_user_created_secrets",
+ "jwt_exp",
"mailer_allow_unverified_email_sign_ins",
"mailer_autoconfirm",
+ "mailer_otp_exp",
+ "mailer_otp_length",
"mailer_secure_email_change_enabled",
"mailer_subjects_confirmation",
"mailer_subjects_email_change",
@@ -6651,15 +7739,26 @@
"mailer_templates_magic_link_content",
"mailer_templates_reauthentication_content",
"mailer_templates_recovery_content",
+ "mfa_max_enrolled_factors",
"mfa_totp_enroll_enabled",
"mfa_totp_verify_enabled",
"mfa_phone_enroll_enabled",
"mfa_phone_verify_enabled",
"mfa_web_authn_enroll_enabled",
"mfa_web_authn_verify_enabled",
+ "mfa_phone_otp_length",
"mfa_phone_template",
+ "mfa_phone_max_frequency",
"password_hibp_enabled",
+ "password_min_length",
"password_required_characters",
+ "rate_limit_anonymous_users",
+ "rate_limit_email_sent",
+ "rate_limit_sms_sent",
+ "rate_limit_token_refresh",
+ "rate_limit_verify",
+ "rate_limit_otp",
+ "rate_limit_web3",
"refresh_token_rotation_enabled",
"saml_enabled",
"saml_external_url",
@@ -6668,13 +7767,19 @@
"security_captcha_provider",
"security_captcha_secret",
"security_manual_linking_enabled",
+ "security_refresh_token_reuse_interval",
"security_update_password_require_reauthentication",
+ "sessions_inactivity_timeout",
"sessions_single_per_user",
"sessions_tags",
+ "sessions_timebox",
"site_url",
"sms_autoconfirm",
+ "sms_max_frequency",
"sms_messagebird_access_key",
"sms_messagebird_originator",
+ "sms_otp_exp",
+ "sms_otp_length",
"sms_provider",
"sms_template",
"sms_test_otp",
@@ -6693,6 +7798,7 @@
"sms_vonage_from",
"smtp_admin_email",
"smtp_host",
+ "smtp_max_frequency",
"smtp_pass",
"smtp_port",
"smtp_sender_name",
@@ -6729,6 +7835,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -6740,68 +7847,254 @@
"schema": {
"type": "object",
"properties": {
+ "site_url": {
+ "type": "string",
+ "pattern": "^[^,]+$",
+ "nullable": true
+ },
+ "disable_signup": {
+ "type": "boolean",
+ "nullable": true
+ },
"jwt_exp": {
"type": "integer",
"minimum": 0,
- "maximum": 604800
+ "maximum": 604800,
+ "nullable": true
+ },
+ "smtp_admin_email": {
+ "type": "string",
+ "format": "email",
+ "nullable": true
+ },
+ "smtp_host": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_port": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_user": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_pass": {
+ "type": "string",
+ "nullable": true
},
"smtp_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
+ },
+ "smtp_sender_name": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_allow_unverified_email_sign_ins": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mailer_autoconfirm": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mailer_subjects_invite": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_confirmation": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_recovery": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_email_change": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_magic_link": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_reauthentication": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_invite_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_confirmation_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_recovery_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_email_change_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_magic_link_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_reauthentication_content": {
+ "type": "string",
+ "nullable": true
},
"mfa_max_enrolled_factors": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "uri_allow_list": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_anonymous_users_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_email_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_phone_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "saml_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "saml_external_url": {
+ "type": "string",
+ "pattern": "^[^,]+$",
+ "nullable": true
+ },
+ "security_captcha_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "security_captcha_provider": {
+ "type": "string",
+ "enum": ["turnstile", "hcaptcha"],
+ "nullable": true
+ },
+ "security_captcha_secret": {
+ "type": "string",
+ "nullable": true
},
"sessions_timebox": {
"type": "integer",
- "minimum": 0
+ "minimum": 0,
+ "nullable": true
},
"sessions_inactivity_timeout": {
"type": "integer",
- "minimum": 0
+ "minimum": 0,
+ "nullable": true
+ },
+ "sessions_single_per_user": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "sessions_tags": {
+ "type": "string",
+ "pattern": "^\\s*([a-zA-Z0-9_-]+(\\s*,+\\s*)?)*\\s*$",
+ "nullable": true
},
"rate_limit_anonymous_users": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_email_sent": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_sms_sent": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_verify": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_token_refresh": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_otp": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "mailer_secure_email_change_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "refresh_token_rotation_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "password_hibp_enabled": {
+ "type": "boolean",
+ "nullable": true
},
"password_min_length": {
"type": "integer",
"minimum": 6,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
+ },
+ "password_required_characters": {
+ "type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "security_manual_linking_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "security_update_password_require_reauthentication": {
+ "type": "boolean",
+ "nullable": true
},
"security_refresh_token_reuse_interval": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"mailer_otp_exp": {
"type": "integer",
@@ -6811,489 +8104,496 @@
"mailer_otp_length": {
"type": "integer",
"minimum": 6,
- "maximum": 10
+ "maximum": 10,
+ "nullable": true
+ },
+ "sms_autoconfirm": {
+ "type": "boolean",
+ "nullable": true
},
"sms_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
},
"sms_otp_exp": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"sms_otp_length": {
"type": "integer",
"minimum": 0,
"maximum": 32767
},
+ "sms_provider": {
+ "type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
+ "nullable": true
+ },
+ "sms_messagebird_access_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_messagebird_originator": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_test_otp": {
+ "type": "string",
+ "pattern": "^([0-9]{1,15}=[0-9]+,?)*$",
+ "nullable": true
+ },
+ "sms_test_otp_valid_until": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "sms_textlocal_api_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_textlocal_sender": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_account_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_auth_token": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_content_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_message_service_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_account_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_auth_token": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_message_service_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_api_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_api_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_from": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_template": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_custom_access_token_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_custom_access_token_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_custom_access_token_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_sms_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_send_sms_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_sms_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_email_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_send_email_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_email_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_before_user_created_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_apple_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_additional_client_ids": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_azure_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_bitbucket_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_bitbucket_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_bitbucket_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_discord_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_discord_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_discord_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_facebook_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_facebook_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_facebook_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_figma_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_figma_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_figma_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_github_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_github_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_github_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_gitlab_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_google_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_additional_client_ids": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_skip_nonce_check": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_kakao_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_kakao_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_kakao_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_keycloak_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_linkedin_oidc_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_linkedin_oidc_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_linkedin_oidc_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_oidc_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_slack_oidc_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_oidc_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_notion_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_notion_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_notion_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_slack_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_spotify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_spotify_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_spotify_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitch_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_twitch_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitch_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitter_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_twitter_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitter_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_workos_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_web3_solana_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_zoom_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_zoom_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_zoom_secret": {
+ "type": "string",
+ "nullable": true
+ },
"db_max_pool_size": {
- "type": "integer"
+ "type": "integer",
+ "nullable": true
},
"api_max_request_duration": {
- "type": "integer"
+ "type": "integer",
+ "nullable": true
+ },
+ "mfa_totp_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_totp_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_web_authn_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_web_authn_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_phone_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_phone_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
},
"mfa_phone_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
},
"mfa_phone_otp_length": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
- },
- "site_url": {
- "type": "string",
- "pattern": "/^[^,]+$/"
- },
- "disable_signup": {
- "type": "boolean"
- },
- "smtp_admin_email": {
- "type": "string"
- },
- "smtp_host": {
- "type": "string"
- },
- "smtp_port": {
- "type": "string"
- },
- "smtp_user": {
- "type": "string"
- },
- "smtp_pass": {
- "type": "string"
- },
- "smtp_sender_name": {
- "type": "string"
- },
- "mailer_allow_unverified_email_sign_ins": {
- "type": "boolean"
- },
- "mailer_autoconfirm": {
- "type": "boolean"
- },
- "mailer_subjects_invite": {
- "type": "string"
- },
- "mailer_subjects_confirmation": {
- "type": "string"
- },
- "mailer_subjects_recovery": {
- "type": "string"
- },
- "mailer_subjects_email_change": {
- "type": "string"
- },
- "mailer_subjects_magic_link": {
- "type": "string"
- },
- "mailer_subjects_reauthentication": {
- "type": "string"
- },
- "mailer_templates_invite_content": {
- "type": "string"
- },
- "mailer_templates_confirmation_content": {
- "type": "string"
- },
- "mailer_templates_recovery_content": {
- "type": "string"
- },
- "mailer_templates_email_change_content": {
- "type": "string"
- },
- "mailer_templates_magic_link_content": {
- "type": "string"
- },
- "mailer_templates_reauthentication_content": {
- "type": "string"
- },
- "uri_allow_list": {
- "type": "string"
- },
- "external_anonymous_users_enabled": {
- "type": "boolean"
- },
- "external_email_enabled": {
- "type": "boolean"
- },
- "external_phone_enabled": {
- "type": "boolean"
- },
- "saml_enabled": {
- "type": "boolean"
- },
- "saml_external_url": {
- "type": "string",
- "pattern": "/^[^,]+$/"
- },
- "security_captcha_enabled": {
- "type": "boolean"
- },
- "security_captcha_provider": {
- "type": "string"
- },
- "security_captcha_secret": {
- "type": "string"
- },
- "sessions_single_per_user": {
- "type": "boolean"
- },
- "sessions_tags": {
- "type": "string",
- "pattern": "/^\\s*([a-z0-9_-]+(\\s*,+\\s*)?)*\\s*$/i"
- },
- "mailer_secure_email_change_enabled": {
- "type": "boolean"
- },
- "refresh_token_rotation_enabled": {
- "type": "boolean"
- },
- "password_hibp_enabled": {
- "type": "boolean"
- },
- "password_required_characters": {
- "type": "string",
- "enum": [
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
- "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
- "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
- ""
- ]
- },
- "security_manual_linking_enabled": {
- "type": "boolean"
- },
- "security_update_password_require_reauthentication": {
- "type": "boolean"
- },
- "sms_autoconfirm": {
- "type": "boolean"
- },
- "sms_provider": {
- "type": "string"
- },
- "sms_messagebird_access_key": {
- "type": "string"
- },
- "sms_messagebird_originator": {
- "type": "string"
- },
- "sms_test_otp": {
- "type": "string",
- "pattern": "/^([0-9]{1,15}=[0-9]+,?)*$/"
- },
- "sms_test_otp_valid_until": {
- "type": "string"
- },
- "sms_textlocal_api_key": {
- "type": "string"
- },
- "sms_textlocal_sender": {
- "type": "string"
- },
- "sms_twilio_account_sid": {
- "type": "string"
- },
- "sms_twilio_auth_token": {
- "type": "string"
- },
- "sms_twilio_content_sid": {
- "type": "string"
- },
- "sms_twilio_message_service_sid": {
- "type": "string"
- },
- "sms_twilio_verify_account_sid": {
- "type": "string"
- },
- "sms_twilio_verify_auth_token": {
- "type": "string"
- },
- "sms_twilio_verify_message_service_sid": {
- "type": "string"
- },
- "sms_vonage_api_key": {
- "type": "string"
- },
- "sms_vonage_api_secret": {
- "type": "string"
- },
- "sms_vonage_from": {
- "type": "string"
- },
- "sms_template": {
- "type": "string"
- },
- "hook_mfa_verification_attempt_enabled": {
- "type": "boolean"
- },
- "hook_mfa_verification_attempt_uri": {
- "type": "string"
- },
- "hook_mfa_verification_attempt_secrets": {
- "type": "string"
- },
- "hook_password_verification_attempt_enabled": {
- "type": "boolean"
- },
- "hook_password_verification_attempt_uri": {
- "type": "string"
- },
- "hook_password_verification_attempt_secrets": {
- "type": "string"
- },
- "hook_custom_access_token_enabled": {
- "type": "boolean"
- },
- "hook_custom_access_token_uri": {
- "type": "string"
- },
- "hook_custom_access_token_secrets": {
- "type": "string"
- },
- "hook_send_sms_enabled": {
- "type": "boolean"
- },
- "hook_send_sms_uri": {
- "type": "string"
- },
- "hook_send_sms_secrets": {
- "type": "string"
- },
- "hook_send_email_enabled": {
- "type": "boolean"
- },
- "hook_send_email_uri": {
- "type": "string"
- },
- "hook_send_email_secrets": {
- "type": "string"
- },
- "external_apple_enabled": {
- "type": "boolean"
- },
- "external_apple_client_id": {
- "type": "string"
- },
- "external_apple_secret": {
- "type": "string"
- },
- "external_apple_additional_client_ids": {
- "type": "string"
- },
- "external_azure_enabled": {
- "type": "boolean"
- },
- "external_azure_client_id": {
- "type": "string"
- },
- "external_azure_secret": {
- "type": "string"
- },
- "external_azure_url": {
- "type": "string"
- },
- "external_bitbucket_enabled": {
- "type": "boolean"
- },
- "external_bitbucket_client_id": {
- "type": "string"
- },
- "external_bitbucket_secret": {
- "type": "string"
- },
- "external_discord_enabled": {
- "type": "boolean"
- },
- "external_discord_client_id": {
- "type": "string"
- },
- "external_discord_secret": {
- "type": "string"
- },
- "external_facebook_enabled": {
- "type": "boolean"
- },
- "external_facebook_client_id": {
- "type": "string"
- },
- "external_facebook_secret": {
- "type": "string"
- },
- "external_figma_enabled": {
- "type": "boolean"
- },
- "external_figma_client_id": {
- "type": "string"
- },
- "external_figma_secret": {
- "type": "string"
- },
- "external_github_enabled": {
- "type": "boolean"
- },
- "external_github_client_id": {
- "type": "string"
- },
- "external_github_secret": {
- "type": "string"
- },
- "external_gitlab_enabled": {
- "type": "boolean"
- },
- "external_gitlab_client_id": {
- "type": "string"
- },
- "external_gitlab_secret": {
- "type": "string"
- },
- "external_gitlab_url": {
- "type": "string"
- },
- "external_google_enabled": {
- "type": "boolean"
- },
- "external_google_client_id": {
- "type": "string"
- },
- "external_google_secret": {
- "type": "string"
- },
- "external_google_additional_client_ids": {
- "type": "string"
- },
- "external_google_skip_nonce_check": {
- "type": "boolean"
- },
- "external_kakao_enabled": {
- "type": "boolean"
- },
- "external_kakao_client_id": {
- "type": "string"
- },
- "external_kakao_secret": {
- "type": "string"
- },
- "external_keycloak_enabled": {
- "type": "boolean"
- },
- "external_keycloak_client_id": {
- "type": "string"
- },
- "external_keycloak_secret": {
- "type": "string"
- },
- "external_keycloak_url": {
- "type": "string"
- },
- "external_linkedin_oidc_enabled": {
- "type": "boolean"
- },
- "external_linkedin_oidc_client_id": {
- "type": "string"
- },
- "external_linkedin_oidc_secret": {
- "type": "string"
- },
- "external_slack_oidc_enabled": {
- "type": "boolean"
- },
- "external_slack_oidc_client_id": {
- "type": "string"
- },
- "external_slack_oidc_secret": {
- "type": "string"
- },
- "external_notion_enabled": {
- "type": "boolean"
- },
- "external_notion_client_id": {
- "type": "string"
- },
- "external_notion_secret": {
- "type": "string"
- },
- "external_slack_enabled": {
- "type": "boolean"
- },
- "external_slack_client_id": {
- "type": "string"
- },
- "external_slack_secret": {
- "type": "string"
- },
- "external_spotify_enabled": {
- "type": "boolean"
- },
- "external_spotify_client_id": {
- "type": "string"
- },
- "external_spotify_secret": {
- "type": "string"
- },
- "external_twitch_enabled": {
- "type": "boolean"
- },
- "external_twitch_client_id": {
- "type": "string"
- },
- "external_twitch_secret": {
- "type": "string"
- },
- "external_twitter_enabled": {
- "type": "boolean"
- },
- "external_twitter_client_id": {
- "type": "string"
- },
- "external_twitter_secret": {
- "type": "string"
- },
- "external_workos_enabled": {
- "type": "boolean"
- },
- "external_workos_client_id": {
- "type": "string"
- },
- "external_workos_secret": {
- "type": "string"
- },
- "external_workos_url": {
- "type": "string"
- },
- "external_zoom_enabled": {
- "type": "boolean"
- },
- "external_zoom_client_id": {
- "type": "string"
- },
- "external_zoom_secret": {
- "type": "string"
- },
- "mfa_totp_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_totp_verify_enabled": {
- "type": "boolean"
- },
- "mfa_web_authn_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_web_authn_verify_enabled": {
- "type": "boolean"
- },
- "mfa_phone_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_phone_verify_enabled": {
- "type": "boolean"
+ "maximum": 32767,
+ "nullable": true
},
"mfa_phone_template": {
- "type": "string"
+ "type": "string",
+ "nullable": true
}
}
}
@@ -7316,83 +8616,6 @@
"type": "integer",
"nullable": true
},
- "jwt_exp": {
- "type": "integer",
- "nullable": true
- },
- "mailer_otp_exp": {
- "type": "integer"
- },
- "mailer_otp_length": {
- "type": "integer",
- "nullable": true
- },
- "mfa_max_enrolled_factors": {
- "type": "integer",
- "nullable": true
- },
- "mfa_phone_otp_length": {
- "type": "integer"
- },
- "mfa_phone_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "password_min_length": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_anonymous_users": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_email_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_sms_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_token_refresh": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_verify": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_otp": {
- "type": "integer",
- "nullable": true
- },
- "security_refresh_token_reuse_interval": {
- "type": "integer",
- "nullable": true
- },
- "sessions_inactivity_timeout": {
- "type": "integer",
- "nullable": true
- },
- "sessions_timebox": {
- "type": "integer",
- "nullable": true
- },
- "sms_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_exp": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_length": {
- "type": "integer"
- },
- "smtp_max_frequency": {
- "type": "integer",
- "nullable": true
- },
"disable_signup": {
"type": "boolean",
"nullable": true
@@ -7665,6 +8888,10 @@
"type": "string",
"nullable": true
},
+ "external_web3_solana_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
"external_zoom_client_id": {
"type": "string",
"nullable": true
@@ -7737,6 +8964,22 @@
"type": "string",
"nullable": true
},
+ "hook_before_user_created_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_before_user_created_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "jwt_exp": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_allow_unverified_email_sign_ins": {
"type": "boolean",
"nullable": true
@@ -7745,6 +8988,13 @@
"type": "boolean",
"nullable": true
},
+ "mailer_otp_exp": {
+ "type": "integer"
+ },
+ "mailer_otp_length": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_secure_email_change_enabled": {
"type": "boolean",
"nullable": true
@@ -7797,6 +9047,10 @@
"type": "string",
"nullable": true
},
+ "mfa_max_enrolled_factors": {
+ "type": "integer",
+ "nullable": true
+ },
"mfa_totp_enroll_enabled": {
"type": "boolean",
"nullable": true
@@ -7821,16 +9075,61 @@
"type": "boolean",
"nullable": true
},
+ "mfa_phone_otp_length": {
+ "type": "integer"
+ },
"mfa_phone_template": {
"type": "string",
"nullable": true
},
+ "mfa_phone_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"password_hibp_enabled": {
"type": "boolean",
"nullable": true
},
+ "password_min_length": {
+ "type": "integer",
+ "nullable": true
+ },
"password_required_characters": {
"type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "rate_limit_anonymous_users": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_email_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_sms_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_token_refresh": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_verify": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_otp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
"nullable": true
},
"refresh_token_rotation_enabled": {
@@ -7855,6 +9154,7 @@
},
"security_captcha_provider": {
"type": "string",
+ "enum": ["turnstile", "hcaptcha"],
"nullable": true
},
"security_captcha_secret": {
@@ -7865,10 +9165,18 @@
"type": "boolean",
"nullable": true
},
+ "security_refresh_token_reuse_interval": {
+ "type": "integer",
+ "nullable": true
+ },
"security_update_password_require_reauthentication": {
"type": "boolean",
"nullable": true
},
+ "sessions_inactivity_timeout": {
+ "type": "integer",
+ "nullable": true
+ },
"sessions_single_per_user": {
"type": "boolean",
"nullable": true
@@ -7877,6 +9185,10 @@
"type": "string",
"nullable": true
},
+ "sessions_timebox": {
+ "type": "integer",
+ "nullable": true
+ },
"site_url": {
"type": "string",
"nullable": true
@@ -7885,6 +9197,10 @@
"type": "boolean",
"nullable": true
},
+ "sms_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"sms_messagebird_access_key": {
"type": "string",
"nullable": true
@@ -7893,8 +9209,16 @@
"type": "string",
"nullable": true
},
+ "sms_otp_exp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "sms_otp_length": {
+ "type": "integer"
+ },
"sms_provider": {
"type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
"nullable": true
},
"sms_template": {
@@ -7907,6 +9231,7 @@
},
"sms_test_otp_valid_until": {
"type": "string",
+ "format": "date-time",
"nullable": true
},
"sms_textlocal_api_key": {
@@ -7959,12 +9284,17 @@
},
"smtp_admin_email": {
"type": "string",
+ "format": "email",
"nullable": true
},
"smtp_host": {
"type": "string",
"nullable": true
},
+ "smtp_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"smtp_pass": {
"type": "string",
"nullable": true
@@ -7989,26 +9319,6 @@
"required": [
"api_max_request_duration",
"db_max_pool_size",
- "jwt_exp",
- "mailer_otp_exp",
- "mailer_otp_length",
- "mfa_max_enrolled_factors",
- "mfa_phone_otp_length",
- "mfa_phone_max_frequency",
- "password_min_length",
- "rate_limit_anonymous_users",
- "rate_limit_email_sent",
- "rate_limit_sms_sent",
- "rate_limit_token_refresh",
- "rate_limit_verify",
- "rate_limit_otp",
- "security_refresh_token_reuse_interval",
- "sessions_inactivity_timeout",
- "sessions_timebox",
- "sms_max_frequency",
- "sms_otp_exp",
- "sms_otp_length",
- "smtp_max_frequency",
"disable_signup",
"external_anonymous_users_enabled",
"external_apple_additional_client_ids",
@@ -8077,6 +9387,7 @@
"external_workos_enabled",
"external_workos_secret",
"external_workos_url",
+ "external_web3_solana_enabled",
"external_zoom_client_id",
"external_zoom_enabled",
"external_zoom_secret",
@@ -8095,8 +9406,14 @@
"hook_send_email_enabled",
"hook_send_email_uri",
"hook_send_email_secrets",
+ "hook_before_user_created_enabled",
+ "hook_before_user_created_uri",
+ "hook_before_user_created_secrets",
+ "jwt_exp",
"mailer_allow_unverified_email_sign_ins",
"mailer_autoconfirm",
+ "mailer_otp_exp",
+ "mailer_otp_length",
"mailer_secure_email_change_enabled",
"mailer_subjects_confirmation",
"mailer_subjects_email_change",
@@ -8110,15 +9427,26 @@
"mailer_templates_magic_link_content",
"mailer_templates_reauthentication_content",
"mailer_templates_recovery_content",
+ "mfa_max_enrolled_factors",
"mfa_totp_enroll_enabled",
"mfa_totp_verify_enabled",
"mfa_phone_enroll_enabled",
"mfa_phone_verify_enabled",
"mfa_web_authn_enroll_enabled",
"mfa_web_authn_verify_enabled",
+ "mfa_phone_otp_length",
"mfa_phone_template",
+ "mfa_phone_max_frequency",
"password_hibp_enabled",
+ "password_min_length",
"password_required_characters",
+ "rate_limit_anonymous_users",
+ "rate_limit_email_sent",
+ "rate_limit_sms_sent",
+ "rate_limit_token_refresh",
+ "rate_limit_verify",
+ "rate_limit_otp",
+ "rate_limit_web3",
"refresh_token_rotation_enabled",
"saml_enabled",
"saml_external_url",
@@ -8127,13 +9455,19 @@
"security_captcha_provider",
"security_captcha_secret",
"security_manual_linking_enabled",
+ "security_refresh_token_reuse_interval",
"security_update_password_require_reauthentication",
+ "sessions_inactivity_timeout",
"sessions_single_per_user",
"sessions_tags",
+ "sessions_timebox",
"site_url",
"sms_autoconfirm",
+ "sms_max_frequency",
"sms_messagebird_access_key",
"sms_messagebird_originator",
+ "sms_otp_exp",
+ "sms_otp_length",
"sms_provider",
"sms_template",
"sms_test_otp",
@@ -8152,6 +9486,7 @@
"sms_vonage_from",
"smtp_admin_email",
"smtp_host",
+ "smtp_max_frequency",
"smtp_pass",
"smtp_port",
"smtp_sender_name",
@@ -8179,7 +9514,7 @@
},
"/v1/projects/{ref}/config/auth/third-party-auth": {
"post": {
- "operationId": "createTPAForProject",
+ "operationId": "v1-create-project-tpa-integration",
"summary": "Creates a new third-party auth integration",
"parameters": [
{
@@ -8190,6 +9525,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8207,9 +9543,7 @@
"jwks_url": {
"type": "string"
},
- "custom_jwks": {
- "type": "object"
- }
+ "custom_jwks": {}
}
}
}
@@ -8224,7 +9558,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"type": {
"type": "string"
@@ -8238,11 +9573,9 @@
"nullable": true
},
"custom_jwks": {
- "type": "object",
"nullable": true
},
"resolved_jwks": {
- "type": "object",
"nullable": true
},
"inserted_at": {
@@ -8273,7 +9606,7 @@
]
},
"get": {
- "operationId": "listTPAForProject",
+ "operationId": "v1-list-project-tpa-integrations",
"summary": "Lists all third-party auth integrations",
"parameters": [
{
@@ -8284,6 +9617,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8299,7 +9633,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"type": {
"type": "string"
@@ -8313,11 +9648,9 @@
"nullable": true
},
"custom_jwks": {
- "type": "object",
"nullable": true
},
"resolved_jwks": {
- "type": "object",
"nullable": true
},
"inserted_at": {
@@ -8351,7 +9684,7 @@
},
"/v1/projects/{ref}/config/auth/third-party-auth/{tpa_id}": {
"delete": {
- "operationId": "deleteTPAForProject",
+ "operationId": "v1-delete-project-tpa-integration",
"summary": "Removes a third-party auth integration",
"parameters": [
{
@@ -8362,6 +9695,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
@@ -8370,6 +9704,7 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -8383,7 +9718,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"type": {
"type": "string"
@@ -8397,11 +9733,9 @@
"nullable": true
},
"custom_jwks": {
- "type": "object",
"nullable": true
},
"resolved_jwks": {
- "type": "object",
"nullable": true
},
"inserted_at": {
@@ -8432,7 +9766,7 @@
]
},
"get": {
- "operationId": "getTPAForProject",
+ "operationId": "v1-get-project-tpa-integration",
"summary": "Get a third-party integration",
"parameters": [
{
@@ -8443,6 +9777,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
@@ -8451,6 +9786,7 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -8464,7 +9800,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"type": {
"type": "string"
@@ -8478,11 +9815,9 @@
"nullable": true
},
"custom_jwks": {
- "type": "object",
"nullable": true
},
"resolved_jwks": {
- "type": "object",
"nullable": true
},
"inserted_at": {
@@ -8526,6 +9861,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8555,7 +9891,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8613,23 +9953,15 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "hideDefinitions": ["release_channel", "postgres_engine"]
- }
- }
- }
- },
"responses": {
"200": {
"description": ""
@@ -8655,7 +9987,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8685,7 +10021,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8732,7 +10072,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -8785,26 +10133,7 @@
"required": ["description", "type", "interval", "amount"]
},
"meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- {
- "type": "number"
- },
- {
- "type": "boolean"
- },
- {
- "type": "string"
- },
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- ]
- }
+ "description": "Any JSON-serializable value"
}
},
"required": ["id", "name", "price"]
@@ -8852,7 +10181,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -8905,26 +10242,7 @@
"required": ["description", "type", "interval", "amount"]
},
"meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- {
- "type": "number"
- },
- {
- "type": "boolean"
- },
- {
- "type": "string"
- },
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- ]
- }
+ "description": "Any JSON-serializable value"
}
},
"required": ["id", "name", "price"]
@@ -8947,6 +10265,7 @@
"description": "Failed to list project addons"
}
},
+ "tags": ["Billing"],
"security": [
{
"bearer": []
@@ -8961,7 +10280,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -8987,7 +10310,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -9033,6 +10364,7 @@
"description": "Failed to apply project addon"
}
},
+ "tags": ["Billing"],
"security": [
{
"bearer": []
@@ -9046,37 +10378,59 @@
"summary": "Removes project addon",
"parameters": [
{
- "name": "addon_variant",
+ "name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
- "enum": [
- "ci_micro",
- "ci_small",
- "ci_medium",
- "ci_large",
- "ci_xlarge",
- "ci_2xlarge",
- "ci_4xlarge",
- "ci_8xlarge",
- "ci_12xlarge",
- "ci_16xlarge",
- "cd_default",
- "pitr_7",
- "pitr_14",
- "pitr_28",
- "ipv4_default"
- ],
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
{
- "name": "ref",
+ "name": "addon_variant",
"required": true,
"in": "path",
- "schema": {
- "type": "string"
- }
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "ci_micro",
+ "ci_small",
+ "ci_medium",
+ "ci_large",
+ "ci_xlarge",
+ "ci_2xlarge",
+ "ci_4xlarge",
+ "ci_8xlarge",
+ "ci_12xlarge",
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
+ ]
+ },
+ {
+ "type": "string",
+ "enum": ["cd_default"]
+ },
+ {
+ "type": "string",
+ "enum": ["pitr_7", "pitr_14", "pitr_28"]
+ },
+ {
+ "type": "string",
+ "enum": ["ipv4_default"]
+ }
+ ],
+ "schema": {}
}
],
"responses": {
@@ -9090,6 +10444,7 @@
"description": "Failed to remove project addon"
}
},
+ "tags": ["Billing"],
"security": [
{
"bearer": []
@@ -9097,40 +10452,21 @@
]
}
},
- "/v1/projects/{ref}/analytics/endpoints/logs.all": {
+ "/v1/projects/{ref}/claim-token": {
"get": {
- "operationId": "getLogs",
- "summary": "Gets project's logs",
+ "operationId": "v1-get-project-claim-token",
+ "x-internal": true,
+ "summary": "Gets project claim token",
"parameters": [
- {
- "name": "iso_timestamp_end",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "iso_timestamp_start",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "sql",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
{
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9143,9 +10479,526 @@
"schema": {
"type": "object",
"properties": {
+ "token_alias": {
+ "type": "string"
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ "required": ["token_alias", "expires_at", "created_at", "created_by"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Projects"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "post": {
+ "operationId": "v1-create-project-claim-token",
+ "x-internal": true,
+ "summary": "Creates project claim token",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "type": "string"
+ },
+ "token_alias": {
+ "type": "string"
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ "required": ["token", "token_alias", "expires_at", "created_at", "created_by"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Projects"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "delete": {
+ "operationId": "v1-delete-project-claim-token",
+ "x-internal": true,
+ "summary": "Revokes project claim token",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": ""
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Projects"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/advisors/performance": {
+ "get": {
+ "operationId": "v1-get-performance-advisors",
+ "summary": "Gets project performance advisors.",
+ "description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
+ "deprecated": true,
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "lints": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "enum": [
+ "unindexed_foreign_keys",
+ "auth_users_exposed",
+ "auth_rls_initplan",
+ "no_primary_key",
+ "unused_index",
+ "multiple_permissive_policies",
+ "policy_exists_rls_disabled",
+ "rls_enabled_no_policy",
+ "duplicate_index",
+ "security_definer_view",
+ "function_search_path_mutable",
+ "rls_disabled_in_public",
+ "extension_in_public",
+ "rls_references_user_metadata",
+ "materialized_view_in_api",
+ "foreign_table_in_api",
+ "unsupported_reg_types",
+ "auth_otp_long_expiry",
+ "auth_otp_short_length",
+ "ssl_not_enforced",
+ "network_restrictions_not_set",
+ "password_requirements_min_length",
+ "pitr_not_enabled",
+ "auth_leaked_password_protection",
+ "auth_insufficient_mfa_options",
+ "auth_password_policy_missing",
+ "leaked_service_key",
+ "no_backup_admin"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "level": {
+ "type": "string",
+ "enum": ["ERROR", "WARN", "INFO"]
+ },
+ "facing": {
+ "type": "string",
+ "enum": ["EXTERNAL"]
+ },
+ "categories": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": ["PERFORMANCE", "SECURITY"]
+ }
+ },
+ "description": {
+ "type": "string"
+ },
+ "detail": {
+ "type": "string"
+ },
+ "remediation": {
+ "type": "string"
+ },
+ "metadata": {
+ "type": "object",
+ "properties": {
+ "schema": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "entity": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "table",
+ "view",
+ "auth",
+ "function",
+ "extension",
+ "compliance"
+ ]
+ },
+ "fkey_name": {
+ "type": "string"
+ },
+ "fkey_columns": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ }
+ }
+ },
+ "cache_key": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "title",
+ "level",
+ "facing",
+ "categories",
+ "description",
+ "detail",
+ "remediation",
+ "cache_key"
+ ]
+ }
+ }
+ },
+ "required": ["lints"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Advisors"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/advisors/security": {
+ "get": {
+ "operationId": "v1-get-security-advisors",
+ "summary": "Gets project security advisors.",
+ "description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
+ "deprecated": true,
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "lint_type",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "enum": ["sql"],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "lints": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "enum": [
+ "unindexed_foreign_keys",
+ "auth_users_exposed",
+ "auth_rls_initplan",
+ "no_primary_key",
+ "unused_index",
+ "multiple_permissive_policies",
+ "policy_exists_rls_disabled",
+ "rls_enabled_no_policy",
+ "duplicate_index",
+ "security_definer_view",
+ "function_search_path_mutable",
+ "rls_disabled_in_public",
+ "extension_in_public",
+ "rls_references_user_metadata",
+ "materialized_view_in_api",
+ "foreign_table_in_api",
+ "unsupported_reg_types",
+ "auth_otp_long_expiry",
+ "auth_otp_short_length",
+ "ssl_not_enforced",
+ "network_restrictions_not_set",
+ "password_requirements_min_length",
+ "pitr_not_enabled",
+ "auth_leaked_password_protection",
+ "auth_insufficient_mfa_options",
+ "auth_password_policy_missing",
+ "leaked_service_key",
+ "no_backup_admin"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "level": {
+ "type": "string",
+ "enum": ["ERROR", "WARN", "INFO"]
+ },
+ "facing": {
+ "type": "string",
+ "enum": ["EXTERNAL"]
+ },
+ "categories": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": ["PERFORMANCE", "SECURITY"]
+ }
+ },
+ "description": {
+ "type": "string"
+ },
+ "detail": {
+ "type": "string"
+ },
+ "remediation": {
+ "type": "string"
+ },
+ "metadata": {
+ "type": "object",
+ "properties": {
+ "schema": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "entity": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "table",
+ "view",
+ "auth",
+ "function",
+ "extension",
+ "compliance"
+ ]
+ },
+ "fkey_name": {
+ "type": "string"
+ },
+ "fkey_columns": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ }
+ }
+ },
+ "cache_key": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "title",
+ "level",
+ "facing",
+ "categories",
+ "description",
+ "detail",
+ "remediation",
+ "cache_key"
+ ]
+ }
+ }
+ },
+ "required": ["lints"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Advisors"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/analytics/endpoints/logs.all": {
+ "get": {
+ "operationId": "v1-get-project-logs",
+ "summary": "Gets project's logs",
+ "description": "Executes a SQL query on the project's logs.\n\nEither the 'iso_timestamp_start' and 'iso_timestamp_end' parameters must be provided.\nIf both are not provided, only the last 1 minute of logs will be queried.\nThe timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.\n",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "sql",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "iso_timestamp_start",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "iso_timestamp_end",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "result": {
+ "type": "array",
+ "items": {}
+ },
"error": {
"oneOf": [
{
+ "type": "string"
+ },
+ {
+ "type": "object",
"properties": {
"code": {
"type": "number"
@@ -9153,6 +11006,7 @@
"errors": {
"type": "array",
"items": {
+ "type": "object",
"properties": {
"domain": {
"type": "string"
@@ -9169,7 +11023,14 @@
"reason": {
"type": "string"
}
- }
+ },
+ "required": [
+ "domain",
+ "location",
+ "locationType",
+ "message",
+ "reason"
+ ]
}
},
"message": {
@@ -9178,18 +11039,10 @@
"status": {
"type": "string"
}
- }
- },
- {
- "type": "string"
+ },
+ "required": ["code", "errors", "message", "status"]
}
]
- },
- "result": {
- "type": "array",
- "items": {
- "type": "object"
- }
}
}
}
@@ -9208,9 +11061,219 @@
]
}
},
+ "/v1/projects/{ref}/analytics/endpoints/usage.api-counts": {
+ "get": {
+ "operationId": "v1-get-project-usage-api-count",
+ "summary": "Gets project's usage api counts",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "interval",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "enum": ["15min", "30min", "1hr", "3hr", "1day", "3day", "7day"],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "result": {
+ "type": "array",
+ "items": {}
+ },
+ "error": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "number"
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "domain": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "locationType": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "domain",
+ "location",
+ "locationType",
+ "message",
+ "reason"
+ ]
+ }
+ },
+ "message": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "required": ["code", "errors", "message", "status"]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to get project's usage api counts"
+ }
+ },
+ "tags": ["Analytics"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count": {
+ "get": {
+ "operationId": "v1-get-project-usage-request-count",
+ "summary": "Gets project's usage api requests count",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "result": {
+ "type": "array",
+ "items": {}
+ },
+ "error": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "number"
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "domain": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "locationType": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "domain",
+ "location",
+ "locationType",
+ "message",
+ "reason"
+ ]
+ }
+ },
+ "message": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "required": ["code", "errors", "message", "status"]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Failed to get project's usage api requests count"
+ }
+ },
+ "tags": ["Analytics"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/projects/{ref}/database/migrations": {
"get": {
- "operationId": "v1-list-migrations",
+ "operationId": "v1-list-migration-history",
"summary": "[Beta] List applied migration versions",
"description": "Only available to selected partner OAuth apps",
"parameters": [
@@ -9218,7 +11281,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9270,21 +11337,47 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "Idempotency-Key",
+ "required": false,
+ "in": "header",
+ "description": "A unique key to ensure the same migration is tracked only once.",
"schema": {
"type": "string"
}
}
],
- "responses": {
- "200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "type": "object"
- }
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["query"]
}
}
+ }
+ },
+ "responses": {
+ "200": {
+ "description": ""
},
"403": {
"description": ""
@@ -9299,6 +11392,71 @@
"bearer": []
}
]
+ },
+ "put": {
+ "operationId": "v1-upsert-a-migration",
+ "summary": "[Beta] Upsert a database migration without applying",
+ "description": "Only available to selected partner OAuth apps",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "Idempotency-Key",
+ "required": false,
+ "in": "header",
+ "description": "A unique key to ensure the same migration is tracked only once.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["query"]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "403": {
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to upsert database migration"
+ }
+ },
+ "tags": ["Database"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
}
},
"/v1/projects/{ref}/database/query": {
@@ -9310,7 +11468,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9325,6 +11487,9 @@
"query": {
"type": "string",
"minLength": 1
+ },
+ "read_only": {
+ "type": "boolean"
}
},
"required": ["query"]
@@ -9334,14 +11499,7 @@
},
"responses": {
"201": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "type": "object"
- }
- }
- }
+ "description": ""
},
"403": {
"description": ""
@@ -9371,6 +11529,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9396,7 +11555,7 @@
},
"/v1/projects/{ref}/database/context": {
"get": {
- "operationId": "getDatabaseMetadata",
+ "operationId": "v1-get-database-metadata",
"summary": "Gets database metadata for the given project.",
"description": "This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.",
"deprecated": true,
@@ -9405,7 +11564,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9472,7 +11635,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9504,10 +11671,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -9520,6 +11689,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": [
@@ -9555,89 +11727,16 @@
"summary": "Create a function",
"description": "This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project.",
"deprecated": true,
- "parameters": [
- {
- "name": "import_map_path",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "entrypoint_path",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "import_map",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
- {
- "name": "verify_jwt",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
- {
- "name": "name",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "slug",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "ref",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
- }
- }
- ],
"requestBody": {
"required": true,
"content": {
- "application/json": {
+ "application/vnd.denoland.eszip": {
"schema": {
- "type": "object",
- "properties": {
- "slug": {
- "type": "string",
- "pattern": "^[A-Za-z0-9_-]+$"
- },
- "name": {
- "type": "string"
- },
- "body": {
- "type": "string"
- },
- "verify_jwt": {
- "type": "boolean"
- }
- },
- "required": ["slug", "name", "body"]
+ "type": "string",
+ "format": "binary"
}
},
- "application/vnd.denoland.eszip": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -9660,6 +11759,79 @@
}
}
},
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "slug",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "verify_jwt",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "import_map",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "entrypoint_path",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "import_map_path",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "ezbr_sha256",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
"responses": {
"201": {
"description": "",
@@ -9685,10 +11857,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -9701,6 +11875,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": [
@@ -9739,7 +11916,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -9771,7 +11952,8 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -9784,6 +11966,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version"]
@@ -9822,10 +12007,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -9838,6 +12025,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": [
@@ -9879,11 +12069,15 @@
"description": "A new endpoint to deploy functions. It will create if function does not exist.",
"parameters": [
{
- "name": "bundleOnly",
- "required": false,
- "in": "query",
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
"schema": {
- "type": "boolean"
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
}
},
{
@@ -9891,15 +12085,17 @@
"required": false,
"in": "query",
"schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
{
- "name": "ref",
- "required": true,
- "in": "path",
+ "name": "bundleOnly",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
"schema": {
- "type": "string"
+ "type": "boolean"
}
}
],
@@ -9972,10 +12168,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -9988,6 +12186,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version"]
@@ -10017,19 +12218,24 @@
"description": "Retrieves a function with the specified slug and project.",
"parameters": [
{
- "name": "function_slug",
+ "name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
- "pattern": "^[A-Za-z0-9_-]+$",
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
{
- "name": "ref",
+ "name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
}
@@ -10059,10 +12265,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -10075,6 +12283,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": [
@@ -10108,85 +12319,16 @@
"operationId": "v1-update-a-function",
"summary": "Update a function",
"description": "Updates a function with the specified slug and project.",
- "parameters": [
- {
- "name": "import_map_path",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "entrypoint_path",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "import_map",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
- {
- "name": "verify_jwt",
- "required": false,
- "in": "query",
- "schema": {
- "type": "boolean"
- }
- },
- {
- "name": "name",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "function_slug",
- "required": true,
- "in": "path",
- "schema": {
- "pattern": "^[A-Za-z0-9_-]+$",
- "type": "string"
- }
- },
- {
- "name": "ref",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
- }
- }
- ],
"requestBody": {
"required": true,
"content": {
- "application/json": {
+ "application/vnd.denoland.eszip": {
"schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "body": {
- "type": "string"
- },
- "verify_jwt": {
- "type": "boolean"
- }
- }
+ "type": "string",
+ "format": "binary"
}
},
- "application/vnd.denoland.eszip": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -10204,6 +12346,89 @@
}
}
},
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "function_slug",
+ "required": true,
+ "in": "path",
+ "description": "Function slug",
+ "schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "slug",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "verify_jwt",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "import_map",
+ "required": false,
+ "in": "query",
+ "description": "Boolean string, true or false",
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "name": "entrypoint_path",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "import_map_path",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "ezbr_sha256",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
"responses": {
"200": {
"description": "",
@@ -10229,10 +12454,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -10245,6 +12472,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": [
@@ -10280,19 +12510,24 @@
"description": "Deletes a function with the specified slug from the specified project.",
"parameters": [
{
- "name": "function_slug",
+ "name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
- "pattern": "^[A-Za-z0-9_-]+$",
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
{
- "name": "ref",
+ "name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
}
@@ -10323,26 +12558,39 @@
"description": "Retrieves a function body for the specified slug and project.",
"parameters": [
{
- "name": "function_slug",
+ "name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
- "pattern": "^[A-Za-z0-9_-]+$",
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
{
- "name": "ref",
+ "name": "function_slug",
"required": true,
"in": "path",
+ "description": "Function slug",
"schema": {
+ "pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
}
],
"responses": {
"200": {
- "description": ""
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {}
+ }
+ }
+ }
},
"403": {
"description": ""
@@ -10372,6 +12620,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -10439,6 +12688,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -10475,10 +12725,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -10491,15 +12751,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -10549,10 +12800,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -10565,15 +12826,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -10645,6 +12897,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -10688,10 +12941,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -10704,15 +12967,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -10790,6 +13044,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
@@ -10798,6 +13053,7 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -10836,10 +13092,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -10852,15 +13118,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -10932,6 +13189,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
@@ -10940,6 +13198,7 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -10971,10 +13230,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -10987,15 +13256,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -11044,10 +13304,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -11060,15 +13330,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -11140,6 +13401,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
},
@@ -11148,6 +13410,7 @@
"required": true,
"in": "path",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -11186,10 +13449,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -11202,15 +13475,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -11284,6 +13548,7 @@
"schema": {
"minLength": 20,
"maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -11310,6 +13575,9 @@
"items": {
"type": "object",
"properties": {
+ "is_physical_backup": {
+ "type": "boolean"
+ },
"status": {
"type": "string",
"enum": [
@@ -11321,26 +13589,21 @@
"CANCELLED"
]
},
- "is_physical_backup": {
- "type": "boolean"
- },
"inserted_at": {
"type": "string"
}
},
- "required": ["status", "is_physical_backup", "inserted_at"]
+ "required": ["is_physical_backup", "status", "inserted_at"]
}
},
"physical_backup_data": {
"type": "object",
"properties": {
"earliest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
},
"latest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
}
}
}
@@ -11380,7 +13643,11 @@
"name": "ref",
"required": true,
"in": "path",
+ "description": "Project ref",
"schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
"type": "string"
}
}
@@ -11419,6 +13686,186 @@
]
}
},
+ "/v1/projects/{ref}/database/backups/restore-point": {
+ "post": {
+ "operationId": "v1-create-restore-point",
+ "x-internal": true,
+ "summary": "Initiates a creation of a restore point for a database",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 20
+ }
+ },
+ "required": ["name"]
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["AVAILABLE", "PENDING", "REMOVED"]
+ }
+ },
+ "required": ["name", "status"]
+ }
+ }
+ }
+ }
+ },
+ "tags": ["Database"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "get": {
+ "operationId": "v1-get-restore-point",
+ "x-internal": true,
+ "summary": "Get restore points for project",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "maxLength": 20,
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["AVAILABLE", "PENDING", "REMOVED"]
+ }
+ },
+ "required": ["name", "status"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ },
+ "500": {
+ "description": "Failed to get requested restore points"
+ }
+ },
+ "tags": ["Database"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/projects/{ref}/database/backups/undo": {
+ "post": {
+ "operationId": "v1-undo",
+ "x-internal": true,
+ "summary": "Initiates an undo to a given restore point",
+ "parameters": [
+ {
+ "name": "ref",
+ "required": true,
+ "in": "path",
+ "description": "Project ref",
+ "schema": {
+ "minLength": 20,
+ "maxLength": 20,
+ "pattern": "^[a-z]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 20
+ }
+ },
+ "required": ["name"]
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": ""
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Database"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/v1/organizations/{slug}/members": {
"get": {
"operationId": "v1-list-organization-members",
@@ -11428,7 +13875,9 @@
"name": "slug",
"required": true,
"in": "path",
+ "description": "Organization slug",
"schema": {
+ "pattern": "^[\\w-]+$",
"type": "string"
}
}
@@ -11486,6 +13935,87 @@
"name": "slug",
"required": true,
"in": "path",
+ "description": "Organization slug",
+ "schema": {
+ "pattern": "^[\\w-]+$",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"]
+ },
+ "opt_in_tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "AI_SQL_GENERATOR_OPT_IN",
+ "AI_DATA_GENERATOR_OPT_IN",
+ "AI_LOG_GENERATOR_OPT_IN"
+ ]
+ }
+ },
+ "allowed_release_channels": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
+ }
+ }
+ },
+ "required": ["id", "name", "opt_in_tags", "allowed_release_channels"]
+ }
+ }
+ }
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Organizations"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/v1/organizations/{slug}/project-claim/{token}": {
+ "get": {
+ "operationId": "v1-get-organization-project-claim",
+ "x-internal": true,
+ "summary": "Gets project details for the specified organization and claim token",
+ "parameters": [
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": {
+ "pattern": "^[\\w-]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "token",
+ "required": true,
+ "in": "path",
"schema": {
"type": "string"
}
@@ -11499,32 +14029,126 @@
"schema": {
"type": "object",
"properties": {
- "plan": {
+ "project": {
+ "type": "object",
+ "properties": {
+ "ref": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["ref", "name"]
+ },
+ "preview": {
+ "type": "object",
+ "properties": {
+ "valid": {
+ "type": "boolean"
+ },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "info": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "members_exceeding_free_project_limit": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "limit": {
+ "type": "number"
+ }
+ },
+ "required": ["name", "limit"]
+ }
+ },
+ "target_organization_eligible": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "target_organization_has_free_project_slots": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "source_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"]
+ },
+ "target_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"],
+ "nullable": true
+ }
+ },
+ "required": [
+ "valid",
+ "warnings",
+ "errors",
+ "info",
+ "members_exceeding_free_project_limit",
+ "target_organization_eligible",
+ "target_organization_has_free_project_slots",
+ "source_subscription_plan",
+ "target_subscription_plan"
+ ]
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
"type": "string",
- "enum": ["free", "pro", "team", "enterprise"]
- },
- "opt_in_tags": {
- "type": "array",
- "items": {
- "type": "string",
- "enum": ["AI_SQL_GENERATOR_OPT_IN"]
- }
- },
- "allowed_release_channels": {
- "type": "array",
- "items": {
- "type": "string",
- "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
- }
- },
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
+ "format": "uuid"
}
},
- "required": ["opt_in_tags", "allowed_release_channels", "id", "name"]
+ "required": ["project", "preview", "expires_at", "created_at", "created_by"]
}
}
}
@@ -11539,6 +14163,45 @@
"bearer": []
}
]
+ },
+ "post": {
+ "operationId": "v1-claim-project-for-organization",
+ "x-internal": true,
+ "summary": "Claims project for the specified organization",
+ "parameters": [
+ {
+ "name": "slug",
+ "required": true,
+ "in": "path",
+ "description": "Organization slug",
+ "schema": {
+ "pattern": "^[\\w-]+$",
+ "type": "string"
+ }
+ },
+ {
+ "name": "token",
+ "required": true,
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": ""
+ },
+ "403": {
+ "description": ""
+ }
+ },
+ "tags": ["Organizations"],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
}
}
},
@@ -11590,7 +14253,9 @@
"type": "string"
},
"db_port": {
- "type": "number"
+ "type": "integer",
+ "minimum": 0,
+ "exclusiveMinimum": true
},
"db_user": {
"type": "string"
@@ -11639,6 +14304,9 @@
"FUNCTIONS_DEPLOYED",
"FUNCTIONS_FAILED"
]
+ },
+ "request_review": {
+ "type": "boolean"
}
}
},
@@ -11646,7 +14314,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"name": {
"type": "string"
@@ -11687,10 +14356,16 @@
]
},
"created_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
},
"updated_at": {
- "type": "string"
+ "type": "string",
+ "format": "date-time"
+ },
+ "review_requested_at": {
+ "type": "string",
+ "format": "date-time"
}
},
"required": [
@@ -11715,6 +14390,14 @@
},
"required": ["message"]
},
+ "BranchActionBody": {
+ "type": "object",
+ "properties": {
+ "migration_version": {
+ "type": "string"
+ }
+ }
+ },
"BranchUpdateResponse": {
"type": "object",
"properties": {
@@ -11728,28 +14411,6 @@
},
"required": ["workflow_run_id", "message"]
},
- "V1DatabaseResponse": {
- "type": "object",
- "properties": {
- "host": {
- "type": "string",
- "description": "Database host"
- },
- "version": {
- "type": "string",
- "description": "Database version"
- },
- "postgres_engine": {
- "type": "string",
- "description": "Database engine"
- },
- "release_channel": {
- "type": "string",
- "description": "Release channel"
- }
- },
- "required": ["host", "version", "postgres_engine", "release_channel"]
- },
"V1ProjectWithDatabaseResponse": {
"type": "object",
"properties": {
@@ -11820,7 +14481,7 @@
},
"required": ["id", "organization_id", "name", "region", "created_at", "status", "database"]
},
- "V1CreateProjectBodyDto": {
+ "V1CreateProjectBody": {
"type": "object",
"properties": {
"db_pass": {
@@ -11829,6 +14490,7 @@
},
"name": {
"type": "string",
+ "maxLength": 256,
"description": "Name of your project"
},
"organization_id": {
@@ -11873,6 +14535,8 @@
"desired_instance_size": {
"type": "string",
"enum": [
+ "pico",
+ "nano",
"micro",
"small",
"medium",
@@ -11882,7 +14546,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"template_url": {
@@ -11956,7 +14628,7 @@
},
"required": ["id", "name"]
},
- "CreateOrganizationV1Dto": {
+ "CreateOrganizationV1": {
"type": "object",
"properties": {
"name": {
@@ -12015,7 +14687,7 @@
"required": ["access_token", "refresh_token", "expires_in", "token_type"],
"additionalProperties": false
},
- "OAuthRevokeTokenBodyDto": {
+ "OAuthRevokeTokenBody": {
"type": "object",
"properties": {
"client_id": {
@@ -12032,112 +14704,6 @@
"required": ["client_id", "client_secret", "refresh_token"],
"additionalProperties": false
},
- "SnippetProject": {
- "type": "object",
- "properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "name": {
- "type": "string"
- }
- },
- "required": ["id", "name"]
- },
- "SnippetUser": {
- "type": "object",
- "properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "username": {
- "type": "string"
- }
- },
- "required": ["id", "username"]
- },
- "SnippetMeta": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "inserted_at": {
- "type": "string"
- },
- "updated_at": {
- "type": "string"
- },
- "type": {
- "type": "string",
- "enum": ["sql"]
- },
- "visibility": {
- "type": "string",
- "enum": ["user", "project", "org", "public"]
- },
- "name": {
- "type": "string"
- },
- "description": {
- "type": "string",
- "nullable": true
- },
- "project": {
- "type": "object",
- "properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "name": {
- "type": "string"
- }
- },
- "required": ["id", "name"]
- },
- "owner": {
- "type": "object",
- "properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "username": {
- "type": "string"
- }
- },
- "required": ["id", "username"]
- },
- "updated_by": {
- "type": "object",
- "properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
- "username": {
- "type": "string"
- }
- },
- "required": ["id", "username"]
- }
- },
- "required": [
- "id",
- "inserted_at",
- "updated_at",
- "type",
- "visibility",
- "name",
- "description",
- "project",
- "owner",
- "updated_by"
- ]
- },
"SnippetList": {
"type": "object",
"properties": {
@@ -12174,8 +14740,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"name": {
"type": "string"
@@ -12187,8 +14752,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -12200,8 +14764,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -12230,21 +14793,6 @@
},
"required": ["data"]
},
- "SnippetContent": {
- "type": "object",
- "properties": {
- "favorite": {
- "type": "boolean"
- },
- "schema_version": {
- "type": "string"
- },
- "sql": {
- "type": "string"
- }
- },
- "required": ["favorite", "schema_version", "sql"]
- },
"SnippetResponse": {
"type": "object",
"properties": {
@@ -12262,8 +14810,8 @@
"enum": ["sql"]
},
"visibility": {
- "enum": ["user", "project", "org", "public"],
- "type": "string"
+ "type": "string",
+ "enum": ["user", "project", "org", "public"]
},
"name": {
"type": "string"
@@ -12276,8 +14824,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"name": {
"type": "string"
@@ -12289,8 +14836,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -12302,8 +14848,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
"username": {
"type": "string"
@@ -12344,11 +14889,9 @@
"ApiKeyResponse": {
"type": "object",
"properties": {
- "name": {
- "type": "string"
- },
"api_key": {
- "type": "string"
+ "type": "string",
+ "nullable": true
},
"id": {
"type": "string",
@@ -12356,13 +14899,16 @@
},
"type": {
"type": "string",
- "enum": ["publishable", "secret", "legacy"],
+ "enum": ["legacy", "publishable", "secret"],
"nullable": true
},
"prefix": {
"type": "string",
"nullable": true
},
+ "name": {
+ "type": "string"
+ },
"description": {
"type": "string",
"nullable": true
@@ -12393,7 +14939,16 @@
"nullable": true
}
},
- "required": ["name", "api_key"]
+ "required": ["name"]
+ },
+ "LegacyApiKeysResponse": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
},
"CreateApiKeyBody": {
"type": "object",
@@ -12402,6 +14957,12 @@
"type": "string",
"enum": ["publishable", "secret"]
},
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": {
"type": "string",
"nullable": true
@@ -12418,11 +14979,17 @@
"nullable": true
}
},
- "required": ["type"]
+ "required": ["type", "name"]
},
"UpdateApiKeyBody": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string",
+ "minLength": 4,
+ "maxLength": 64,
+ "pattern": "^[a-z_][a-z0-9_]+$"
+ },
"description": {
"type": "string",
"nullable": true
@@ -12450,6 +15017,9 @@
"git_branch": {
"type": "string"
},
+ "is_default": {
+ "type": "boolean"
+ },
"persistent": {
"type": "boolean"
},
@@ -12470,7 +15040,15 @@
"4xlarge",
"8xlarge",
"12xlarge",
- "16xlarge"
+ "16xlarge",
+ "24xlarge",
+ "24xlarge_optimized_memory",
+ "24xlarge_optimized_cpu",
+ "24xlarge_high_memory",
+ "48xlarge",
+ "48xlarge_optimized_memory",
+ "48xlarge_optimized_cpu",
+ "48xlarge_high_memory"
]
},
"release_channel": {
@@ -12480,7 +15058,7 @@
},
"postgres_engine": {
"type": "string",
- "enum": ["15", "17-oriole"],
+ "enum": ["15", "17", "17-oriole"],
"description": "Postgres engine version. If not provided, the latest version will be used."
},
"secrets": {
@@ -12488,279 +15066,25 @@
"additionalProperties": {
"type": "string"
}
+ },
+ "with_data": {
+ "type": "boolean"
}
},
"required": ["branch_name"]
},
- "ValidationRecord": {
- "type": "object",
- "properties": {
- "txt_name": {
- "type": "string"
- },
- "txt_value": {
- "type": "string"
- }
- },
- "required": ["txt_name", "txt_value"]
- },
- "ValidationError": {
- "type": "object",
- "properties": {
- "message": {
- "type": "string"
- }
- },
- "required": ["message"]
- },
- "SslValidation": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string"
- },
- "validation_records": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "txt_name": {
- "type": "string"
- },
- "txt_value": {
- "type": "string"
- }
- },
- "required": ["txt_name", "txt_value"]
- }
- },
- "validation_errors": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "message": {
- "type": "string"
- }
- },
- "required": ["message"]
- }
- }
- },
- "required": ["status", "validation_records"]
- },
- "OwnershipVerification": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- },
- "required": ["type", "name", "value"]
- },
- "CustomHostnameDetails": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "hostname": {
- "type": "string"
- },
- "ssl": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string"
- },
- "validation_records": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "txt_name": {
- "type": "string"
- },
- "txt_value": {
- "type": "string"
- }
- },
- "required": ["txt_name", "txt_value"]
- }
- },
- "validation_errors": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "message": {
- "type": "string"
- }
- },
- "required": ["message"]
- }
- }
- },
- "required": ["status", "validation_records"]
- },
- "ownership_verification": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- },
- "required": ["type", "name", "value"]
- },
- "custom_origin_server": {
- "type": "string"
- },
- "verification_errors": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "status": {
- "type": "string"
- }
- },
- "required": [
- "id",
- "hostname",
- "ssl",
- "ownership_verification",
- "custom_origin_server",
- "status"
- ]
- },
- "CfResponse": {
- "type": "object",
- "properties": {
- "success": {
- "type": "boolean"
- },
- "errors": {
- "type": "array",
- "items": {
- "type": "object"
- }
- },
- "messages": {
- "type": "array",
- "items": {
- "type": "object"
- }
- },
- "result": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "hostname": {
- "type": "string"
- },
- "ssl": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string"
- },
- "validation_records": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "txt_name": {
- "type": "string"
- },
- "txt_value": {
- "type": "string"
- }
- },
- "required": ["txt_name", "txt_value"]
- }
- },
- "validation_errors": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "message": {
- "type": "string"
- }
- },
- "required": ["message"]
- }
- }
- },
- "required": ["status", "validation_records"]
- },
- "ownership_verification": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "value": {
- "type": "string"
- }
- },
- "required": ["type", "name", "value"]
- },
- "custom_origin_server": {
- "type": "string"
- },
- "verification_errors": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "status": {
- "type": "string"
- }
- },
- "required": [
- "id",
- "hostname",
- "ssl",
- "ownership_verification",
- "custom_origin_server",
- "status"
- ]
- }
- },
- "required": ["success", "errors", "messages", "result"]
- },
"UpdateCustomHostnameResponse": {
"type": "object",
"properties": {
"status": {
+ "type": "string",
"enum": [
"1_not_started",
"2_initiated",
"3_challenge_verified",
"4_origin_setup_completed",
"5_services_reconfigured"
- ],
- "type": "string"
+ ]
},
"custom_hostname": {
"type": "string"
@@ -12774,13 +15098,13 @@
"errors": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"messages": {
"type": "array",
"items": {
- "type": "object"
+ "description": "Any JSON-serializable value"
}
},
"result": {
@@ -12892,6 +15216,30 @@
},
"required": ["banned_ipv4_addresses"]
},
+ "NetworkBanResponseEnriched": {
+ "type": "object",
+ "properties": {
+ "banned_ipv4_addresses": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "banned_address": {
+ "type": "string"
+ },
+ "identifier": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": ["banned_address", "identifier", "type"]
+ }
+ }
+ },
+ "required": ["banned_ipv4_addresses"]
+ },
"RemoveNetworkBanRequest": {
"type": "object",
"properties": {
@@ -12900,6 +15248,9 @@
"items": {
"type": "string"
}
+ },
+ "identifier": {
+ "type": "string"
}
},
"required": ["ipv4_addresses"]
@@ -13057,8 +15408,7 @@
"type": "object",
"properties": {
"id": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
},
"ref": {
"type": "string"
@@ -13085,21 +15435,24 @@
"required": ["name", "value"]
},
"CreateSecretBody": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "maxLength": 256,
- "pattern": "^(?!SUPABASE_).*",
- "description": "Secret name must not start with the SUPABASE_ prefix.",
- "example": "string"
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 256,
+ "pattern": "^(?!SUPABASE_).*",
+ "description": "Secret name must not start with the SUPABASE_ prefix.",
+ "example": "string"
+ },
+ "value": {
+ "type": "string",
+ "maxLength": 24576
+ }
},
- "value": {
- "type": "string",
- "maxLength": 24576
- }
- },
- "required": ["name", "value"]
+ "required": ["name", "value"]
+ }
},
"SslEnforcementResponse": {
"type": "object",
@@ -13228,7 +15581,7 @@
"properties": {
"postgres_version": {
"type": "string",
- "enum": ["15", "17-oriole"]
+ "enum": ["15", "17", "17-oriole"]
},
"release_channel": {
"type": "string",
@@ -13241,12 +15594,6 @@
"required": ["postgres_version", "release_channel", "app_version"]
}
},
- "potential_breaking_changes": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"duration_estimate_hours": {
"type": "number"
},
@@ -13256,7 +15603,19 @@
"type": "string"
}
},
- "extension_dependent_objects": {
+ "objects_to_be_dropped": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "unsupported_extensions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "user_defined_objects_in_internal_schemas": {
"type": "array",
"items": {
"type": "string"
@@ -13269,10 +15628,11 @@
"current_app_version_release_channel",
"latest_app_version",
"target_upgrade_versions",
- "potential_breaking_changes",
"duration_estimate_hours",
"legacy_auth_custom_roles",
- "extension_dependent_objects"
+ "objects_to_be_dropped",
+ "unsupported_extensions",
+ "user_defined_objects_in_internal_schemas"
]
},
"DatabaseUpgradeStatusResponse": {
@@ -13385,28 +15745,20 @@
},
"required": ["database_identifier"]
},
- "AuthHealthResponse": {
+ "V1ServiceHealthResponse": {
"type": "object",
"properties": {
"name": {
"type": "string",
- "enum": ["GoTrue"]
- }
- },
- "required": ["name"]
- },
- "RealtimeHealthResponse": {
- "type": "object",
- "properties": {
- "connected_cluster": {
- "type": "integer"
- }
- },
- "required": ["connected_cluster"]
- },
- "V1ServiceHealthResponse": {
- "type": "object",
- "properties": {
+ "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"]
+ },
+ "healthy": {
+ "type": "boolean"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"]
+ },
"info": {
"oneOf": [
{
@@ -13415,38 +15767,69 @@
"name": {
"type": "string",
"enum": ["GoTrue"]
+ },
+ "version": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
}
},
- "required": ["name"]
+ "required": ["name", "version", "description"]
},
{
"type": "object",
"properties": {
+ "healthy": {
+ "type": "boolean"
+ },
+ "db_connected": {
+ "type": "boolean"
+ },
"connected_cluster": {
"type": "integer"
}
},
- "required": ["connected_cluster"]
+ "required": ["healthy", "db_connected", "connected_cluster"]
}
]
},
- "name": {
- "enum": ["auth", "db", "pooler", "realtime", "rest", "storage"],
- "type": "string"
- },
- "healthy": {
- "type": "boolean"
- },
- "status": {
- "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"],
- "type": "string"
- },
"error": {
"type": "string"
}
},
"required": ["name", "healthy", "status"]
},
+ "SigningKeyResponse": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "algorithm": {
+ "type": "string",
+ "enum": ["EdDSA", "ES256", "RS256", "HS256"]
+ },
+ "status": {
+ "type": "string",
+ "enum": ["in_use", "previously_used", "revoked", "standby"]
+ },
+ "public_jwk": {
+ "nullable": true
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "required": ["id", "algorithm", "status", "created_at", "updated_at"],
+ "additionalProperties": false
+ },
"CreateSigningKeyBody": {
"type": "object",
"properties": {
@@ -13457,6 +15840,109 @@
"status": {
"type": "string",
"enum": ["in_use", "standby"]
+ },
+ "private_jwk": {
+ "discriminator": {
+ "propertyName": "kty"
+ },
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["RSA"]
+ },
+ "n": {
+ "type": "string"
+ },
+ "e": {
+ "type": "string",
+ "enum": ["AQAB"]
+ },
+ "d": {
+ "type": "string"
+ },
+ "p": {
+ "type": "string"
+ },
+ "q": {
+ "type": "string"
+ },
+ "dp": {
+ "type": "string"
+ },
+ "dq": {
+ "type": "string"
+ },
+ "qi": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "n", "e", "d", "p", "q", "dp", "dq", "qi"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["EC"]
+ },
+ "crv": {
+ "type": "string",
+ "enum": ["P-256"]
+ },
+ "x": {
+ "type": "string"
+ },
+ "y": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "crv", "x", "y", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["OKP"]
+ },
+ "crv": {
+ "type": "string",
+ "enum": ["Ed25519"]
+ },
+ "x": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ }
+ },
+ "required": ["kty", "crv", "x", "d"],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "kty": {
+ "type": "string",
+ "enum": ["oct"]
+ },
+ "k": {
+ "type": "string",
+ "minLength": 16
+ }
+ },
+ "required": ["kty", "k"],
+ "additionalProperties": false
+ }
+ ]
}
},
"required": ["algorithm"],
@@ -13502,36 +15988,6 @@
"required": ["keys"],
"additionalProperties": false
},
- "SigningKeyResponse": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "format": "uuid"
- },
- "algorithm": {
- "type": "string",
- "enum": ["EdDSA", "ES256", "RS256", "HS256"]
- },
- "status": {
- "type": "string",
- "enum": ["in_use", "previously_used", "revoked", "standby"]
- },
- "public_jwk": {
- "nullable": true
- },
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "updated_at": {
- "type": "string",
- "format": "date-time"
- }
- },
- "required": ["id", "algorithm", "status", "created_at", "updated_at"],
- "additionalProperties": false
- },
"UpdateSigningKeyBody": {
"type": "object",
"properties": {
@@ -13543,48 +15999,6 @@
"required": ["status"],
"additionalProperties": false
},
- "StorageFeatureImageTransformation": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- }
- },
- "required": ["enabled"]
- },
- "StorageFeatureS3Protocol": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- }
- },
- "required": ["enabled"]
- },
- "StorageFeatures": {
- "type": "object",
- "properties": {
- "imageTransformation": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- }
- },
- "required": ["enabled"]
- },
- "s3Protocol": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- }
- },
- "required": ["enabled"]
- }
- },
- "required": ["imageTransformation", "s3Protocol"]
- },
"StorageConfigResponse": {
"type": "object",
"properties": {
@@ -13612,6 +16026,15 @@
}
},
"required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
}
},
"required": ["imageTransformation", "s3Protocol"]
@@ -13625,7 +16048,7 @@
"fileSizeLimit": {
"type": "integer",
"minimum": 0,
- "maximum": 53687091200,
+ "maximum": 536870912000,
"format": "int64"
},
"features": {
@@ -13648,6 +16071,15 @@
}
},
"required": ["enabled"]
+ },
+ "icebergCatalog": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": ["enabled"]
}
},
"required": ["imageTransformation", "s3Protocol"]
@@ -13717,6 +16149,10 @@
"minimum": 0,
"maximum": 262143
},
+ "session_replication_role": {
+ "type": "string",
+ "enum": ["origin", "replica", "local"]
+ },
"shared_buffers": {
"type": "string"
},
@@ -13734,10 +16170,6 @@
},
"work_mem": {
"type": "string"
- },
- "session_replication_role": {
- "enum": ["origin", "replica", "local"],
- "type": "string"
}
}
},
@@ -13804,6 +16236,10 @@
"minimum": 0,
"maximum": 262143
},
+ "session_replication_role": {
+ "type": "string",
+ "enum": ["origin", "replica", "local"]
+ },
"shared_buffers": {
"type": "string"
},
@@ -13824,47 +16260,72 @@
},
"restart_database": {
"type": "boolean"
- },
- "session_replication_role": {
- "enum": ["origin", "replica", "local"],
- "type": "string"
}
}
},
"V1PgbouncerConfigResponse": {
"type": "object",
"properties": {
- "pool_mode": {
- "type": "string",
- "enum": ["transaction", "session", "statement"]
- },
"default_pool_size": {
- "type": "number"
+ "type": "integer"
},
"ignore_startup_parameters": {
"type": "string"
},
"max_client_conn": {
- "type": "number"
+ "type": "integer"
+ },
+ "pool_mode": {
+ "type": "string",
+ "enum": ["transaction", "session", "statement"]
},
"connection_string": {
"type": "string"
+ },
+ "server_idle_timeout": {
+ "type": "integer"
+ },
+ "server_lifetime": {
+ "type": "integer"
+ },
+ "query_wait_timeout": {
+ "type": "integer"
+ },
+ "reserve_pool_size": {
+ "type": "integer"
}
}
},
"SupavisorConfigResponse": {
"type": "object",
"properties": {
+ "identifier": {
+ "type": "string"
+ },
"database_type": {
"type": "string",
"enum": ["PRIMARY", "READ_REPLICA"]
},
+ "is_using_scram_auth": {
+ "type": "boolean"
+ },
+ "db_user": {
+ "type": "string"
+ },
+ "db_host": {
+ "type": "string"
+ },
"db_port": {
"type": "integer"
},
+ "db_name": {
+ "type": "string"
+ },
+ "connection_string": {
+ "type": "string"
+ },
"connectionString": {
"type": "string",
- "deprecated": true,
"description": "Use connection_string instead"
},
"default_pool_size": {
@@ -13876,41 +16337,23 @@
"nullable": true
},
"pool_mode": {
- "enum": ["transaction", "session"],
- "type": "string"
- },
- "identifier": {
- "type": "string"
- },
- "is_using_scram_auth": {
- "type": "boolean"
- },
- "db_user": {
- "type": "string"
- },
- "db_host": {
- "type": "string"
- },
- "db_name": {
- "type": "string"
- },
- "connection_string": {
- "type": "string"
+ "type": "string",
+ "enum": ["transaction", "session"]
}
},
"required": [
- "database_type",
- "db_port",
- "connectionString",
- "default_pool_size",
- "max_client_conn",
- "pool_mode",
"identifier",
+ "database_type",
"is_using_scram_auth",
"db_user",
"db_host",
+ "db_port",
"db_name",
- "connection_string"
+ "connection_string",
+ "connectionString",
+ "default_pool_size",
+ "max_client_conn",
+ "pool_mode"
]
},
"UpdateSupavisorConfigBody": {
@@ -13918,15 +16361,14 @@
"properties": {
"default_pool_size": {
"type": "integer",
- "nullable": true,
"minimum": 0,
- "maximum": 1000
+ "maximum": 3000,
+ "nullable": true
},
"pool_mode": {
- "enum": ["transaction", "session"],
"type": "string",
- "description": "Dedicated pooler mode for the project",
- "deprecated": true
+ "enum": ["transaction", "session"],
+ "description": "Dedicated pooler mode for the project"
}
}
},
@@ -13954,83 +16396,6 @@
"type": "integer",
"nullable": true
},
- "jwt_exp": {
- "type": "integer",
- "nullable": true
- },
- "mailer_otp_exp": {
- "type": "integer"
- },
- "mailer_otp_length": {
- "type": "integer",
- "nullable": true
- },
- "mfa_max_enrolled_factors": {
- "type": "integer",
- "nullable": true
- },
- "mfa_phone_otp_length": {
- "type": "integer"
- },
- "mfa_phone_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "password_min_length": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_anonymous_users": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_email_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_sms_sent": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_token_refresh": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_verify": {
- "type": "integer",
- "nullable": true
- },
- "rate_limit_otp": {
- "type": "integer",
- "nullable": true
- },
- "security_refresh_token_reuse_interval": {
- "type": "integer",
- "nullable": true
- },
- "sessions_inactivity_timeout": {
- "type": "integer",
- "nullable": true
- },
- "sessions_timebox": {
- "type": "integer",
- "nullable": true
- },
- "sms_max_frequency": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_exp": {
- "type": "integer",
- "nullable": true
- },
- "sms_otp_length": {
- "type": "integer"
- },
- "smtp_max_frequency": {
- "type": "integer",
- "nullable": true
- },
"disable_signup": {
"type": "boolean",
"nullable": true
@@ -14303,6 +16668,10 @@
"type": "string",
"nullable": true
},
+ "external_web3_solana_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
"external_zoom_client_id": {
"type": "string",
"nullable": true
@@ -14375,6 +16744,22 @@
"type": "string",
"nullable": true
},
+ "hook_before_user_created_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_before_user_created_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "jwt_exp": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_allow_unverified_email_sign_ins": {
"type": "boolean",
"nullable": true
@@ -14383,6 +16768,13 @@
"type": "boolean",
"nullable": true
},
+ "mailer_otp_exp": {
+ "type": "integer"
+ },
+ "mailer_otp_length": {
+ "type": "integer",
+ "nullable": true
+ },
"mailer_secure_email_change_enabled": {
"type": "boolean",
"nullable": true
@@ -14435,6 +16827,10 @@
"type": "string",
"nullable": true
},
+ "mfa_max_enrolled_factors": {
+ "type": "integer",
+ "nullable": true
+ },
"mfa_totp_enroll_enabled": {
"type": "boolean",
"nullable": true
@@ -14459,16 +16855,61 @@
"type": "boolean",
"nullable": true
},
+ "mfa_phone_otp_length": {
+ "type": "integer"
+ },
"mfa_phone_template": {
"type": "string",
"nullable": true
},
+ "mfa_phone_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"password_hibp_enabled": {
"type": "boolean",
"nullable": true
},
+ "password_min_length": {
+ "type": "integer",
+ "nullable": true
+ },
"password_required_characters": {
"type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "rate_limit_anonymous_users": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_email_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_sms_sent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_token_refresh": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_verify": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_otp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
"nullable": true
},
"refresh_token_rotation_enabled": {
@@ -14493,6 +16934,7 @@
},
"security_captcha_provider": {
"type": "string",
+ "enum": ["turnstile", "hcaptcha"],
"nullable": true
},
"security_captcha_secret": {
@@ -14503,10 +16945,18 @@
"type": "boolean",
"nullable": true
},
+ "security_refresh_token_reuse_interval": {
+ "type": "integer",
+ "nullable": true
+ },
"security_update_password_require_reauthentication": {
"type": "boolean",
"nullable": true
},
+ "sessions_inactivity_timeout": {
+ "type": "integer",
+ "nullable": true
+ },
"sessions_single_per_user": {
"type": "boolean",
"nullable": true
@@ -14515,6 +16965,10 @@
"type": "string",
"nullable": true
},
+ "sessions_timebox": {
+ "type": "integer",
+ "nullable": true
+ },
"site_url": {
"type": "string",
"nullable": true
@@ -14523,6 +16977,10 @@
"type": "boolean",
"nullable": true
},
+ "sms_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"sms_messagebird_access_key": {
"type": "string",
"nullable": true
@@ -14531,8 +16989,16 @@
"type": "string",
"nullable": true
},
+ "sms_otp_exp": {
+ "type": "integer",
+ "nullable": true
+ },
+ "sms_otp_length": {
+ "type": "integer"
+ },
"sms_provider": {
"type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
"nullable": true
},
"sms_template": {
@@ -14545,6 +17011,7 @@
},
"sms_test_otp_valid_until": {
"type": "string",
+ "format": "date-time",
"nullable": true
},
"sms_textlocal_api_key": {
@@ -14597,12 +17064,17 @@
},
"smtp_admin_email": {
"type": "string",
+ "format": "email",
"nullable": true
},
"smtp_host": {
"type": "string",
"nullable": true
},
+ "smtp_max_frequency": {
+ "type": "integer",
+ "nullable": true
+ },
"smtp_pass": {
"type": "string",
"nullable": true
@@ -14627,26 +17099,6 @@
"required": [
"api_max_request_duration",
"db_max_pool_size",
- "jwt_exp",
- "mailer_otp_exp",
- "mailer_otp_length",
- "mfa_max_enrolled_factors",
- "mfa_phone_otp_length",
- "mfa_phone_max_frequency",
- "password_min_length",
- "rate_limit_anonymous_users",
- "rate_limit_email_sent",
- "rate_limit_sms_sent",
- "rate_limit_token_refresh",
- "rate_limit_verify",
- "rate_limit_otp",
- "security_refresh_token_reuse_interval",
- "sessions_inactivity_timeout",
- "sessions_timebox",
- "sms_max_frequency",
- "sms_otp_exp",
- "sms_otp_length",
- "smtp_max_frequency",
"disable_signup",
"external_anonymous_users_enabled",
"external_apple_additional_client_ids",
@@ -14715,6 +17167,7 @@
"external_workos_enabled",
"external_workos_secret",
"external_workos_url",
+ "external_web3_solana_enabled",
"external_zoom_client_id",
"external_zoom_enabled",
"external_zoom_secret",
@@ -14733,8 +17186,14 @@
"hook_send_email_enabled",
"hook_send_email_uri",
"hook_send_email_secrets",
+ "hook_before_user_created_enabled",
+ "hook_before_user_created_uri",
+ "hook_before_user_created_secrets",
+ "jwt_exp",
"mailer_allow_unverified_email_sign_ins",
"mailer_autoconfirm",
+ "mailer_otp_exp",
+ "mailer_otp_length",
"mailer_secure_email_change_enabled",
"mailer_subjects_confirmation",
"mailer_subjects_email_change",
@@ -14748,15 +17207,26 @@
"mailer_templates_magic_link_content",
"mailer_templates_reauthentication_content",
"mailer_templates_recovery_content",
+ "mfa_max_enrolled_factors",
"mfa_totp_enroll_enabled",
"mfa_totp_verify_enabled",
"mfa_phone_enroll_enabled",
"mfa_phone_verify_enabled",
"mfa_web_authn_enroll_enabled",
"mfa_web_authn_verify_enabled",
+ "mfa_phone_otp_length",
"mfa_phone_template",
+ "mfa_phone_max_frequency",
"password_hibp_enabled",
+ "password_min_length",
"password_required_characters",
+ "rate_limit_anonymous_users",
+ "rate_limit_email_sent",
+ "rate_limit_sms_sent",
+ "rate_limit_token_refresh",
+ "rate_limit_verify",
+ "rate_limit_otp",
+ "rate_limit_web3",
"refresh_token_rotation_enabled",
"saml_enabled",
"saml_external_url",
@@ -14765,13 +17235,19 @@
"security_captcha_provider",
"security_captcha_secret",
"security_manual_linking_enabled",
+ "security_refresh_token_reuse_interval",
"security_update_password_require_reauthentication",
+ "sessions_inactivity_timeout",
"sessions_single_per_user",
"sessions_tags",
+ "sessions_timebox",
"site_url",
"sms_autoconfirm",
+ "sms_max_frequency",
"sms_messagebird_access_key",
"sms_messagebird_originator",
+ "sms_otp_exp",
+ "sms_otp_length",
"sms_provider",
"sms_template",
"sms_test_otp",
@@ -14790,6 +17266,7 @@
"sms_vonage_from",
"smtp_admin_email",
"smtp_host",
+ "smtp_max_frequency",
"smtp_pass",
"smtp_port",
"smtp_sender_name",
@@ -14800,68 +17277,254 @@
"UpdateAuthConfigBody": {
"type": "object",
"properties": {
+ "site_url": {
+ "type": "string",
+ "pattern": "^[^,]+$",
+ "nullable": true
+ },
+ "disable_signup": {
+ "type": "boolean",
+ "nullable": true
+ },
"jwt_exp": {
"type": "integer",
"minimum": 0,
- "maximum": 604800
+ "maximum": 604800,
+ "nullable": true
+ },
+ "smtp_admin_email": {
+ "type": "string",
+ "format": "email",
+ "nullable": true
+ },
+ "smtp_host": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_port": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_user": {
+ "type": "string",
+ "nullable": true
+ },
+ "smtp_pass": {
+ "type": "string",
+ "nullable": true
},
"smtp_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
+ },
+ "smtp_sender_name": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_allow_unverified_email_sign_ins": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mailer_autoconfirm": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mailer_subjects_invite": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_confirmation": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_recovery": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_email_change": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_magic_link": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_subjects_reauthentication": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_invite_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_confirmation_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_recovery_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_email_change_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_magic_link_content": {
+ "type": "string",
+ "nullable": true
+ },
+ "mailer_templates_reauthentication_content": {
+ "type": "string",
+ "nullable": true
},
"mfa_max_enrolled_factors": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "uri_allow_list": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_anonymous_users_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_email_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_phone_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "saml_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "saml_external_url": {
+ "type": "string",
+ "pattern": "^[^,]+$",
+ "nullable": true
+ },
+ "security_captcha_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "security_captcha_provider": {
+ "type": "string",
+ "enum": ["turnstile", "hcaptcha"],
+ "nullable": true
+ },
+ "security_captcha_secret": {
+ "type": "string",
+ "nullable": true
},
"sessions_timebox": {
"type": "integer",
- "minimum": 0
+ "minimum": 0,
+ "nullable": true
},
"sessions_inactivity_timeout": {
"type": "integer",
- "minimum": 0
+ "minimum": 0,
+ "nullable": true
+ },
+ "sessions_single_per_user": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "sessions_tags": {
+ "type": "string",
+ "pattern": "^\\s*([a-zA-Z0-9_-]+(\\s*,+\\s*)?)*\\s*$",
+ "nullable": true
},
"rate_limit_anonymous_users": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_email_sent": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_sms_sent": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_verify": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_token_refresh": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"rate_limit_otp": {
"type": "integer",
"minimum": 1,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "rate_limit_web3": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 2147483647,
+ "nullable": true
+ },
+ "mailer_secure_email_change_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "refresh_token_rotation_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "password_hibp_enabled": {
+ "type": "boolean",
+ "nullable": true
},
"password_min_length": {
"type": "integer",
"minimum": 6,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
+ },
+ "password_required_characters": {
+ "type": "string",
+ "enum": [
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
+ "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
+ ""
+ ],
+ "nullable": true
+ },
+ "security_manual_linking_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "security_update_password_require_reauthentication": {
+ "type": "boolean",
+ "nullable": true
},
"security_refresh_token_reuse_interval": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"mailer_otp_exp": {
"type": "integer",
@@ -14871,489 +17534,496 @@
"mailer_otp_length": {
"type": "integer",
"minimum": 6,
- "maximum": 10
+ "maximum": 10,
+ "nullable": true
+ },
+ "sms_autoconfirm": {
+ "type": "boolean",
+ "nullable": true
},
"sms_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
},
"sms_otp_exp": {
"type": "integer",
"minimum": 0,
- "maximum": 2147483647
+ "maximum": 2147483647,
+ "nullable": true
},
"sms_otp_length": {
"type": "integer",
"minimum": 0,
"maximum": 32767
},
+ "sms_provider": {
+ "type": "string",
+ "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"],
+ "nullable": true
+ },
+ "sms_messagebird_access_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_messagebird_originator": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_test_otp": {
+ "type": "string",
+ "pattern": "^([0-9]{1,15}=[0-9]+,?)*$",
+ "nullable": true
+ },
+ "sms_test_otp_valid_until": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "sms_textlocal_api_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_textlocal_sender": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_account_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_auth_token": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_content_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_message_service_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_account_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_auth_token": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_twilio_verify_message_service_sid": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_api_key": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_api_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_vonage_from": {
+ "type": "string",
+ "nullable": true
+ },
+ "sms_template": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_mfa_verification_attempt_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_password_verification_attempt_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_custom_access_token_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_custom_access_token_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_custom_access_token_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_sms_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_send_sms_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_sms_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_email_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_send_email_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_send_email_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "hook_before_user_created_uri": {
+ "type": "string",
+ "nullable": true
+ },
+ "hook_before_user_created_secrets": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_apple_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_apple_additional_client_ids": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_azure_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_azure_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_bitbucket_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_bitbucket_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_bitbucket_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_discord_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_discord_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_discord_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_facebook_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_facebook_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_facebook_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_figma_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_figma_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_figma_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_github_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_github_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_github_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_gitlab_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_gitlab_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_google_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_additional_client_ids": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_google_skip_nonce_check": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_kakao_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_kakao_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_kakao_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_keycloak_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_keycloak_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_linkedin_oidc_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_linkedin_oidc_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_linkedin_oidc_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_oidc_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_slack_oidc_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_oidc_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_notion_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_notion_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_notion_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_slack_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_slack_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_spotify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_spotify_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_spotify_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitch_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_twitch_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitch_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitter_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_twitter_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_twitter_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_workos_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_secret": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_workos_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_web3_solana_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_zoom_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "external_zoom_client_id": {
+ "type": "string",
+ "nullable": true
+ },
+ "external_zoom_secret": {
+ "type": "string",
+ "nullable": true
+ },
"db_max_pool_size": {
- "type": "integer"
+ "type": "integer",
+ "nullable": true
},
"api_max_request_duration": {
- "type": "integer"
+ "type": "integer",
+ "nullable": true
+ },
+ "mfa_totp_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_totp_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_web_authn_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_web_authn_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_phone_enroll_enabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "mfa_phone_verify_enabled": {
+ "type": "boolean",
+ "nullable": true
},
"mfa_phone_max_frequency": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
+ "maximum": 32767,
+ "nullable": true
},
"mfa_phone_otp_length": {
"type": "integer",
"minimum": 0,
- "maximum": 32767
- },
- "site_url": {
- "type": "string",
- "pattern": "/^[^,]+$/"
- },
- "disable_signup": {
- "type": "boolean"
- },
- "smtp_admin_email": {
- "type": "string"
- },
- "smtp_host": {
- "type": "string"
- },
- "smtp_port": {
- "type": "string"
- },
- "smtp_user": {
- "type": "string"
- },
- "smtp_pass": {
- "type": "string"
- },
- "smtp_sender_name": {
- "type": "string"
- },
- "mailer_allow_unverified_email_sign_ins": {
- "type": "boolean"
- },
- "mailer_autoconfirm": {
- "type": "boolean"
- },
- "mailer_subjects_invite": {
- "type": "string"
- },
- "mailer_subjects_confirmation": {
- "type": "string"
- },
- "mailer_subjects_recovery": {
- "type": "string"
- },
- "mailer_subjects_email_change": {
- "type": "string"
- },
- "mailer_subjects_magic_link": {
- "type": "string"
- },
- "mailer_subjects_reauthentication": {
- "type": "string"
- },
- "mailer_templates_invite_content": {
- "type": "string"
- },
- "mailer_templates_confirmation_content": {
- "type": "string"
- },
- "mailer_templates_recovery_content": {
- "type": "string"
- },
- "mailer_templates_email_change_content": {
- "type": "string"
- },
- "mailer_templates_magic_link_content": {
- "type": "string"
- },
- "mailer_templates_reauthentication_content": {
- "type": "string"
- },
- "uri_allow_list": {
- "type": "string"
- },
- "external_anonymous_users_enabled": {
- "type": "boolean"
- },
- "external_email_enabled": {
- "type": "boolean"
- },
- "external_phone_enabled": {
- "type": "boolean"
- },
- "saml_enabled": {
- "type": "boolean"
- },
- "saml_external_url": {
- "type": "string",
- "pattern": "/^[^,]+$/"
- },
- "security_captcha_enabled": {
- "type": "boolean"
- },
- "security_captcha_provider": {
- "type": "string"
- },
- "security_captcha_secret": {
- "type": "string"
- },
- "sessions_single_per_user": {
- "type": "boolean"
- },
- "sessions_tags": {
- "type": "string",
- "pattern": "/^\\s*([a-z0-9_-]+(\\s*,+\\s*)?)*\\s*$/i"
- },
- "mailer_secure_email_change_enabled": {
- "type": "boolean"
- },
- "refresh_token_rotation_enabled": {
- "type": "boolean"
- },
- "password_hibp_enabled": {
- "type": "boolean"
- },
- "password_required_characters": {
- "type": "string",
- "enum": [
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
- "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789",
- "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~",
- ""
- ]
- },
- "security_manual_linking_enabled": {
- "type": "boolean"
- },
- "security_update_password_require_reauthentication": {
- "type": "boolean"
- },
- "sms_autoconfirm": {
- "type": "boolean"
- },
- "sms_provider": {
- "type": "string"
- },
- "sms_messagebird_access_key": {
- "type": "string"
- },
- "sms_messagebird_originator": {
- "type": "string"
- },
- "sms_test_otp": {
- "type": "string",
- "pattern": "/^([0-9]{1,15}=[0-9]+,?)*$/"
- },
- "sms_test_otp_valid_until": {
- "type": "string"
- },
- "sms_textlocal_api_key": {
- "type": "string"
- },
- "sms_textlocal_sender": {
- "type": "string"
- },
- "sms_twilio_account_sid": {
- "type": "string"
- },
- "sms_twilio_auth_token": {
- "type": "string"
- },
- "sms_twilio_content_sid": {
- "type": "string"
- },
- "sms_twilio_message_service_sid": {
- "type": "string"
- },
- "sms_twilio_verify_account_sid": {
- "type": "string"
- },
- "sms_twilio_verify_auth_token": {
- "type": "string"
- },
- "sms_twilio_verify_message_service_sid": {
- "type": "string"
- },
- "sms_vonage_api_key": {
- "type": "string"
- },
- "sms_vonage_api_secret": {
- "type": "string"
- },
- "sms_vonage_from": {
- "type": "string"
- },
- "sms_template": {
- "type": "string"
- },
- "hook_mfa_verification_attempt_enabled": {
- "type": "boolean"
- },
- "hook_mfa_verification_attempt_uri": {
- "type": "string"
- },
- "hook_mfa_verification_attempt_secrets": {
- "type": "string"
- },
- "hook_password_verification_attempt_enabled": {
- "type": "boolean"
- },
- "hook_password_verification_attempt_uri": {
- "type": "string"
- },
- "hook_password_verification_attempt_secrets": {
- "type": "string"
- },
- "hook_custom_access_token_enabled": {
- "type": "boolean"
- },
- "hook_custom_access_token_uri": {
- "type": "string"
- },
- "hook_custom_access_token_secrets": {
- "type": "string"
- },
- "hook_send_sms_enabled": {
- "type": "boolean"
- },
- "hook_send_sms_uri": {
- "type": "string"
- },
- "hook_send_sms_secrets": {
- "type": "string"
- },
- "hook_send_email_enabled": {
- "type": "boolean"
- },
- "hook_send_email_uri": {
- "type": "string"
- },
- "hook_send_email_secrets": {
- "type": "string"
- },
- "external_apple_enabled": {
- "type": "boolean"
- },
- "external_apple_client_id": {
- "type": "string"
- },
- "external_apple_secret": {
- "type": "string"
- },
- "external_apple_additional_client_ids": {
- "type": "string"
- },
- "external_azure_enabled": {
- "type": "boolean"
- },
- "external_azure_client_id": {
- "type": "string"
- },
- "external_azure_secret": {
- "type": "string"
- },
- "external_azure_url": {
- "type": "string"
- },
- "external_bitbucket_enabled": {
- "type": "boolean"
- },
- "external_bitbucket_client_id": {
- "type": "string"
- },
- "external_bitbucket_secret": {
- "type": "string"
- },
- "external_discord_enabled": {
- "type": "boolean"
- },
- "external_discord_client_id": {
- "type": "string"
- },
- "external_discord_secret": {
- "type": "string"
- },
- "external_facebook_enabled": {
- "type": "boolean"
- },
- "external_facebook_client_id": {
- "type": "string"
- },
- "external_facebook_secret": {
- "type": "string"
- },
- "external_figma_enabled": {
- "type": "boolean"
- },
- "external_figma_client_id": {
- "type": "string"
- },
- "external_figma_secret": {
- "type": "string"
- },
- "external_github_enabled": {
- "type": "boolean"
- },
- "external_github_client_id": {
- "type": "string"
- },
- "external_github_secret": {
- "type": "string"
- },
- "external_gitlab_enabled": {
- "type": "boolean"
- },
- "external_gitlab_client_id": {
- "type": "string"
- },
- "external_gitlab_secret": {
- "type": "string"
- },
- "external_gitlab_url": {
- "type": "string"
- },
- "external_google_enabled": {
- "type": "boolean"
- },
- "external_google_client_id": {
- "type": "string"
- },
- "external_google_secret": {
- "type": "string"
- },
- "external_google_additional_client_ids": {
- "type": "string"
- },
- "external_google_skip_nonce_check": {
- "type": "boolean"
- },
- "external_kakao_enabled": {
- "type": "boolean"
- },
- "external_kakao_client_id": {
- "type": "string"
- },
- "external_kakao_secret": {
- "type": "string"
- },
- "external_keycloak_enabled": {
- "type": "boolean"
- },
- "external_keycloak_client_id": {
- "type": "string"
- },
- "external_keycloak_secret": {
- "type": "string"
- },
- "external_keycloak_url": {
- "type": "string"
- },
- "external_linkedin_oidc_enabled": {
- "type": "boolean"
- },
- "external_linkedin_oidc_client_id": {
- "type": "string"
- },
- "external_linkedin_oidc_secret": {
- "type": "string"
- },
- "external_slack_oidc_enabled": {
- "type": "boolean"
- },
- "external_slack_oidc_client_id": {
- "type": "string"
- },
- "external_slack_oidc_secret": {
- "type": "string"
- },
- "external_notion_enabled": {
- "type": "boolean"
- },
- "external_notion_client_id": {
- "type": "string"
- },
- "external_notion_secret": {
- "type": "string"
- },
- "external_slack_enabled": {
- "type": "boolean"
- },
- "external_slack_client_id": {
- "type": "string"
- },
- "external_slack_secret": {
- "type": "string"
- },
- "external_spotify_enabled": {
- "type": "boolean"
- },
- "external_spotify_client_id": {
- "type": "string"
- },
- "external_spotify_secret": {
- "type": "string"
- },
- "external_twitch_enabled": {
- "type": "boolean"
- },
- "external_twitch_client_id": {
- "type": "string"
- },
- "external_twitch_secret": {
- "type": "string"
- },
- "external_twitter_enabled": {
- "type": "boolean"
- },
- "external_twitter_client_id": {
- "type": "string"
- },
- "external_twitter_secret": {
- "type": "string"
- },
- "external_workos_enabled": {
- "type": "boolean"
- },
- "external_workos_client_id": {
- "type": "string"
- },
- "external_workos_secret": {
- "type": "string"
- },
- "external_workos_url": {
- "type": "string"
- },
- "external_zoom_enabled": {
- "type": "boolean"
- },
- "external_zoom_client_id": {
- "type": "string"
- },
- "external_zoom_secret": {
- "type": "string"
- },
- "mfa_totp_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_totp_verify_enabled": {
- "type": "boolean"
- },
- "mfa_web_authn_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_web_authn_verify_enabled": {
- "type": "boolean"
- },
- "mfa_phone_enroll_enabled": {
- "type": "boolean"
- },
- "mfa_phone_verify_enabled": {
- "type": "boolean"
+ "maximum": 32767,
+ "nullable": true
},
"mfa_phone_template": {
- "type": "string"
+ "type": "string",
+ "nullable": true
}
}
},
@@ -15366,16 +18036,15 @@
"jwks_url": {
"type": "string"
},
- "custom_jwks": {
- "type": "object"
- }
+ "custom_jwks": {}
}
},
"ThirdPartyAuth": {
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "format": "uuid"
},
"type": {
"type": "string"
@@ -15389,11 +18058,9 @@
"nullable": true
},
"custom_jwks": {
- "type": "object",
"nullable": true
},
"resolved_jwks": {
- "type": "object",
"nullable": true
},
"inserted_at": {
@@ -15409,23 +18076,6 @@
},
"required": ["id", "type", "inserted_at", "updated_at"]
},
- "ProjectAvailableRestoreVersion": {
- "type": "object",
- "properties": {
- "version": {
- "type": "string"
- },
- "release_channel": {
- "type": "string",
- "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
- },
- "postgres_engine": {
- "type": "string",
- "enum": ["13", "14", "15", "17", "17-oriole"]
- }
- },
- "required": ["version", "release_channel", "postgres_engine"]
- },
"GetProjectAvailableRestoreVersionsResponse": {
"type": "object",
"properties": {
@@ -15452,12 +18102,7 @@
},
"required": ["available_versions"]
},
- "RestoreProjectBodyDto": {
- "type": "object",
- "properties": {},
- "hideDefinitions": ["release_channel", "postgres_engine"]
- },
- "ListProjectAddonsResponseDto": {
+ "ListProjectAddonsResponse": {
"type": "object",
"properties": {
"selected_addons": {
@@ -15494,7 +18139,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -15547,26 +18200,7 @@
"required": ["description", "type", "interval", "amount"]
},
"meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- {
- "type": "number"
- },
- {
- "type": "boolean"
- },
- {
- "type": "string"
- },
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- ]
- }
+ "description": "Any JSON-serializable value"
}
},
"required": ["id", "name", "price"]
@@ -15614,7 +18248,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -15667,26 +18309,7 @@
"required": ["description", "type", "interval", "amount"]
},
"meta": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- {
- "type": "number"
- },
- {
- "type": "boolean"
- },
- {
- "type": "string"
- },
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- ]
- }
+ "description": "Any JSON-serializable value"
}
},
"required": ["id", "name", "price"]
@@ -15699,7 +18322,7 @@
},
"required": ["selected_addons", "available_addons"]
},
- "ApplyProjectAddonBodyDto": {
+ "ApplyProjectAddonBody": {
"type": "object",
"properties": {
"addon_variant": {
@@ -15716,7 +18339,15 @@
"ci_4xlarge",
"ci_8xlarge",
"ci_12xlarge",
- "ci_16xlarge"
+ "ci_16xlarge",
+ "ci_24xlarge",
+ "ci_24xlarge_optimized_cpu",
+ "ci_24xlarge_optimized_memory",
+ "ci_24xlarge_high_memory",
+ "ci_48xlarge",
+ "ci_48xlarge_optimized_cpu",
+ "ci_48xlarge_optimized_memory",
+ "ci_48xlarge_high_memory"
]
},
{
@@ -15748,12 +18379,176 @@
},
"required": ["addon_variant", "addon_type"]
},
- "V1AnalyticsResponse": {
+ "ProjectClaimTokenResponse": {
"type": "object",
"properties": {
+ "token_alias": {
+ "type": "string"
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ "required": ["token_alias", "expires_at", "created_at", "created_by"]
+ },
+ "CreateProjectClaimTokenResponse": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "type": "string"
+ },
+ "token_alias": {
+ "type": "string"
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ "required": ["token", "token_alias", "expires_at", "created_at", "created_by"]
+ },
+ "V1ProjectAdvisorsResponse": {
+ "type": "object",
+ "properties": {
+ "lints": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "enum": [
+ "unindexed_foreign_keys",
+ "auth_users_exposed",
+ "auth_rls_initplan",
+ "no_primary_key",
+ "unused_index",
+ "multiple_permissive_policies",
+ "policy_exists_rls_disabled",
+ "rls_enabled_no_policy",
+ "duplicate_index",
+ "security_definer_view",
+ "function_search_path_mutable",
+ "rls_disabled_in_public",
+ "extension_in_public",
+ "rls_references_user_metadata",
+ "materialized_view_in_api",
+ "foreign_table_in_api",
+ "unsupported_reg_types",
+ "auth_otp_long_expiry",
+ "auth_otp_short_length",
+ "ssl_not_enforced",
+ "network_restrictions_not_set",
+ "password_requirements_min_length",
+ "pitr_not_enabled",
+ "auth_leaked_password_protection",
+ "auth_insufficient_mfa_options",
+ "auth_password_policy_missing",
+ "leaked_service_key",
+ "no_backup_admin"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "level": {
+ "type": "string",
+ "enum": ["ERROR", "WARN", "INFO"]
+ },
+ "facing": {
+ "type": "string",
+ "enum": ["EXTERNAL"]
+ },
+ "categories": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": ["PERFORMANCE", "SECURITY"]
+ }
+ },
+ "description": {
+ "type": "string"
+ },
+ "detail": {
+ "type": "string"
+ },
+ "remediation": {
+ "type": "string"
+ },
+ "metadata": {
+ "type": "object",
+ "properties": {
+ "schema": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "entity": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "enum": ["table", "view", "auth", "function", "extension", "compliance"]
+ },
+ "fkey_name": {
+ "type": "string"
+ },
+ "fkey_columns": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ }
+ }
+ },
+ "cache_key": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "title",
+ "level",
+ "facing",
+ "categories",
+ "description",
+ "detail",
+ "remediation",
+ "cache_key"
+ ]
+ }
+ }
+ },
+ "required": ["lints"]
+ },
+ "AnalyticsResponse": {
+ "type": "object",
+ "properties": {
+ "result": {
+ "type": "array",
+ "items": {}
+ },
"error": {
"oneOf": [
{
+ "type": "string"
+ },
+ {
+ "type": "object",
"properties": {
"code": {
"type": "number"
@@ -15761,6 +18556,7 @@
"errors": {
"type": "array",
"items": {
+ "type": "object",
"properties": {
"domain": {
"type": "string"
@@ -15777,7 +18573,8 @@
"reason": {
"type": "string"
}
- }
+ },
+ "required": ["domain", "location", "locationType", "message", "reason"]
}
},
"message": {
@@ -15786,18 +18583,10 @@
"status": {
"type": "string"
}
- }
- },
- {
- "type": "string"
+ },
+ "required": ["code", "errors", "message", "status"]
}
]
- },
- "result": {
- "type": "array",
- "items": {
- "type": "object"
- }
}
}
},
@@ -15817,17 +18606,46 @@
"required": ["version"]
}
},
+ "V1CreateMigrationBody": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["query"]
+ },
+ "V1UpsertMigrationBody": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["query"]
+ },
"V1RunQueryBody": {
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1
+ },
+ "read_only": {
+ "type": "boolean"
}
},
"required": ["query"]
},
- "GetProjectDbMetadataResponseDto": {
+ "GetProjectDbMetadataResponse": {
"type": "object",
"properties": {
"databases": {
@@ -15879,10 +18697,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -15895,6 +18715,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
@@ -15919,42 +18742,49 @@
"required": ["slug", "name", "body"]
},
"BulkUpdateFunctionBody": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[A-Za-z0-9_-]+$"
+ },
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["ACTIVE", "REMOVED", "THROTTLED"]
+ },
+ "version": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "verify_jwt": {
+ "type": "boolean"
+ },
+ "import_map": {
+ "type": "boolean"
+ },
+ "entrypoint_path": {
+ "type": "string"
+ },
+ "import_map_path": {
+ "type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
+ }
},
- "slug": {
- "type": "string",
- "pattern": "^[A-Za-z0-9_-]+$"
- },
- "name": {
- "type": "string"
- },
- "status": {
- "type": "string",
- "enum": ["ACTIVE", "REMOVED", "THROTTLED"]
- },
- "version": {
- "type": "integer"
- },
- "created_at": {
- "type": "integer"
- },
- "verify_jwt": {
- "type": "boolean"
- },
- "import_map": {
- "type": "boolean"
- },
- "entrypoint_path": {
- "type": "string"
- },
- "import_map_path": {
- "type": "string"
- }
- },
- "required": ["id", "slug", "name", "status", "version"]
+ "required": ["id", "slug", "name", "status", "version"]
+ }
},
"BulkUpdateFunctionResponse": {
"type": "object",
@@ -15981,10 +18811,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -15997,6 +18829,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
@@ -16062,10 +18897,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -16078,6 +18915,9 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version"]
@@ -16102,10 +18942,12 @@
"type": "integer"
},
"created_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"updated_at": {
- "type": "integer"
+ "type": "integer",
+ "format": "int64"
},
"verify_jwt": {
"type": "boolean"
@@ -16118,10 +18960,17 @@
},
"import_map_path": {
"type": "string"
+ },
+ "ezbr_sha256": {
+ "type": "string"
}
},
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
},
+ "StreamableFile": {
+ "type": "object",
+ "properties": {}
+ },
"V1UpdateFunctionBody": {
"type": "object",
"properties": {
@@ -16160,81 +19009,6 @@
},
"required": ["id", "name", "owner", "created_at", "updated_at", "public"]
},
- "AttributeValue": {
- "type": "object",
- "properties": {
- "default": {
- "oneOf": [
- {
- "type": "object"
- },
- {
- "type": "number"
- },
- {
- "type": "string"
- },
- {
- "type": "boolean"
- }
- ]
- },
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "array": {
- "type": "boolean"
- }
- }
- },
- "AttributeMapping": {
- "type": "object",
- "properties": {
- "keys": {
- "type": "object",
- "additionalProperties": {
- "type": "object",
- "properties": {
- "default": {
- "oneOf": [
- {
- "type": "object"
- },
- {
- "type": "number"
- },
- {
- "type": "string"
- },
- {
- "type": "boolean"
- }
- ]
- },
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "array": {
- "type": "boolean"
- }
- }
- }
- }
- },
- "required": ["keys"]
- },
"CreateProviderBody": {
"type": "object",
"properties": {
@@ -16263,10 +19037,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16279,15 +19063,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16300,84 +19075,6 @@
},
"required": ["type"]
},
- "SamlDescriptor": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "entity_id": {
- "type": "string"
- },
- "metadata_url": {
- "type": "string"
- },
- "metadata_xml": {
- "type": "string"
- },
- "attribute_mapping": {
- "type": "object",
- "properties": {
- "keys": {
- "type": "object",
- "additionalProperties": {
- "type": "object",
- "properties": {
- "default": {
- "oneOf": [
- {
- "type": "object"
- },
- {
- "type": "number"
- },
- {
- "type": "string"
- },
- {
- "type": "boolean"
- }
- ]
- },
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "array": {
- "type": "boolean"
- }
- }
- }
- }
- },
- "required": ["keys"]
- }
- },
- "required": ["id", "entity_id"]
- },
- "Domain": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "domain": {
- "type": "string"
- },
- "created_at": {
- "type": "string"
- },
- "updated_at": {
- "type": "string"
- }
- },
- "required": ["id"]
- },
"CreateProviderResponse": {
"type": "object",
"properties": {
@@ -16407,10 +19104,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16423,111 +19130,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "array": {
- "type": "boolean"
- }
- }
- }
- }
- },
- "required": ["keys"]
- }
- },
- "required": ["id", "entity_id"]
- },
- "domains": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "domain": {
- "type": "string"
- },
- "created_at": {
- "type": "string"
- },
- "updated_at": {
- "type": "string"
- }
- },
- "required": ["id"]
- }
- },
- "created_at": {
- "type": "string"
- },
- "updated_at": {
- "type": "string"
- }
- },
- "required": ["id"]
- },
- "Provider": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "saml": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "entity_id": {
- "type": "string"
- },
- "metadata_url": {
- "type": "string"
- },
- "metadata_xml": {
- "type": "string"
- },
- "attribute_mapping": {
- "type": "object",
- "properties": {
- "keys": {
- "type": "object",
- "additionalProperties": {
- "type": "object",
- "properties": {
- "default": {
- "oneOf": [
- {
- "type": "object"
- },
- {
- "type": "number"
- },
- {
- "type": "string"
- },
- {
- "type": "boolean"
- }
- ]
- },
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16604,10 +19206,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16620,15 +19232,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16704,10 +19307,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16720,15 +19333,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16794,10 +19398,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16810,15 +19424,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16859,10 +19464,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16875,15 +19490,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -16955,10 +19561,20 @@
"additionalProperties": {
"type": "object",
"properties": {
+ "name": {
+ "type": "string"
+ },
+ "names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"default": {
"oneOf": [
{
- "type": "object"
+ "type": "object",
+ "properties": {}
},
{
"type": "number"
@@ -16971,15 +19587,6 @@
}
]
},
- "name": {
- "type": "string"
- },
- "names": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"array": {
"type": "boolean"
}
@@ -17022,35 +19629,6 @@
},
"required": ["id"]
},
- "V1Backup": {
- "type": "object",
- "properties": {
- "status": {
- "type": "string",
- "enum": ["COMPLETED", "FAILED", "PENDING", "REMOVED", "ARCHIVED", "CANCELLED"]
- },
- "is_physical_backup": {
- "type": "boolean"
- },
- "inserted_at": {
- "type": "string"
- }
- },
- "required": ["status", "is_physical_backup", "inserted_at"]
- },
- "V1PhysicalBackup": {
- "type": "object",
- "properties": {
- "earliest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
- },
- "latest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
- }
- }
- },
"V1BackupsResponse": {
"type": "object",
"properties": {
@@ -17068,30 +19646,28 @@
"items": {
"type": "object",
"properties": {
+ "is_physical_backup": {
+ "type": "boolean"
+ },
"status": {
"type": "string",
"enum": ["COMPLETED", "FAILED", "PENDING", "REMOVED", "ARCHIVED", "CANCELLED"]
},
- "is_physical_backup": {
- "type": "boolean"
- },
"inserted_at": {
"type": "string"
}
},
- "required": ["status", "is_physical_backup", "inserted_at"]
+ "required": ["is_physical_backup", "status", "inserted_at"]
}
},
"physical_backup_data": {
"type": "object",
"properties": {
"earliest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
},
"latest_physical_backup_date_unix": {
- "type": "integer",
- "format": "int64"
+ "type": "integer"
}
}
}
@@ -17109,6 +19685,39 @@
},
"required": ["recovery_time_target_unix"]
},
+ "V1RestorePointPostBody": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 20
+ }
+ },
+ "required": ["name"]
+ },
+ "V1RestorePointResponse": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": ["AVAILABLE", "PENDING", "REMOVED"]
+ }
+ },
+ "required": ["name", "status"]
+ },
+ "V1UndoBody": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 20
+ }
+ },
+ "required": ["name"]
+ },
"V1OrganizationMemberResponse": {
"type": "object",
"properties": {
@@ -17130,17 +19739,15 @@
},
"required": ["user_id", "user_name", "role_name", "mfa_enabled"]
},
- "BillingPlanId": {
- "type": "string",
- "enum": ["free", "pro", "team", "enterprise"]
- },
- "ReleaseChannel": {
- "type": "string",
- "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
- },
"V1OrganizationSlugResponse": {
"type": "object",
"properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
"plan": {
"type": "string",
"enum": ["free", "pro", "team", "enterprise"]
@@ -17149,7 +19756,11 @@
"type": "array",
"items": {
"type": "string",
- "enum": ["AI_SQL_GENERATOR_OPT_IN"]
+ "enum": [
+ "AI_SQL_GENERATOR_OPT_IN",
+ "AI_DATA_GENERATOR_OPT_IN",
+ "AI_LOG_GENERATOR_OPT_IN"
+ ]
}
},
"allowed_release_channels": {
@@ -17158,15 +19769,133 @@
"type": "string",
"enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"]
}
- },
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
}
},
- "required": ["opt_in_tags", "allowed_release_channels", "id", "name"]
+ "required": ["id", "name", "opt_in_tags", "allowed_release_channels"]
+ },
+ "OrganizationProjectClaimResponse": {
+ "type": "object",
+ "properties": {
+ "project": {
+ "type": "object",
+ "properties": {
+ "ref": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": ["ref", "name"]
+ },
+ "preview": {
+ "type": "object",
+ "properties": {
+ "valid": {
+ "type": "boolean"
+ },
+ "warnings": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "info": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": ["key", "message"]
+ }
+ },
+ "members_exceeding_free_project_limit": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "limit": {
+ "type": "number"
+ }
+ },
+ "required": ["name", "limit"]
+ }
+ },
+ "target_organization_eligible": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "target_organization_has_free_project_slots": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "source_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"]
+ },
+ "target_subscription_plan": {
+ "type": "string",
+ "enum": ["free", "pro", "team", "enterprise"],
+ "nullable": true
+ }
+ },
+ "required": [
+ "valid",
+ "warnings",
+ "errors",
+ "info",
+ "members_exceeding_free_project_limit",
+ "target_organization_eligible",
+ "target_organization_has_free_project_slots",
+ "source_subscription_plan",
+ "target_subscription_plan"
+ ]
+ },
+ "expires_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "created_by": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ "required": ["project", "preview", "expires_at", "created_at", "created_by"]
}
}
}
diff --git a/apps/studio/components/grid/components/header/ExportDialog.tsx b/apps/studio/components/grid/components/header/ExportDialog.tsx
index 83d6f275d74..59ffe39bd9a 100644
--- a/apps/studio/components/grid/components/header/ExportDialog.tsx
+++ b/apps/studio/components/grid/components/header/ExportDialog.tsx
@@ -3,7 +3,6 @@ import { getConnectionStrings } from 'components/interfaces/Connect/DatabaseSett
import { useReadReplicasQuery } from 'data/read-replicas/replicas-query'
import { pluckObjectFields } from 'lib/helpers'
import { useState } from 'react'
-import { useTableEditorTableStateSnapshot } from 'state/table-editor-table'
import {
Button,
cn,
@@ -23,13 +22,14 @@ import {
import { Admonition } from 'ui-patterns'
interface ExportDialogProps {
+ table?: { name: string; schema: string }
open: boolean
onOpenChange: (open: boolean) => void
}
-export const ExportDialog = ({ open, onOpenChange }: ExportDialogProps) => {
+export const ExportDialog = ({ table, open, onOpenChange }: ExportDialogProps) => {
const { ref: projectRef } = useParams()
- const snap = useTableEditorTableStateSnapshot()
+
const [selectedTab, setSelectedTab] = useState('csv')
const { data: databases } = useReadReplicasQuery({ projectRef })
@@ -47,14 +47,14 @@ export const ExportDialog = ({ open, onOpenChange }: ExportDialogProps) => {
poolingInfo: { connectionString: '', db_host: '', db_name: '', db_port: 0, db_user: '' },
})
- const outputName = `${snap.table.name}_rows`
+ const outputName = `${table?.name}_rows`
const csvExportCommand = `
-${connectionStrings.direct.psql} -c "COPY (SELECT * FROM "${snap.table.schema}"."${snap.table.name}") TO STDOUT WITH CSV HEADER DELIMITER ',';" > ${outputName}.csv
+${connectionStrings.direct.psql} -c "COPY (SELECT * FROM "${table?.schema}"."${table?.name}") TO STDOUT WITH CSV HEADER DELIMITER ',';" > ${outputName}.csv
`.trim()
const sqlExportCommand = `
-pg_dump -h ${db_host} -p ${db_port} -d ${db_name} -U ${db_user} --table="${snap.table.schema}.${snap.table.name}" --data-only --column-inserts > ${outputName}.sql
+pg_dump -h ${db_host} -p ${db_port} -d ${db_name} -U ${db_user} --table="${table?.schema}.${table?.name}" --data-only --column-inserts > ${outputName}.sql
`.trim()
return (
diff --git a/apps/studio/components/grid/components/header/Header.tsx b/apps/studio/components/grid/components/header/Header.tsx
index 67d4d2886e8..baeeecc662f 100644
--- a/apps/studio/components/grid/components/header/Header.tsx
+++ b/apps/studio/components/grid/components/header/Header.tsx
@@ -17,7 +17,7 @@ import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query'
import { fetchAllTableRows, useTableRowsQuery } from 'data/table-rows/table-rows-query'
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
-import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
+import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { RoleImpersonationState } from 'lib/role-impersonation'
import {
useRoleImpersonationStateSnapshot,
@@ -80,10 +80,12 @@ export default Header
const DefaultHeader = () => {
const { ref: projectRef } = useParams()
- const tableEditorSnap = useTableEditorStateSnapshot()
+ const { data: org } = useSelectedOrganizationQuery()
+
const snap = useTableEditorTableStateSnapshot()
- const org = useSelectedOrganization()
+ const tableEditorSnap = useTableEditorStateSnapshot()
const canCreateColumns = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns')
+
const { mutate: sendEvent } = useSendEventMutation()
const onAddRow =
@@ -277,7 +279,7 @@ const RowHeader = () => {
})
}
- async function onRowsExportCSV() {
+ const onRowsExportCSV = async () => {
setIsExporting(true)
if (snap.allRowsSelected && totalRows > MAX_EXPORT_ROW_COUNT) {
@@ -349,7 +351,7 @@ const RowHeader = () => {
columns: snap.table!.columns.map((column) => column.name),
})
const csvData = new Blob([csv], { type: 'text/csv;charset=utf-8;' })
- toast.success(`Downloaded ${rows.length} rows to CSV`, {
+ toast.success(`Downloaded ${rows.length} rows as CSV`, {
id: toastId,
closeButton: true,
duration: 4000,
@@ -358,7 +360,7 @@ const RowHeader = () => {
setIsExporting(false)
}
- async function onRowsExportSQL() {
+ const onRowsExportSQL = async () => {
setIsExporting(true)
if (snap.allRowsSelected && totalRows > MAX_EXPORT_ROW_COUNT) {
@@ -423,7 +425,7 @@ const RowHeader = () => {
const sqlStatements = formatTableRowsToSQL(snap.table, rows)
const sqlData = new Blob([sqlStatements], { type: 'text/sql;charset=utf-8;' })
- toast.success(`Downloading ${rows.length} rows to SQL`, {
+ toast.success(`Downloading ${rows.length} rows as SQL`, {
id: toastId,
closeButton: true,
duration: 4000,
@@ -432,6 +434,27 @@ const RowHeader = () => {
setIsExporting(false)
}
+ const onRowsExportJSON = async () => {
+ if (!project) {
+ return toast.error('Project is required')
+ }
+
+ setIsExporting(true)
+ const toastId = toast.loading(
+ `Exporting ${snap.selectedRows.size} row${snap.selectedRows.size > 1 ? 's' : ''} from ${snap.table.name}`
+ )
+ const rows = allRows.filter((x) => snap.selectedRows.has(x.idx))
+ const sqlData = new Blob([JSON.stringify(rows)], { type: 'text/sql;charset=utf-8;' })
+ toast.success(`Downloading ${rows.length} rows as JSON`, {
+ id: toastId,
+ closeButton: true,
+ duration: 4000,
+ })
+ saveAs(sqlData, `${snap.table!.name}_rows.json`)
+
+ setIsExporting(false)
+ }
+
function deselectRows() {
snap.setSelectedRows(new Set())
}
@@ -486,13 +509,15 @@ const RowHeader = () => {
Export as SQL
{/* [Joshen] Should make this available for all cases, but that'll involve updating
the Dialog's SQL output to be dynamic based on any filters applied */}
- {snap.allRowsSelected && (
+ {snap.allRowsSelected ? (
setShowExportModal(true)}>
Export via CLI
Recommended for large tables
+ ) : (
+ Export as JSON
)}
@@ -509,7 +534,11 @@ const RowHeader = () => {
)}
- setShowExportModal(false)} />
+ setShowExportModal(false)}
+ />
>
)
}
diff --git a/apps/studio/components/interfaces/Account/NewAccessTokenButton.test.tsx b/apps/studio/components/interfaces/Account/NewAccessTokenButton.test.tsx
new file mode 100644
index 00000000000..18cadf221a2
--- /dev/null
+++ b/apps/studio/components/interfaces/Account/NewAccessTokenButton.test.tsx
@@ -0,0 +1,97 @@
+import { faker } from '@faker-js/faker'
+import { screen, waitFor } from '@testing-library/dom'
+import userEvent from '@testing-library/user-event'
+import { beforeEach, describe, expect, it, vi } from 'vitest'
+
+import { render } from 'tests/helpers'
+import { addAPIMock } from 'tests/lib/msw'
+import NewAccessTokenButton from './NewAccessTokenButton'
+
+describe(`NewAccessTokenButton`, () => {
+ beforeEach(() => {
+ addAPIMock({
+ method: `post`,
+ path: `/platform/profile/access-tokens`,
+ response: {
+ name: faker.lorem.word(),
+ scope: faker.helpers.arrayElement(['V0', undefined]),
+ created_at: faker.date.past().toISOString(),
+ id: faker.number.int(),
+ token_alias: faker.lorem.words(),
+ token: faker.lorem.words(),
+ },
+ })
+ })
+
+ it(`generates regular tokens`, async () => {
+ const onCreateToken = vi.fn()
+ render( )
+
+ const dialogTrigger = screen.getByRole(`button`, { name: `Generate new token` })
+ await userEvent.click(dialogTrigger)
+
+ const nameInput = screen.getByLabelText(`Name`)
+ await userEvent.type(nameInput, `test{enter}`)
+
+ await waitFor(() => expect(onCreateToken).toHaveBeenCalledTimes(1))
+ })
+
+ it(`generates experimental tokens`, async () => {
+ const onCreateToken = vi.fn()
+ render( )
+
+ const dropdownTrigger = screen.getByTitle(`Choose token scope`)
+ await userEvent.click(dropdownTrigger)
+
+ const experimentalMenuItem = await screen.findByRole(`menuitem`, {
+ name: `Generate token for experimental API`,
+ })
+ await userEvent.click(experimentalMenuItem)
+
+ await waitFor(async () => {
+ await expect(
+ screen.findByRole(`heading`, { name: `Generate token for experimental API` })
+ ).resolves.toBeInTheDocument()
+ await expect(screen.findByRole(`alert`)).resolves.toBeInTheDocument()
+ })
+
+ const nameInput = screen.getByLabelText(`Name`)
+ await userEvent.type(nameInput, `test{enter}`)
+
+ await waitFor(() => expect(onCreateToken).toHaveBeenCalledTimes(1))
+ })
+
+ it(`resets the form on close/cancel`, async () => {
+ render( )
+
+ // pass 1: open dialog and fill form
+ const dialogTrigger = screen.getByRole(`button`, { name: `Generate new token` })
+ await userEvent.click(dialogTrigger)
+
+ let nameInput = screen.getByLabelText(`Name`)
+ await userEvent.type(nameInput, `cancel button test`)
+ expect(nameInput).toHaveValue(`cancel button test`)
+
+ // reset the form by pressing the cancel button
+ const cancelButton = screen.getByRole(`button`, { name: `Cancel` })
+ await userEvent.click(cancelButton)
+
+ // pass 2: check that the form is reset, then fill it again
+ await userEvent.click(dialogTrigger)
+
+ nameInput = screen.getByLabelText(`Name`)
+ expect(nameInput).not.toHaveValue(`cancel button test`)
+
+ await userEvent.type(nameInput, `close modal test`)
+ expect(nameInput).toHaveValue(`close modal test`)
+
+ // reset the form by closing the dialog
+ await userEvent.keyboard(`{Escape}`)
+
+ // pass 3: check that the form has been rest again
+ await userEvent.click(dialogTrigger)
+
+ nameInput = screen.getByLabelText(`Name`)
+ expect(nameInput).not.toHaveValue(`close modal test`)
+ })
+})
diff --git a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx
index 360546f9f4a..17a976ac4c8 100644
--- a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx
+++ b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx
@@ -1,157 +1,187 @@
+import { zodResolver } from '@hookform/resolvers/zod'
import { ChevronDown, ExternalLink } from 'lucide-react'
import Link from 'next/link'
import { useState } from 'react'
+import { type SubmitHandler, useForm } from 'react-hook-form'
+import { toast } from 'sonner'
+import { z } from 'zod'
import { useAccessTokenCreateMutation } from 'data/access-tokens/access-tokens-create-mutation'
import {
Button,
+ Dialog,
+ DialogContent,
DialogFooter,
+ DialogHeader,
+ DialogSection,
+ DialogSectionSeparator,
+ DialogTitle,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
- Form,
- Input,
- Modal,
+ Form_Shadcn_,
+ FormControl_Shadcn_,
+ FormField_Shadcn_,
+ Input_Shadcn_,
} from 'ui'
import { Admonition } from 'ui-patterns'
+import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
export interface NewAccessTokenButtonProps {
onCreateToken: (token: any) => void
}
+const TokenSchema = z.object({
+ tokenName: z.string().min(1, 'Please enter a name for the token'),
+})
+
+const formId = 'new-access-token-form'
+
const NewAccessTokenButton = ({ onCreateToken }: NewAccessTokenButtonProps) => {
- const [isOpen, setIsOpen] = useState(false)
+ const [visible, setVisible] = useState(false)
const [tokenScope, setTokenScope] = useState<'V0' | undefined>(undefined)
- const validate = (values: any) => {
- const errors: any = {}
- if (!values.tokenName) errors.tokenName = 'Please enter a name for the token'
- return errors
- }
-
- const { mutate: createAccessToken, isLoading } = useAccessTokenCreateMutation({
- onSuccess: (res) => {
- onCreateToken(res)
- setIsOpen(false)
- },
+ const form = useForm>({
+ resolver: zodResolver(TokenSchema),
+ defaultValues: { tokenName: '' },
+ mode: 'onSubmit',
})
+ const { mutate: createAccessToken, isLoading } = useAccessTokenCreateMutation()
- const onFormSubmit = async (values: any) => {
- createAccessToken({ name: values.tokenName, scope: tokenScope })
+ const onSubmit: SubmitHandler> = async (values) => {
+ createAccessToken(
+ { name: values.tokenName, scope: tokenScope },
+ {
+ onSuccess: (data) => {
+ toast.success(`Your access token "${data.name}" is ready.`)
+ form.reset()
+ onCreateToken(data)
+ setVisible(false)
+ },
+ }
+ )
}
return (
<>
-
-
-
+
+
{
+ setTokenScope(undefined)
+ setVisible(true)
+ }}
+ >
+ Generate new token
+
+
+
}
+ />
+
+
+ {
- setTokenScope(undefined)
- setIsOpen(true)
+ setTokenScope('V0')
+ setVisible(true)
}}
>
- Generate new token
-
-
-
- }
- />
-
-
- {
- setTokenScope('V0')
- setIsOpen(true)
- }}
- >
-
-
Generate token for experimental API
-
-
-
-
-
-
+
+
Generate token for experimental API
+
+
+
+
-
setIsOpen(!isOpen)}
- header={
-
-
- {tokenScope === 'V0' ? 'Generate token for experimental API' : 'Generate New Token'}
-
-
- }
+ {
+ if (!open) form.reset()
+ setVisible(open)
+ }}
>
-
-
+
+
+
+
+ {
+ form.reset()
+ setVisible(false)
+ }}
+ >
+ Cancel
+
+
+ Generate token
+
+
+
+
>
)
}
diff --git a/apps/studio/components/interfaces/Auth/Policies/Policies.tsx b/apps/studio/components/interfaces/Auth/Policies/Policies.tsx
index ebb2a327ee1..2cb2d1d1516 100644
--- a/apps/studio/components/interfaces/Auth/Policies/Policies.tsx
+++ b/apps/studio/components/interfaces/Auth/Policies/Policies.tsx
@@ -10,7 +10,7 @@ import {
PolicyTableRow,
PolicyTableRowProps,
} from 'components/interfaces/Auth/Policies/PolicyTableRow'
-import ProtectedSchemaWarning from 'components/interfaces/Database/ProtectedSchemaWarning'
+import { ProtectedSchemaWarning } from 'components/interfaces/Database/ProtectedSchemaWarning'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import NoSearchResults from 'components/to-be-cleaned/NoSearchResults'
import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
diff --git a/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx b/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx
index d24f02b8036..e4feb1d958f 100644
--- a/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx
+++ b/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx
@@ -9,7 +9,6 @@ import { Modal } from 'ui'
import { useOrganizationPaymentMethodSetupIntent } from 'data/organizations/organization-payment-method-setup-intent-mutation'
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
import { STRIPE_PUBLIC_KEY } from 'lib/constants'
-import { useIsHCaptchaLoaded } from 'stores/hcaptcha-loaded-store'
import AddPaymentMethodForm from './AddPaymentMethodForm'
import { getStripeElementsAppearanceOptions } from './Payment.utils'
@@ -18,8 +17,6 @@ interface AddNewPaymentMethodModalProps {
returnUrl: string
onCancel: () => void
onConfirm: () => void
- showSetDefaultCheckbox?: boolean
- autoMarkAsDefaultPaymentMethod?: boolean
}
const stripePromise = loadStripe(STRIPE_PUBLIC_KEY)
@@ -29,14 +26,11 @@ const AddNewPaymentMethodModal = ({
returnUrl,
onCancel,
onConfirm,
- showSetDefaultCheckbox,
- autoMarkAsDefaultPaymentMethod,
}: AddNewPaymentMethodModalProps) => {
const { resolvedTheme } = useTheme()
const [intent, setIntent] = useState
()
const selectedOrganization = useSelectedOrganization()
- const captchaLoaded = useIsHCaptchaLoaded()
const [captchaToken, setCaptchaToken] = useState(null)
const [captchaRef, setCaptchaRef] = useState(null)
@@ -64,7 +58,7 @@ const AddNewPaymentMethodModal = ({
}
const loadPaymentForm = async () => {
- if (visible && captchaRef && captchaLoaded) {
+ if (visible && captchaRef) {
let token = captchaToken
try {
@@ -82,7 +76,7 @@ const AddNewPaymentMethodModal = ({
}
loadPaymentForm()
- }, [visible, captchaRef, captchaLoaded])
+ }, [visible, captchaRef])
const resetCaptcha = () => {
setCaptchaToken(null)
@@ -142,8 +136,6 @@ const AddNewPaymentMethodModal = ({
returnUrl={returnUrl}
onCancel={onLocalCancel}
onConfirm={onLocalConfirm}
- showSetDefaultCheckbox={showSetDefaultCheckbox}
- autoMarkAsDefaultPaymentMethod={autoMarkAsDefaultPaymentMethod}
/>
diff --git a/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx b/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx
index cb470dcb3e5..0171d9f5610 100644
--- a/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx
+++ b/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx
@@ -1,49 +1,56 @@
-import { PaymentElement, useElements, useStripe } from '@stripe/react-stripe-js'
import { useQueryClient } from '@tanstack/react-query'
+import {
+ NewPaymentMethodElement,
+ type PaymentMethodElementRef,
+} from 'components/interfaces/Organization/BillingSettings/PaymentMethods/NewPaymentMethodElement'
import { organizationKeys } from 'data/organizations/keys'
+import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query'
+import { useOrganizationCustomerProfileUpdateMutation } from 'data/organizations/organization-customer-profile-update-mutation'
import { useOrganizationPaymentMethodMarkAsDefaultMutation } from 'data/organizations/organization-payment-method-default-mutation'
+import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query'
+import { useOrganizationTaxIdUpdateMutation } from 'data/organizations/organization-tax-id-update-mutation'
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
-import { useState } from 'react'
+import { isEqual } from 'lodash'
+import { useRef, useState } from 'react'
import { toast } from 'sonner'
import { Button, Checkbox_Shadcn_, Label_Shadcn_, Modal } from 'ui'
+import ShimmeringLoader from 'ui-patterns/ShimmeringLoader'
interface AddPaymentMethodFormProps {
returnUrl: string
onCancel: () => void
onConfirm: () => void
- showSetDefaultCheckbox?: boolean
- autoMarkAsDefaultPaymentMethod?: boolean
}
// Stripe docs recommend to use the new SetupIntent flow over
// manually creating and attaching payment methods via the API
// Small UX annoyance here, that the page will be refreshed
-const AddPaymentMethodForm = ({
- returnUrl,
- onCancel,
- onConfirm,
- showSetDefaultCheckbox = false,
- autoMarkAsDefaultPaymentMethod = false,
-}: AddPaymentMethodFormProps) => {
- const stripe = useStripe()
- const elements = useElements()
+const AddPaymentMethodForm = ({ onCancel, onConfirm }: AddPaymentMethodFormProps) => {
const selectedOrganization = useSelectedOrganization()
+ const { data: customerProfile, isLoading: customerProfileLoading } =
+ useOrganizationCustomerProfileQuery({
+ slug: selectedOrganization?.slug,
+ })
+
const [isSaving, setIsSaving] = useState(false)
- const [isDefault, setIsDefault] = useState(showSetDefaultCheckbox)
+ const [isDefaultPaymentMethod, setIsDefaultPaymentMethod] = useState(true)
+ const [isPrimaryBillingAddress, setIsPrimaryBillingAddress] = useState(true)
const queryClient = useQueryClient()
const { mutateAsync: markAsDefault } = useOrganizationPaymentMethodMarkAsDefaultMutation()
+ const { mutateAsync: updateCustomerProfile } = useOrganizationCustomerProfileUpdateMutation()
+ const { mutateAsync: updateTaxId } = useOrganizationTaxIdUpdateMutation()
+ const { data: taxId, isLoading: isCustomerTaxIdLoading } = useOrganizationTaxIdQuery({
+ slug: selectedOrganization?.slug,
+ })
+
+ const paymentRef = useRef(null)
const handleSubmit = async (event: any) => {
event.preventDefault()
- if (!stripe || !elements) {
- console.error('Stripe.js has not loaded')
- return
- }
-
setIsSaving(true)
if (document !== undefined) {
@@ -51,25 +58,20 @@ const AddPaymentMethodForm = ({
document.body.classList.add('!pointer-events-auto')
}
- const { error, setupIntent } = await stripe.confirmSetup({
- elements,
- redirect: 'if_required',
- confirmParams: { return_url: returnUrl },
- })
+ const result = await paymentRef.current?.confirmSetup()
- if (error) {
+ if (!result) {
setIsSaving(false)
- toast.error(error?.message ?? ' Failed to save card details')
} else {
if (
- (isDefault || autoMarkAsDefaultPaymentMethod) &&
+ isDefaultPaymentMethod &&
selectedOrganization &&
- typeof setupIntent?.payment_method === 'string'
+ typeof result.setupIntent?.payment_method === 'string'
) {
try {
await markAsDefault({
slug: selectedOrganization.slug,
- paymentMethodId: setupIntent.payment_method,
+ paymentMethodId: result.setupIntent.payment_method,
})
await queryClient.invalidateQueries(
@@ -82,10 +84,10 @@ const AddPaymentMethodForm = ({
if (!prev) return prev
return {
...prev,
- defaultPaymentMethodId: setupIntent.payment_method,
+ defaultPaymentMethodId: result.setupIntent.payment_method,
data: prev.data.map((pm: any) => ({
...pm,
- is_default: pm.id === setupIntent.payment_method,
+ is_default: pm.id === result.setupIntent.payment_method,
})),
}
}
@@ -101,6 +103,28 @@ const AddPaymentMethodForm = ({
}
}
+ if (isPrimaryBillingAddress) {
+ try {
+ if (
+ result.address &&
+ (!isEqual(result.address, customerProfile?.address) ||
+ customerProfile?.billing_name !== result.customerName)
+ ) {
+ await updateCustomerProfile({
+ slug: selectedOrganization?.slug,
+ billing_name: result.customerName,
+ address: result.address,
+ })
+ }
+
+ if (result.taxId && !isEqual(result.taxId, taxId)) {
+ await updateTaxId({ taxId: result.taxId, slug: selectedOrganization?.slug })
+ }
+ } catch (error) {
+ toast.error('Failed to update billing address')
+ }
+ }
+
setIsSaving(false)
onConfirm()
}
@@ -110,33 +134,64 @@ const AddPaymentMethodForm = ({
}
}
+ if (customerProfileLoading || isCustomerTaxIdLoading) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+
return (
-
- {showSetDefaultCheckbox && (
-
- {
- if (typeof checked === 'boolean') {
- setIsDefault(checked)
- }
- }}
- />
-
- Save as default payment method
-
-
- )}
+
+
+ {
+ if (typeof checked === 'boolean') {
+ setIsDefaultPaymentMethod(checked)
+ }
+ }}
+ />
+
+ Save as default payment method
+
+
+
+
+ {
+ if (typeof checked === 'boolean') {
+ setIsPrimaryBillingAddress(checked)
+ }
+ }}
+ />
+
+ Use the billing address as my organization's primary address
+
+
diff --git a/apps/studio/components/interfaces/Billing/Payment/Payment.utils.ts b/apps/studio/components/interfaces/Billing/Payment/Payment.utils.ts
index 51f095f2e3a..ff8b08bbc7d 100644
--- a/apps/studio/components/interfaces/Billing/Payment/Payment.utils.ts
+++ b/apps/studio/components/interfaces/Billing/Payment/Payment.utils.ts
@@ -4,6 +4,7 @@ export const getStripeElementsAppearanceOptions = (
resolvedTheme: string | undefined
): Appearance => {
return {
+ labels: 'floating',
theme: (resolvedTheme?.includes('dark') ? 'night' : 'flat') as 'night' | 'flat',
variables: {
fontSizeBase: '14px',
@@ -12,18 +13,27 @@ export const getStripeElementsAppearanceOptions = (
: 'hsl(0deg 0% 95.3%)',
fontFamily:
'var(--font-custom, Circular, custom-font, Helvetica Neue, Helvetica, Arial, sans-serif)',
- spacingUnit: '4px',
- borderRadius: '.375rem',
- gridRowSpacing: '4px',
},
rules: {
- '.Label': {
- // Hide labels - it is obvious enough what the fields are for
- fontSize: '0',
- },
'.TermsText': {
fontSize: '12px',
},
+ '.Label--floating': {
+ fontSize: '14px',
+ },
+ '.Label--resting': {
+ fontSize: '14px',
+ color: 'rgb(137, 137, 137)',
+ },
+ '.Input': {
+ boxShadow: 'none',
+ height: '34px',
+ lineHeight: '16px',
+ padding: '8px 12px',
+ },
+ '.AccordionItem': {
+ boxShadow: 'none',
+ },
},
}
}
diff --git a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx
index a23bf75eb81..266b0a636c4 100644
--- a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx
+++ b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx
@@ -42,13 +42,16 @@ import {
Form_Shadcn_,
Input_Shadcn_,
Label_Shadcn_ as Label,
+ Switch,
cn,
} from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { PermissionAction } from '@supabase/shared-types/out/constants'
+import { useFlag } from 'hooks/ui/useFlag'
export const CreateBranchModal = () => {
+ const allowDataBranching = useFlag('allowDataBranching')
const { ref } = useParams()
const router = useRouter()
const queryClient = useQueryClient()
@@ -141,6 +144,7 @@ export const CreateBranchModal = () => {
(val) => gitlessBranching || !githubConnection || (val && val.length > 0),
'Git branch name is required when GitHub is connected'
),
+ withData: z.boolean().default(false).optional(),
})
.superRefine(async (val, ctx) => {
if (val.gitBranchName && val.gitBranchName.length > 0 && githubConnection?.repository.id) {
@@ -164,7 +168,7 @@ export const CreateBranchModal = () => {
mode: 'onSubmit',
reValidateMode: 'onBlur',
resolver: zodResolver(FormSchema),
- defaultValues: { branchName: '', gitBranchName: '' },
+ defaultValues: { branchName: '', gitBranchName: '', withData: false },
})
const canSubmit = !isCreating && !isChecking
@@ -182,7 +186,9 @@ export const CreateBranchModal = () => {
createBranch({
projectRef,
branchName: data.branchName,
+ is_default: false,
...(data.gitBranchName ? { gitBranch: data.gitBranchName } : {}),
+ ...(allowDataBranching ? { withData: data.withData } : {}),
})
}
@@ -294,6 +300,7 @@ export const CreateBranchModal = () => {
)}
/>
)}
+
{isLoadingConnections && }
{isErrorConnections && (
{
)}
-
+
Keep this preview branch in sync with a chosen GitHub branch
@@ -325,6 +332,23 @@ export const CreateBranchModal = () => {
)}
>
)}
+ {allowDataBranching && (
+ (
+
+
+
+
+
+ )}
+ />
+ )}
diff --git a/apps/studio/components/interfaces/DataWarehouse/CollectionForm.tsx b/apps/studio/components/interfaces/DataWarehouse/CollectionForm.tsx
deleted file mode 100644
index 5bb7e906d59..00000000000
--- a/apps/studio/components/interfaces/DataWarehouse/CollectionForm.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { zodResolver } from '@hookform/resolvers/zod'
-import { useForm } from 'react-hook-form'
-import { z } from 'zod'
-
-import {
- Button,
- FormControl_Shadcn_,
- FormField_Shadcn_,
- FormMessage_Shadcn_,
- Form_Shadcn_,
- Input_Shadcn_,
- Modal,
-} from 'ui'
-import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
-import { useCurrentOrgPlan } from 'hooks/misc/useCurrentOrgPlan'
-import { Admonition } from 'ui-patterns'
-import { useRouter } from 'next/router'
-import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
-
-export interface CollectionFormValues {
- name: string
- retention_days: number
-}
-
-interface CollectionFormProps {
- initialValues?: Partial
- onSubmit: (values: CollectionFormValues) => void
- isLoading?: boolean
- onCancelClick: () => void
-}
-
-export const CollectionForm = ({
- initialValues,
- onSubmit,
- isLoading,
- onCancelClick,
-}: CollectionFormProps) => {
- const { plan, isLoading: planLoading } = useCurrentOrgPlan()
- const router = useRouter()
- const currentOrg = useSelectedOrganization()
-
- function getMaxRetentionDays() {
- if (planLoading) return 1
- if (plan?.id === 'free') return 3
- else return 90
- }
- const maxRetentionDays = getMaxRetentionDays()
-
- const FormSchema = z.object({
- name: z.string().min(1),
- retention_days: z.coerce.number().min(1).max(maxRetentionDays).multipleOf(1).positive().int(),
- })
-
- const form = useForm({
- resolver: zodResolver(FormSchema),
- defaultValues: {
- name: initialValues?.name || '',
- retention_days: initialValues?.retention_days || maxRetentionDays,
- },
- })
-
- const handleSubmit = form.handleSubmit(onSubmit)
-
- const formatDays = (days: number) => {
- return days === 1 ? `1 day` : `${days} days`
- }
-
- const retentionDescription = (days: number) => {
- if (!Boolean(days) || days < 1)
- return <>Your plan allows for a maximum of {formatDays(maxRetentionDays)}.>
- return (
- <>
- Your logs will be removed after {formatDays(days)}.
- Your plan allows for a maximum of {formatDays(maxRetentionDays)}.
- >
- )
- }
-
- return (
-
-
-
- (
-
-
-
-
-
- )}
- />
- (
-
-
-
-
-
- days
-
-
-
-
- )}
- />
-
-
- {plan?.id === 'free' && (
- <>
-
-
- Upgrade to the pro plan to increase retention to 90 days.
-
- router.push(
- `/org/${currentOrg?.slug}/billing?panel=subscriptionPlan&source=dataWarehouseIncreaseRetention`
- )
- }
- >
- Upgrade plan
-
-
- }
- />
- >
- )}
-
-
-
- Cancel
-
-
- Create collection
-
-
-
-
- )
-}
diff --git a/apps/studio/components/interfaces/DataWarehouse/CreateWarehouseCollection.tsx b/apps/studio/components/interfaces/DataWarehouse/CreateWarehouseCollection.tsx
deleted file mode 100644
index 4b2126065e4..00000000000
--- a/apps/studio/components/interfaces/DataWarehouse/CreateWarehouseCollection.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { useRouter } from 'next/router'
-import { toast } from 'sonner'
-
-import { useParams } from 'common'
-import { useCreateCollection } from 'data/analytics/warehouse-collections-create-mutation'
-import { Modal } from 'ui'
-import { CollectionForm } from './CollectionForm'
-
-export const CreateWarehouseCollectionModal = ({
- open,
- onOpenChange,
-}: {
- open: boolean
- onOpenChange: (open: boolean) => void
-}) => {
- const router = useRouter()
- const { ref } = useParams()
-
- const { mutate: createCollection, isLoading } = useCreateCollection({
- onSuccess: (data) => {
- onOpenChange(false)
- toast.success('Collection created successfully')
- router.push(`/project/${ref}/logs/collections/${data.token}`)
- },
- onError: (error) => {
- toast.error(error.message)
- },
- })
-
- return (
-
onOpenChange(false)}
- header="Create collection"
- visible={open}
- hideFooter
- >
- onOpenChange(false)}
- isLoading={isLoading}
- onSubmit={(vals) => {
- if (!ref) {
- return
- }
- createCollection({
- projectRef: ref,
- name: vals.name,
- retention_days: vals.retention_days,
- })
- }}
- />
-
- )
-}
diff --git a/apps/studio/components/interfaces/DataWarehouse/TestCollectionDialog.tsx b/apps/studio/components/interfaces/DataWarehouse/TestCollectionDialog.tsx
deleted file mode 100644
index 489a9e29860..00000000000
--- a/apps/studio/components/interfaces/DataWarehouse/TestCollectionDialog.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-import { Select, SelectContent, SelectItem, SelectTrigger } from '@ui/components/shadcn/ui/select'
-import CopyButton from 'components/ui/CopyButton'
-import type { WarehouseAccessTokensData } from 'data/analytics/warehouse-access-tokens-query'
-import type { WarehouseCollectionsData } from 'data/analytics/warehouse-collections-query'
-import { useRouter } from 'next/router'
-import { useEffect, useState } from 'react'
-import {
- Button,
- Checkbox_Shadcn_,
- CodeBlock,
- Input_Shadcn_,
- Label_Shadcn_,
- Separator,
- Sheet,
- SheetContent,
- SheetDescription,
- SheetFooter,
- SheetHeader,
- SheetSection,
- SheetTitle,
- SheetTrigger,
- Tooltip,
- TooltipContent,
- TooltipTrigger,
-} from 'ui'
-import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
-
-export function TestCollectionDialog({
- accessTokens,
- collectionToken,
- collections,
- open,
- onOpenChange,
- onSubmit,
-}: {
- accessTokens: WarehouseAccessTokensData['data']
- collections: WarehouseCollectionsData
- collectionToken: string
- projectRef: string
- open: boolean
- onOpenChange: (open: boolean) => void
- onSubmit: () => void
-}) {
- const router = useRouter()
- const BASE_WAREHOUSE_URL = `https://api.warehouse.tech/api/events`
- const [testAccessToken, setTestAccessToken] = useState('')
- const [selectedCollection, setSelectedCollection] = useState(collectionToken || '')
- const [showAccessToken, setShowAccessToken] = useState(false)
-
- useEffect(() => {
- setSelectedCollection(collectionToken)
- }, [collectionToken])
-
- useEffect(() => {
- if (accessTokens.length > 0) {
- setTestAccessToken(accessTokens[0].token)
- }
- }, [accessTokens])
-
- const selectedAccessToken = accessTokens.find((token) => token.token === testAccessToken)
- const selectedCollectionName = collections?.find((col) => col.token === selectedCollection)?.name
-
- function getcURL(accessToken: string) {
- return `curl -X "POST" "${BASE_WAREHOUSE_URL}?source=${selectedCollection}" \\
- -H 'Content-Type: application/json' \\
- -H 'Authorization: Bearer ${accessToken}' \\
- -d $'{
- "event_message": "Test event message",
- "metadata": {
- "ip_address": "100.100.100.100",
- "request_method": "POST",
- "custom_user_data": {
- "foo": "bar"
- },
- "datacenter": "aws",
- "request_headers": {
- "connection": "close",
- "user_agent": "chrome"
- }
- }
- }'
-`
- }
-
- return (
-
-
-
-
-
- Connect
-
-
-
- {accessTokens.length === 0 && (
- Create an access token to connect to your collection
- )}
-
-
-
-
- Send events to this collection
-
- Use the following cURL command to send events to this collection
-
-
-
-
-
-
-
- {selectedCollectionName || 'Collection'}
-
-
- {collections?.map((col) => (
-
- {col.name}
-
- ))}
-
-
-
-
-
-
-
- {selectedAccessToken?.description || 'Access token'}
-
-
-
- {accessTokens?.map((token: any) => (
-
- {token.description || 'No description'}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- setShowAccessToken(!showAccessToken)}
- />
- Show access token
-
-
-
-
-
-
- {getcURL(showAccessToken ? testAccessToken : '********************')}
-
-
-
-
-
-
- Once you send an event, refresh the page to see it in the collection.
-
-
- Refresh results
-
-
-
-
- )
-}
diff --git a/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx b/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx
deleted file mode 100644
index f0be4402a71..00000000000
--- a/apps/studio/components/interfaces/DataWarehouse/WarehouseCollectionDetail.tsx
+++ /dev/null
@@ -1,323 +0,0 @@
-import { useKeyboardShortcuts } from 'components/grid/components/common/Hooks'
-import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
-import AlertError from 'components/ui/AlertError'
-import LoadingOpacity from 'components/ui/LoadingOpacity'
-import ShimmerLine from 'components/ui/ShimmerLine'
-import { useWarehouseAccessTokensQuery } from 'data/analytics/warehouse-access-tokens-query'
-import { useWarehouseLogDetailQuery } from 'data/analytics/warehouse-collection-log-detail-query'
-import { useWarehouseCollectionsQuery } from 'data/analytics/warehouse-collections-query'
-import { useWarehouseQueryQuery } from 'data/analytics/warehouse-query'
-import dayjs from 'dayjs'
-import { useSelectedLog } from 'hooks/analytics/useSelectedLog'
-import { useFlag } from 'hooks/ui/useFlag'
-import { RefreshCcw, Rewind, Terminal } from 'lucide-react'
-import Link from 'next/link'
-import { useRouter } from 'next/router'
-import { useEffect, useState } from 'react'
-import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
-import { LogsDatePicker } from '../Settings/Logs/Logs.DatePickers'
-import { DatetimeHelper } from '../Settings/Logs/Logs.types'
-import LogTable from '../Settings/Logs/LogTable'
-import { TestCollectionDialog } from './TestCollectionDialog'
-
-const INTERVALS: DatetimeHelper[] = [
- {
- text: 'Last hour',
- calcFrom: () => dayjs().subtract(1, 'hour').toISOString(),
- calcTo: () => dayjs().toISOString(),
- default: true,
- },
- {
- text: 'Last 12 hours',
- calcFrom: () => dayjs().subtract(12, 'hour').toISOString(),
- calcTo: () => dayjs().toISOString(),
- },
- {
- text: 'Last day',
- calcFrom: () => dayjs().subtract(1, 'day').toISOString(),
- calcTo: () => dayjs().toISOString(),
- },
- {
- text: 'Last 7 days',
- calcFrom: () => dayjs().subtract(7, 'day').toISOString(),
- calcTo: () => dayjs().toISOString(),
- },
-]
-
-export const WarehouseCollectionDetail = () => {
- const router = useRouter()
- const collectionToken = router.query.collectionToken as string
- const projectRef = router.query.ref as string
- const accessTokens = useWarehouseAccessTokensQuery({ projectRef })
- const [testDialogOpen, setTestDialogOpen] = useState(false)
- const hasWarehouse = useFlag('warehouse')
-
- const { data: collections, isLoading: collectionsLoading } = useWarehouseCollectionsQuery(
- { projectRef },
- { enabled: hasWarehouse }
- )
- const collection = collections?.find((c) => c.token === collectionToken)
- const [search, setSearch] = useState('')
- const [filters, setFilters] = useState({
- limit: 100,
- offset: 0,
- search: '',
- interval: {
- to: INTERVALS[0].calcTo,
- from: INTERVALS[0].calcFrom,
- },
- })
- const [sql, setSQL] = useState('')
-
- useEffect(() => {
- if (collection) {
- const from = filters.interval.from()
- const to = filters.interval.to()
-
- const sql = `select id, timestamp from \`${collection.name}\`
-where timestamp >= TIMESTAMP('${from}')
-and timestamp <= TIMESTAMP('${to}')
-order by timestamp desc limit ${filters.limit} offset ${filters.offset}
- `
-
- setSQL(sql)
- }
- }, [filters.interval, filters.limit, filters.offset, collection])
-
- const {
- isLoading: queryLoading,
- data: queryData,
- isError,
- isRefetching,
- } = useWarehouseQueryQuery(
- { ref: projectRef, sql },
- {
- enabled: !!sql && hasWarehouse,
- }
- )
-
- const formatResults = (results: any) => {
- if (!results || !results.length) {
- return []
- }
-
- const r = results.map(({ timestamp, ...r }: any) => {
- return {
- timestamp: new Date(timestamp / 1000).toLocaleString(),
- ...r,
- }
- })
-
- return r
- }
-
- const results = formatResults(queryData?.result)
-
- function loadMore() {
- setFilters({ ...filters, offset: filters.offset + filters.limit })
- }
-
- const isLoading = queryLoading || collectionsLoading || isRefetching
-
- function refreshResults(e?: React.FormEvent
) {
- e?.preventDefault()
- setFilters({
- ...filters,
- search,
- interval: {
- to: () => dayjs().toISOString(),
- from: () => filters.interval.from() || dayjs().subtract(1, 'hour').toISOString(),
- },
- })
- }
-
- const queryUrl = `/project/${projectRef}/logs/explorer?q=${encodeURIComponent(
- sql || ''
- )}&source=warehouse`
-
- useKeyboardShortcuts(
- {
- r: () => {
- document.getElementById('refresh-button')?.focus()
- },
- s: () => {
- document.getElementById('search-input')?.focus()
- },
- },
- ['INPUT', 'BUTTON', 'TEXTAREA']
- )
-
- function KeyboardShortcut({ children }: { children: React.ReactNode }) {
- return (
-
- {children}
-
- )
- }
-
- // Selected Log Detail
- const [selectedLogId, setSelectedLogId] = useSelectedLog()
- const {
- data: selectedLogDetail,
- isLoading: selectedLogDetailLoading,
- error: selectedLogDetailError,
- } = useWarehouseLogDetailQuery({
- ref: projectRef,
- collectionName: collection?.name,
- logId: selectedLogId ?? undefined,
- })
-
- return (
-
-
-
-
-
-
-
- {collection?.name}
-
-
-
- }
- type="text"
- loading={isLoading}
- disabled={isLoading}
- className="px-1.5"
- />
-
-
- Refresh R
-
-
- {/* setSearch(e.target.value)}
- /> */}
-
- setFilters({
- ...filters,
- interval: {
- to: () => e.to || '',
- from: () => e.from || '',
- },
- })
- }
- />
-
-
-
-
- }>
-
-
-
-
- Open query in Collections Explorer
-
-
-
- {
- refreshResults()
- setTestDialogOpen(false)
- }}
- />
-
-
-
- {isError && (
-
- )}
-
- {!isError && (
-
setSelectedLogId(log?.id ?? null)}
- selectedLog={selectedLogDetail?.result[0] ?? undefined}
- selectedLogError={selectedLogDetailError ?? undefined}
- isSelectedLogLoading={!!selectedLogId && selectedLogDetailLoading}
- data={results}
- showHeader={false}
- EmptyState={
-
-
-
Try adjusting your filters, send a test event or refresh the results.
-
- {
- setTestDialogOpen(true)
- }}
- >
- Send test event
-
- refreshResults()}>
- Refresh
-
-
-
-
- }
- />
- )}
-
-
-
- {!isError && (
-
-
- {results.length > 0 && (
- }
- type="default"
- loading={isLoading}
- disabled={isLoading}
- >
- Load more
-
- )}
- {filters.offset !== 0 && (
- <>
- setFilters({ ...filters, offset: 0 })}
- type="default"
- loading={isLoading}
- disabled={isLoading}
- >
- Load latest
-
- >
- )}
-
-
- )}
-
- )
-}
diff --git a/apps/studio/components/interfaces/DataWarehouse/WarehouseMenuItem.tsx b/apps/studio/components/interfaces/DataWarehouse/WarehouseMenuItem.tsx
deleted file mode 100644
index 9b2c656e254..00000000000
--- a/apps/studio/components/interfaces/DataWarehouse/WarehouseMenuItem.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { Database, EditIcon, TrashIcon } from 'lucide-react'
-import { useRouter } from 'next/router'
-import { useState } from 'react'
-import { toast } from 'sonner'
-
-import { useParams } from 'common'
-import { useDeleteCollectionMutation } from 'data/analytics/warehouse-collections-delete-mutation'
-import { useUpdateCollection } from 'data/analytics/warehouse-collections-update-mutation'
-import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
-import {
- DropdownMenuItem,
- DropdownMenuSeparator,
- Modal,
- Tooltip,
- TooltipContent,
- TooltipTrigger,
-} from 'ui'
-
-import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
-import { LogsSidebarItem } from '../Settings/Logs/SidebarV2/SidebarItem'
-import { CollectionForm } from './CollectionForm'
-
-type Props = {
- item: {
- id: number
- token: string
- name: string
- retention_days: number
- }
-}
-
-export const WarehouseMenuItem = ({ item }: Props) => {
- const router = useRouter()
- const { ref, collectionToken } = useParams()
- const projectRef = ref || 'default'
-
- const [showUpdateDialog, setShowUpdateDialog] = useState(false)
- const [showDeleteDialog, setDeleteDialog] = useState(false)
-
- const canUpdateCollection = useCheckPermissions(PermissionAction.ANALYTICS_WRITE, 'logflare')
-
- const updateCollection = useUpdateCollection({
- onSuccess: () => {
- toast.success('Collection updated successfully')
- setShowUpdateDialog(false)
- },
- })
- const deleteCollection = useDeleteCollectionMutation({
- onSuccess: () => {
- // If the current collection is deleted, redirect to default logs view
- if (item.token === collectionToken) {
- router.push(`/project/${projectRef}/logs/explorer`)
- }
- setDeleteDialog(false)
- toast.success('Collection deleted successfully')
- },
- })
-
- const isLoading = updateCollection.isLoading || deleteCollection.isLoading
-
- return (
- <>
- }
- href={`/project/${projectRef}/logs/collections/${item.token}`}
- dropdownItems={
- <>
-
-
- {
- e.preventDefault()
- setShowUpdateDialog(true)
- }}
- >
-
- Update collection
-
-
- {!canUpdateCollection && (
-
- You need additional permissions to update collections
-
- )}
-
-
-
-
- {
- e.preventDefault()
- setDeleteDialog(true)
- }}
- >
-
- Delete collection
-
-
- {!canUpdateCollection && (
-
- You need additional permissions to delete collections
-
- )}
-
- >
- }
- >
-
- setShowUpdateDialog(false)}
- hideFooter
- header={`Update collection "${item.name}"`}
- >
- setShowUpdateDialog(false)}
- isLoading={isLoading}
- initialValues={{ name: item.name, retention_days: item.retention_days }}
- onSubmit={({ name, retention_days }) => {
- updateCollection.mutate({
- projectRef,
- collectionToken: item.token,
- name,
- retention_days,
- })
- }}
- />
-
- setDeleteDialog(false)}
- confirmLabel="Delete collection"
- title={`Delete collection "${item.name}"`}
- size="small"
- onConfirm={() => {
- deleteCollection.mutate({ projectRef, collectionToken: item.token })
- }}
- >
-
- All data in this collection will be deleted.
-
-
This action cannot be undone.
-
-
- >
- )
-}
diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx
index c09796c1e3a..53b3c1f65ff 100644
--- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx
+++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx
@@ -13,7 +13,7 @@ import {
useEnumeratedTypesQuery,
} from 'data/enumerated-types/enumerated-types-query'
import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState'
-import { PROTECTED_SCHEMAS } from 'lib/constants/schemas'
+import { useIsProtectedSchema } from 'hooks/useProtectedSchemas'
import {
Button,
DropdownMenu,
@@ -22,7 +22,7 @@ import {
DropdownMenuTrigger,
Input,
} from 'ui'
-import ProtectedSchemaWarning from '../ProtectedSchemaWarning'
+import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning'
import CreateEnumeratedTypeSidePanel from './CreateEnumeratedTypeSidePanel'
import DeleteEnumeratedTypeModal from './DeleteEnumeratedTypeModal'
import EditEnumeratedTypeSidePanel from './EditEnumeratedTypeSidePanel'
@@ -52,11 +52,7 @@ const EnumeratedTypes = () => {
)
: enumeratedTypes.filter((x) => x.schema === selectedSchema)
- const protectedSchemas = (schemas ?? []).filter((schema) =>
- PROTECTED_SCHEMAS.includes(schema?.name ?? '')
- )
- const schema = schemas?.find((schema) => schema.name === selectedSchema)
- const isLocked = protectedSchemas.some((s) => s.id === schema?.id)
+ const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedSchema })
return (
@@ -81,7 +77,7 @@ const EnumeratedTypes = () => {
- {!isLocked && (
+ {!isSchemaLocked && (
{
- {isLocked && }
+ {isSchemaLocked && (
+
+ )}
{isLoading && }
@@ -140,7 +138,7 @@ const EnumeratedTypes = () => {
{type.name}
{type.enums.join(', ')}
- {!isLocked && (
+ {!isSchemaLocked && (
diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx
index fd966494bdf..d481d68ea27 100644
--- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx
+++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx
@@ -13,7 +13,7 @@ import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-ex
import { useDatabaseFunctionCreateMutation } from 'data/database-functions/database-functions-create-mutation'
import { DatabaseFunction } from 'data/database-functions/database-functions-query'
import { useDatabaseFunctionUpdateMutation } from 'data/database-functions/database-functions-update-mutation'
-import { PROTECTED_SCHEMAS } from 'lib/constants/schemas'
+import { useProtectedSchemas } from 'hooks/useProtectedSchemas'
import type { FormSchema } from 'types'
import {
Button,
@@ -149,6 +149,8 @@ const CreateFunction = ({ func, visible, setVisible }: CreateFunctionProps) => {
}
}, [visible, func])
+ const { data: protectedSchemas } = useProtectedSchemas()
+
return (
isClosingSidePanel()}>
{
s.name)}
size="small"
onSelectSchema={(name) => field.onChange(name)}
/>
diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
index 079776aec57..22427a0581b 100644
--- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
+++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx
@@ -1,6 +1,6 @@
import type { PostgresFunction } from '@supabase/postgres-meta'
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { noop, partition } from 'lodash'
+import { noop } from 'lodash'
import { Search } from 'lucide-react'
import { useRouter } from 'next/router'
@@ -16,10 +16,10 @@ import { useDatabaseFunctionsQuery } from 'data/database-functions/database-func
import { useSchemasQuery } from 'data/database/schemas-query'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState'
-import { PROTECTED_SCHEMAS } from 'lib/constants/schemas'
+import { useIsProtectedSchema } from 'hooks/useProtectedSchemas'
import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state'
import { AiIconAnimation, Input } from 'ui'
-import ProtectedSchemaWarning from '../../ProtectedSchemaWarning'
+import { ProtectedSchemaWarning } from '../../ProtectedSchemaWarning'
import FunctionList from './FunctionList'
interface FunctionsListProps {
@@ -60,11 +60,8 @@ const FunctionsList = ({
projectRef: project?.ref,
connectionString: project?.connectionString,
})
- const [protectedSchemas] = partition(schemas ?? [], (schema) =>
- PROTECTED_SCHEMAS.includes(schema?.name ?? '')
- )
- const foundSchema = schemas?.find((schema) => schema.name === selectedSchema)
- const isLocked = protectedSchemas.some((s) => s.id === foundSchema?.id)
+
+ const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedSchema })
const {
data: functions,
@@ -126,7 +123,7 @@ const FunctionsList = ({
- {!isLocked && (
+ {!isSchemaLocked && (
<>
- {isLocked && }
+ {isSchemaLocked && }
diff --git a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx
index 263d20bfd4d..742a04ace3b 100644
--- a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx
+++ b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx
@@ -1,4 +1,4 @@
-import { partition, sortBy } from 'lodash'
+import { sortBy } from 'lodash'
import { AlertCircle, Search, Trash } from 'lucide-react'
import { useEffect, useState } from 'react'
import { toast } from 'sonner'
@@ -14,10 +14,10 @@ import { useDatabaseIndexDeleteMutation } from 'data/database-indexes/index-dele
import { DatabaseIndex, useIndexesQuery } from 'data/database-indexes/indexes-query'
import { useSchemasQuery } from 'data/database/schemas-query'
import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState'
-import { PROTECTED_SCHEMAS } from 'lib/constants/schemas'
+import { useIsProtectedSchema } from 'hooks/useProtectedSchemas'
import { Button, Input, SidePanel } from 'ui'
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
-import ProtectedSchemaWarning from '../ProtectedSchemaWarning'
+import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning'
import CreateIndexSidePanel from './CreateIndexSidePanel'
const Indexes = () => {
@@ -58,11 +58,7 @@ const Indexes = () => {
},
})
- const [protectedSchemas] = partition(schemas ?? [], (schema) =>
- PROTECTED_SCHEMAS.includes(schema?.name ?? '')
- )
- const schema = schemas?.find((schema) => schema.name === selectedSchema)
- const isLocked = protectedSchemas.some((s) => s.id === schema?.id)
+ const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedSchema })
const sortedIndexes = sortBy(allIndexes ?? [], (index) => index.name.toLocaleLowerCase())
const indexes =
@@ -122,7 +118,7 @@ const Indexes = () => {
icon={ }
/>
- {!isLocked && (
+ {!isSchemaLocked && (
{
)}
- {isLocked &&