diff --git a/apps/docs/spec/api_v1_openapi.json b/apps/docs/spec/api_v1_openapi.json index d77b7729a32..59bf4cc4e8e 100644 --- a/apps/docs/spec/api_v1_openapi.json +++ b/apps/docs/spec/api_v1_openapi.json @@ -13,7 +13,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -22,7 +22,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -38,15 +43,12 @@ }, "500": { "description": "Failed to retrieve database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_read"] }, - { "fga_permissions": ["branching_development_read"] } - ], + "security": [{ "bearer": [] }], "summary": "Get database branch config", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" }, "patch": { @@ -60,7 +62,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -69,7 +71,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -89,15 +96,12 @@ }, "500": { "description": "Failed to update database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Update database branch config", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" }, "delete": { @@ -111,7 +115,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -120,7 +124,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } }, @@ -129,7 +138,7 @@ "required": false, "in": "query", "description": "If set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled).", - "schema": { "default": "true", "example": false, "type": "boolean" } + "schema": { "example": false, "type": "string" } } ], "responses": { @@ -143,15 +152,12 @@ }, "500": { "description": "Failed to delete database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_delete"] }, - { "fga_permissions": ["branching_development_delete"] } - ], + "security": [{ "bearer": [] }], "summary": "Delete a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_delete"], ["branching_production_delete"]], "x-oauth-scope": "environment:write" } }, @@ -167,7 +173,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -176,7 +182,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -198,15 +209,12 @@ }, "500": { "description": "Failed to push database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Pushes a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -222,7 +230,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -231,7 +239,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -253,15 +266,12 @@ }, "500": { "description": "Failed to merge database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Merges a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -277,7 +287,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -286,7 +296,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -308,15 +323,12 @@ }, "500": { "description": "Failed to reset database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Resets a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -332,7 +344,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -341,7 +353,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } } @@ -357,15 +374,12 @@ }, "500": { "description": "Failed to restore database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Restore a scheduled branch deletion", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -381,7 +395,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -390,7 +404,12 @@ "description": "Project ref", "example": "abcdefghijklmnopqrst" }, - { "type": "string", "format": "uuid", "deprecated": true } + { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "deprecated": true + } ] } }, @@ -404,8 +423,8 @@ "name": "pgdelta", "required": false, "in": "query", - "description": "Use pg-delta instead of Migra for diffing when true", - "schema": { "example": false, "type": "boolean" } + "description": "Use pg-delta instead of Migra for diffing when true. \nBoolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "responses": { @@ -415,15 +434,12 @@ }, "500": { "description": "Failed to diff database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_write"] }, - { "fga_permissions": ["branching_development_write"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Diffs a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -448,11 +464,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["projects_read"] }], + "security": [{ "bearer": [] }], "summary": "List all projects", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["projects_read"]], "x-oauth-scope": "projects:read" }, "post": { @@ -475,11 +492,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_projects_create"] }], + "security": [{ "bearer": [] }], "summary": "Create a project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["organization_projects_create"]], "x-oauth-scope": "projects:write" } }, @@ -574,11 +592,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Unexpected error listing organizations" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organizations_read"] }], + "security": [{ "bearer": [] }], "summary": "List all organizations", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organizations_read"]], "x-oauth-scope": "organizations:read" }, "post": { @@ -606,10 +625,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Unexpected error creating an organization" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organizations_create"] }], + "security": [{ "bearer": [] }], "summary": "Create an organization", "tags": ["Organizations"], - "x-endpoint-owners": ["management-api", "billing"] + "x-endpoint-owners": ["management-api", "billing"], + "x-fga-permissions": [["organizations_create"]] } }, "/v1/oauth/authorize": { @@ -622,6 +642,7 @@ "in": "query", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "66666666-6666-4666-8666-666666666666", "type": "string" } @@ -694,11 +715,14 @@ "required": false, "in": "query", "description": "Resource indicator for MCP (Model Context Protocol) clients", - "schema": { "format": "uri", "type": "string" } + "schema": { + "format": "uri", + "example": "https://mcp.supabase.com/projects", + "type": "string" + } } ], "responses": { "204": { "description": "" } }, - "security": [{ "oauth2": ["read"] }], "summary": "[Beta] Authorize user through oauth", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -727,7 +751,6 @@ } } }, - "security": [{ "oauth2": ["write"] }], "summary": "[Beta] Exchange auth code for user's access and refresh token", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -746,7 +769,6 @@ } }, "responses": { "204": { "description": "" } }, - "security": [{ "oauth2": ["write"] }], "summary": "[Beta] Revoke oauth app authorization and it's corresponding tokens", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -776,6 +798,7 @@ "in": "query", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "66666666-6666-4666-8666-666666666666", "type": "string" } @@ -827,13 +850,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["organization_admin_write", "project_admin_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Authorize user through oauth and claim a project", "tags": ["OAuth"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]] } }, "/v1/snippets": { @@ -885,11 +906,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list user's SQL snippets" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["snippets_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists SQL snippets for the logged in user", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["snippets_read"]], "x-oauth-scope": "database:read" } }, @@ -903,6 +925,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "44444444-4444-4444-8444-444444444444", "type": "string" } @@ -920,11 +943,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve SQL snippet" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["snippets_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets a specific SQL snippet", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["snippets_read"]], "x-oauth-scope": "database:read" } }, @@ -947,6 +971,46 @@ } }, "/v1/projects/{ref}/actions": { + "head": { + "description": "Returns the total number of action runs of the specified project.", + "operationId": "v1-count-action-runs", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "X-Total-Count": { + "schema": { "type": "integer", "format": "int64", "minimum": 0 }, + "description": "total count value" + } + }, + "description": "" + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to count action runs" } + }, + "security": [{ "bearer": [] }], + "summary": "Count the number of action runs", + "tags": ["Environments"], + "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], + "x-fga-permissions": [["action_runs_read"]], + "x-oauth-scope": "environment:read" + }, "get": { "description": "Returns a paginated list of action runs of the specified project.", "operationId": "v1-list-action-runs", @@ -991,50 +1055,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list action runs" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["action_runs_read"] }], + "security": [{ "bearer": [] }], "summary": "List all action runs", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], - "x-oauth-scope": "environment:read" - }, - "head": { - "description": "Returns the total number of action runs of the specified project.", - "operationId": "v1-count-action-runs", - "parameters": [ - { - "name": "ref", - "required": true, - "in": "path", - "description": "Project ref", - "schema": { - "minLength": 20, - "maxLength": 20, - "pattern": "^[a-z]+$", - "example": "abcdefghijklmnopqrst", - "type": "string" - } - } - ], - "responses": { - "200": { - "headers": { - "X-Total-Count": { - "schema": { "type": "integer", "format": "int64", "minimum": 0 }, - "description": "total count value" - } - }, - "description": "" - }, - "401": { "description": "Unauthorized" }, - "403": { "description": "Forbidden action" }, - "429": { "description": "Rate limit exceeded" }, - "500": { "description": "Failed to count action runs" } - }, - "security": [{ "bearer": [] }, { "fga_permissions": ["action_runs_read"] }], - "summary": "Count the number of action runs", - "tags": ["Environments"], - "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -1076,11 +1102,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get action run status" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["action_runs_read"] }], + "security": [{ "bearer": [] }], "summary": "Get the status of an action run", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -1130,11 +1157,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update action run status" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["action_runs_write"] }], + "security": [{ "bearer": [] }], "summary": "Update the status of an action run", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_write"]], "x-oauth-scope": "environment:write" } }, @@ -1174,11 +1202,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get action run logs" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["action_runs_read"] }], + "security": [{ "bearer": [] }], "summary": "Get the logs of an action run", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -1203,8 +1232,8 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "responses": { @@ -1223,11 +1252,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_read"] }], + "security": [{ "bearer": [] }], "summary": "Get project api keys", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "post": { @@ -1250,8 +1280,8 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "requestBody": { @@ -1271,11 +1301,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Creates a new API key for the project", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -1310,11 +1341,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_read"] }], + "security": [{ "bearer": [] }], "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.", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "put": { @@ -1337,8 +1369,8 @@ "name": "enabled", "required": true, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "responses": { @@ -1354,11 +1386,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_write"] }], + "security": [{ "bearer": [] }], "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.", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -1385,6 +1418,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -1393,8 +1427,8 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "requestBody": { @@ -1414,11 +1448,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates an API key for the project", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -1443,6 +1478,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -1451,8 +1487,8 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", + "schema": { "example": "true", "type": "string" } } ], "responses": { @@ -1466,11 +1502,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_read"] }], + "security": [{ "bearer": [] }], "summary": "Get API key", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "delete": { @@ -1495,6 +1532,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -1504,14 +1542,14 @@ "required": false, "in": "query", "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "schema": { "example": true, "type": "string" } }, { "name": "was_compromised", "required": false, "in": "query", "description": "Boolean string, true or false", - "schema": { "example": false, "type": "boolean" } + "schema": { "example": false, "type": "string" } }, { "name": "reason", @@ -1531,11 +1569,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["api_gateway_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Deletes an API key for the project", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -1572,15 +1611,12 @@ }, "500": { "description": "Failed to retrieve database branches" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_read"] }, - { "fga_permissions": ["branching_development_read"] } - ], + "security": [{ "bearer": [] }], "summary": "List all database branches", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" }, "post": { @@ -1616,15 +1652,12 @@ }, "500": { "description": "Failed to create database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_create"] }, - { "fga_permissions": ["branching_development_create"] } - ], + "security": [{ "bearer": [] }], "summary": "Create a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_create"], ["branching_production_create"]], "x-oauth-scope": "environment:write" }, "delete": { @@ -1652,11 +1685,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to disable preview branching" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["branching_production_delete"] }], + "security": [{ "bearer": [] }], "summary": "Disables preview branching", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_production_delete"]], "x-oauth-scope": "environment:write" } }, @@ -1694,15 +1728,12 @@ }, "500": { "description": "Failed to fetch database branch" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["branching_production_read"] }, - { "fga_permissions": ["branching_development_read"] } - ], + "security": [{ "bearer": [] }], "summary": "Get a database branch", "tags": ["Environments"], "x-badges": [{ "name": "OAuth scope: environment:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" } }, @@ -1738,11 +1769,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's custom hostname config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["custom_domain_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets project's custom hostname config", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:read", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_read"]], "x-oauth-scope": "domains:read" }, "delete": { @@ -1766,7 +1798,7 @@ "required": false, "in": "query", "description": "If true, also removes the custom domain add-on from the project subscription.", - "schema": { "default": "false", "type": "boolean" } + "schema": { "type": "string" } } ], "responses": { @@ -1776,11 +1808,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete project custom hostname configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["custom_domain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Deletes a project's custom hostname configuration", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -1824,11 +1857,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project custom hostname configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["custom_domain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Updates project's custom hostname configuration", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -1864,11 +1898,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to verify project custom hostname configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["custom_domain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Attempts to verify the DNS configuration for project's custom hostname configuration", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -1904,11 +1939,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to activate project custom hostname configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["custom_domain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Activates a custom hostname for a project.", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -1934,7 +1970,38 @@ "200": { "description": "", "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/JitStateResponse" } } + "application/json": { + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "type": "object", + "properties": { + "state": { "type": "string", "enum": ["enabled", "disabled"] }, + "appliedSuccessfully": { "type": "boolean" } + }, + "required": ["state"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "state": { "type": "string", "const": "unavailable" }, + "unavailableReason": { + "type": "string", + "enum": [ + "postgres_upgrade_required", + "ssl_enforcement_required", + "temporarily_unavailable" + ] + } + }, + "required": ["state", "unavailableReason"], + "additionalProperties": false + } + ] + } + } } }, "401": { "description": "Unauthorized" }, @@ -1942,11 +2009,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's temporary access configuration." } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Get project's temporary access configuration.", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["security", "management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -1978,7 +2046,38 @@ "200": { "description": "", "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/JitStateResponse" } } + "application/json": { + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "type": "object", + "properties": { + "state": { "type": "string", "enum": ["enabled", "disabled"] }, + "appliedSuccessfully": { "type": "boolean" } + }, + "required": ["state"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "state": { "type": "string", "const": "unavailable" }, + "unavailableReason": { + "type": "string", + "enum": [ + "postgres_upgrade_required", + "ssl_enforcement_required", + "temporarily_unavailable" + ] + } + }, + "required": ["state", "unavailableReason"], + "additionalProperties": false + } + ] + } + } } }, "401": { "description": "Unauthorized" }, @@ -1986,11 +2085,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's temporary access configuration." } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Update project's temporary access configuration.", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["security", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "database:write" } }, @@ -2026,11 +2126,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's network bans" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_network_bans_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets project's network bans", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_read"]], "x-oauth-scope": "projects:read" } }, @@ -2066,11 +2167,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's enriched network bans" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_network_bans_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets project's network bans with additional information about which databases they affect", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_read"]], "x-oauth-scope": "projects:read" } }, @@ -2107,11 +2209,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove network bans." } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_network_bans_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Remove network bans.", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_write"]], "x-oauth-scope": "projects:write" } }, @@ -2147,14 +2250,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's network restrictions" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["database_network_restrictions_read"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets project's network restrictions", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_read"]], "x-oauth-scope": "projects:read" }, "patch": { @@ -2196,14 +2297,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project network restrictions" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["database_network_restrictions_write"] } - ], + "security": [{ "bearer": [] }], "summary": "[Alpha] Updates project's network restrictions by adding or removing CIDRs", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_write"]], "x-oauth-scope": "projects:write" } }, @@ -2247,14 +2346,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project network restrictions" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["database_network_restrictions_write"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Updates project's network restrictions", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_write"]], "x-oauth-scope": "projects:write" } }, @@ -2290,11 +2387,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's pgsodium config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets project's pgsodium config", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "secrets:read" }, "put": { @@ -2336,11 +2434,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's pgsodium config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "secrets:write" } }, @@ -2376,11 +2475,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's postgrest config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["data_api_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's postgrest config", "tags": ["Rest"], "x-badges": [{ "name": "OAuth scope: rest:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["data_api_config_read"]], "x-oauth-scope": "rest:read" }, "patch": { @@ -2422,11 +2522,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's postgrest config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["data_api_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates project's postgrest config", "tags": ["Rest"], "x-badges": [{ "name": "OAuth scope: rest:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["data_api_config_write"]], "x-oauth-scope": "rest:write" } }, @@ -2462,11 +2563,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets a specific project that belongs to the authenticated user", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" }, "delete": { @@ -2499,11 +2601,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Deletes the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra", "dev-workflows"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" }, "patch": { @@ -2543,11 +2646,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -2587,11 +2691,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's secrets" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_secrets_read"] }], + "security": [{ "bearer": [] }], "summary": "List all secrets", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_read"]], "x-oauth-scope": "secrets:read" }, "post": { @@ -2625,11 +2730,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create project's secrets" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_secrets_write"] }], + "security": [{ "bearer": [] }], "summary": "Bulk create secrets", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_write"]], "x-oauth-scope": "secrets:write" }, "delete": { @@ -2663,11 +2769,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete secrets with given names" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_secrets_write"] }], + "security": [{ "bearer": [] }], "summary": "Bulk delete secrets", "tags": ["Secrets"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_write"]], "x-oauth-scope": "secrets:write" } }, @@ -2703,11 +2810,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's SSL enforcement config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_ssl_config_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Get project's SSL enforcement configuration.", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_ssl_config_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -2749,11 +2857,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's SSL enforcement configuration." } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_ssl_config_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Update project's SSL enforcement configuration.", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_ssl_config_write"]], "x-oauth-scope": "database:write" } }, @@ -2796,11 +2905,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to generate TypeScript types" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_read"] }], + "security": [{ "bearer": [] }], "summary": "Generate TypeScript types", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -2832,14 +2942,17 @@ } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } }, "401": { "description": "Unauthorized" }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project vanity subdomain configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["vanity_subdomain_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets current vanity subdomain config", "tags": ["Domains"], "x-allowed-plans": ["Pro", "Team", "Enterprise"], @@ -2848,6 +2961,7 @@ { "name": "Only available on Pro, Team, Enterprise", "position": "before" } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_read"]], "x-oauth-scope": "domains:read" }, "delete": { @@ -2874,11 +2988,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete project vanity subdomain configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["vanity_subdomain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Deletes a project's vanity subdomain configuration", "tags": ["Domains"], "x-badges": [{ "name": "OAuth scope: domains:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -2916,14 +3031,17 @@ } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } }, "401": { "description": "Unauthorized" }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to check project vanity subdomain configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["vanity_subdomain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Checks vanity subdomain availability", "tags": ["Domains"], "x-allowed-plans": ["Pro", "Team", "Enterprise"], @@ -2932,6 +3050,7 @@ { "name": "Only available on Pro, Team, Enterprise", "position": "before" } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -2969,14 +3088,17 @@ } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } }, "401": { "description": "Unauthorized" }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to activate project vanity subdomain configuration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["vanity_subdomain_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Activates a vanity subdomain for a project.", "tags": ["Domains"], "x-allowed-plans": ["Pro", "Team", "Enterprise"], @@ -2985,6 +3107,7 @@ { "name": "Only available on Pro, Team, Enterprise", "position": "before" } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -3026,14 +3149,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to initiate project upgrade" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["project_admin_write", "database_write"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Upgrades the project's Postgres version", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write", "database_write"]], "x-oauth-scope": "projects:write" } }, @@ -3069,14 +3190,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to determine project upgrade eligibility" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["project_admin_read", "database_read"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Returns the project's eligibility for upgrades", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read", "database_read"]], "x-oauth-scope": "projects:read" } }, @@ -3118,14 +3237,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project upgrade status" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["project_admin_read", "database_read"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Gets the latest status of the project's upgrade", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read", "database_read"]], "x-oauth-scope": "projects:read" } }, @@ -3161,11 +3278,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project readonly mode status" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_readonly_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Returns project's readonly mode status", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra", "support-tooling"], + "x-fga-permissions": [["database_readonly_config_read"]], "x-oauth-scope": "database:read" } }, @@ -3194,11 +3312,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to disable project's readonly mode" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_readonly_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Disables project's readonly mode for the next 15 minutes", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra", "support-tooling"], + "x-fga-permissions": [["database_readonly_config_write"]], "x-oauth-scope": "database:write" } }, @@ -3232,18 +3351,22 @@ "204": { "description": "" }, "401": { "description": "Unauthorized" }, "402": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to set up read replica" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_read_replicas_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Set up a read replica", "tags": ["Database"], "x-allowed-plans": ["Pro", "Team", "Enterprise"], "x-badges": [{ "name": "Only available on Pro, Team, Enterprise", "position": "before" }], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_read_replicas_write"]] } }, "/v1/projects/{ref}/read-replicas/remove": { @@ -3279,10 +3402,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove read replica" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_read_replicas_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Remove a read replica", "tags": ["Database"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_read_replicas_write"]] } }, "/v1/projects/{ref}/health": { @@ -3306,22 +3430,34 @@ "name": "services", "required": true, "in": "query", + "description": "Comma-separated list of enums or array of enums.", "schema": { - "example": ["auth", "rest"], - "type": "array", - "items": { - "type": "string", - "enum": [ - "auth", - "db", - "db_postgres_user", - "pooler", - "realtime", - "rest", - "storage", - "pg_bouncer" - ] - } + "example": ["auth,db", "auth"], + "anyOf": [ + { + "type": "string", + "description": "Comma-separated list of enums:\n\n- `auth`\n- `db`\n- `db_postgres_user`\n- `pooler`\n- `realtime`\n- `rest`\n- `storage`\n- `pg_bouncer`", + "example": ["auth,db", "auth"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "auth", + "db", + "db_postgres_user", + "pooler", + "realtime", + "rest", + "storage", + "pg_bouncer" + ] + }, + "description": "Array of enums.", + "example": ["{field}=auth&{field}=db", "{field}=auth"] + } + ] } }, { @@ -3348,11 +3484,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's service health status" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's service health status", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" } }, @@ -3387,11 +3524,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_write"] }], + "security": [{ "bearer": [] }], "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.", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -3424,11 +3562,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_read"] }], + "security": [{ "bearer": [] }], "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.", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]], "x-oauth-scope": "secrets:read" } }, @@ -3471,11 +3610,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Create a new signing key for the project in standby status", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -3508,11 +3648,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_read"] }], + "security": [{ "bearer": [] }], "summary": "List all signing keys for the project", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]], "x-oauth-scope": "secrets:read" } }, @@ -3526,6 +3667,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -3557,10 +3699,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_read"] }], + "security": [{ "bearer": [] }], "summary": "Get information about a signing key", "tags": ["Auth"], - "x-endpoint-owners": ["auth"] + "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]] }, "delete": { "operationId": "v1-remove-project-signing-key", @@ -3571,6 +3714,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -3602,11 +3746,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Remove a signing key from a project. Only possible if the key has been in revoked status for a while.", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "patch": { @@ -3618,6 +3763,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -3657,11 +3803,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_signing_keys_write"] }], + "security": [{ "bearer": [] }], "summary": "Update a signing key, mainly its status", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: secrets:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -3697,11 +3844,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's auth config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's auth config", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" }, "patch": { @@ -3743,14 +3891,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's auth config" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["auth_config_write", "project_admin_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Updates a project's auth config", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write", "project_admin_write"]], "x-oauth-scope": "auth:write" } }, @@ -3791,11 +3937,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Creates a new third-party auth integration", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -3831,11 +3978,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists all third-party auth integrations", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -3862,6 +4010,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "88888888-8888-4888-8888-888888888888", "type": "string" } @@ -3878,11 +4027,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Removes a third-party auth integration", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -3907,6 +4057,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "88888888-8888-4888-8888-888888888888", "type": "string" } @@ -3923,11 +4074,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Get a third-party integration", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -3955,11 +4107,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Pauses the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -3987,11 +4140,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Restarts the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -4028,11 +4182,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists available restore versions for the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" }, "post": { @@ -4058,11 +4213,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Restores the given project", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -4090,11 +4246,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Cancels the given project restoration", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -4131,10 +4288,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list project addons" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_add_ons_read"] }], + "security": [{ "bearer": [] }], "summary": "List billing addons and compute instance selections", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_read"]] }, "patch": { "description": "Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project.", @@ -4169,10 +4327,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to apply project addon" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_add_ons_write"] }], + "security": [{ "bearer": [] }], "summary": "Apply or update billing addons, including compute instance size", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_write"]] } }, "/v1/projects/{ref}/billing/addons/{addon_variant}": { @@ -4199,7 +4358,7 @@ "in": "path", "schema": { "example": "pitr_7", - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -4237,10 +4396,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove project addon" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_add_ons_write"] }], + "security": [{ "bearer": [] }], "summary": "Remove billing addons or revert compute instance sizing", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_write"]] } }, "/v1/projects/{ref}/claim-token": { @@ -4274,10 +4434,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-internal": true }, "post": { @@ -4310,13 +4471,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["organization_admin_write", "project_admin_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Creates project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]], "x-internal": true }, "delete": { @@ -4342,13 +4501,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["organization_admin_write", "project_admin_write"] } - ], + "security": [{ "bearer": [] }], "summary": "Revokes project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]], "x-internal": true } }, @@ -4385,11 +4542,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["advisors_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project performance advisors.", "tags": ["Advisors"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["advisors_read"]], "x-oauth-scope": "database:read" } }, @@ -4432,11 +4590,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["advisors_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project security advisors.", "tags": ["Advisors"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["advisors_read"]], "x-oauth-scope": "database:read" } }, @@ -4464,19 +4623,32 @@ "required": false, "in": "query", "description": "Custom SQL query to execute on the logs. See [querying logs](/docs/guides/telemetry/logs?queryGroups=product&product=postgres&queryGroups=source&source=edge_logs#querying-with-the-logs-explorer) for more details.", - "schema": { "type": "string" } + "schema": { + "example": "select event_message from edge_logs limit 10", + "type": "string" + } }, { "name": "iso_timestamp_start", "required": false, "in": "query", - "schema": { "format": "date-time", "example": "2025-03-01T00:00:00Z", "type": "string" } + "schema": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "example": "2025-03-01T00:00:00Z", + "type": "string" + } }, { "name": "iso_timestamp_end", "required": false, "in": "query", - "schema": { "format": "date-time", "example": "2025-03-01T23:59:59Z", "type": "string" } + "schema": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "example": "2025-03-01T23:59:59Z", + "type": "string" + } } ], "responses": { @@ -4491,11 +4663,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_logs_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's logs", "tags": ["Analytics"], "x-badges": [{ "name": "OAuth scope: analytics:read", "position": "after" }], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], "x-oauth-scope": "analytics:read" } }, @@ -4523,19 +4696,32 @@ "required": false, "in": "query", "description": "Custom SQL query to execute on the logs. See [querying logs](/docs/guides/telemetry/logs?queryGroups=product&product=postgres&queryGroups=source&source=edge_logs#querying-with-the-logs-explorer) for more details.", - "schema": { "type": "string" } + "schema": { + "example": "select event_message from edge_logs limit 10", + "type": "string" + } }, { "name": "iso_timestamp_start", "required": false, "in": "query", - "schema": { "format": "date-time", "example": "2025-03-01T00:00:00Z", "type": "string" } + "schema": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "example": "2025-03-01T00:00:00Z", + "type": "string" + } }, { "name": "iso_timestamp_end", "required": false, "in": "query", - "schema": { "format": "date-time", "example": "2025-03-01T23:59:59Z", "type": "string" } + "schema": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "example": "2025-03-01T23:59:59Z", + "type": "string" + } } ], "responses": { @@ -4550,11 +4736,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_logs_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets all project's logs in a single log stream", "tags": ["Analytics"], "x-badges": [{ "name": "OAuth scope: analytics:read", "position": "after" }], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], "x-oauth-scope": "analytics:read" } }, @@ -4600,10 +4787,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's usage api counts" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_usage_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's usage api counts", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] } }, "/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count": { @@ -4638,10 +4826,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's usage api requests count" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_usage_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's usage api requests count", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] } }, "/v1/projects/{ref}/analytics/endpoints/functions.combined-stats": { @@ -4690,10 +4879,52 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project's function combined statistics" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_usage_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets a project's function combined statistics", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] + } + }, + "/v1/projects/{ref}/analytics/endpoints/metrics": { + "get": { + "description": "Prometheus scrape endpoint. Returns metrics of a customer project in the Prometheus open exposition format.", + "operationId": "v1-scrape-project-metrics", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Prometheus / OpenMetrics text exposition", + "content": { + "text/plain": { "schema": { "type": "string" } }, + "application/openmetrics-text": { "schema": { "type": "string" } } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to fetch project's metrics" } + }, + "security": [{ "bearer": [] }], + "summary": "Scrape a project's metrics", + "tags": ["Analytics"], + "x-badges": [{ "name": "OAuth scope: analytics:read", "position": "after" }], + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], + "x-oauth-scope": "analytics:read" } }, "/v1/projects/{ref}/cli/login-role": { @@ -4734,11 +4965,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create login role" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Create a login role for CLI with temporary password", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_write"]], "x-oauth-scope": "database:write" }, "delete": { @@ -4772,17 +5004,17 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete login roles" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Delete existing login roles used by CLI", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_write"]], "x-oauth-scope": "database:write" } }, "/v1/projects/{ref}/database/migrations": { "get": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-list-migration-history", "parameters": [ { @@ -4813,15 +5045,15 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database migrations" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_read"] }], + "security": [{ "bearer": [] }], "summary": "List applied migration versions", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_read"]], "x-oauth-scope": "database:read" }, "post": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-apply-a-migration", "parameters": [ { @@ -4860,15 +5092,15 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to apply database migration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_write"] }], + "security": [{ "bearer": [] }], "summary": "Apply a database migration", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" }, "put": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-upsert-a-migration", "parameters": [ { @@ -4907,15 +5139,15 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to upsert database migration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_write"] }], + "security": [{ "bearer": [] }], "summary": "Upsert a database migration without applying", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" }, "delete": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-rollback-migrations", "parameters": [ { @@ -4946,17 +5178,17 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to rollback database migration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_write"] }], + "security": [{ "bearer": [] }], "summary": "Rollback database migrations and remove them from history table", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" } }, "/v1/projects/{ref}/database/migrations/{version}": { "get": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-get-a-migration", "parameters": [ { @@ -4993,15 +5225,15 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get database migration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_read"] }], + "security": [{ "bearer": [] }], "summary": "Fetch an existing entry from migration history", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_read"]], "x-oauth-scope": "database:read" }, "patch": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-patch-a-migration", "parameters": [ { @@ -5039,11 +5271,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to patch database migration" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_migrations_write"] }], + "security": [{ "bearer": [] }], "summary": "Patch an existing entry in migration history", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" } }, @@ -5078,15 +5311,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to run sql query" } }, - "security": [ - { "bearer": [] }, - { "fga_permissions": ["database_write"] }, - { "fga_permissions": ["database_read"] } - ], + "security": [{ "bearer": [] }], "summary": "[Beta] Run sql query", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"], ["database_write"]], "x-oauth-scope": "database:write" } }, @@ -5122,11 +5352,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to run read-only sql query" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_read"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Run a sql query as supabase_read_only_user", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -5155,11 +5386,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to enable Database Webhooks on the project" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_webhooks_config_write"] }], + "security": [{ "bearer": [] }], "summary": "[Beta] Enables Database Webhooks on the project", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_webhooks_config_write"]], "x-oauth-scope": "database:write" } }, @@ -5196,11 +5428,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets database metadata for the given project.", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "projects:read" } }, @@ -5244,11 +5477,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update database password" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates the database password", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_config_write"]], "x-oauth-scope": "database:write" } }, @@ -5283,11 +5517,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database jit access" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_read"] }], + "security": [{ "bearer": [] }], "summary": "Get user-id to role mappings for JIT access", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_read"]], "x-oauth-scope": "database:read" }, "post": { @@ -5330,11 +5565,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to authorize database jit access" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_read"] }], + "security": [{ "bearer": [] }], "summary": "Authorize user-id to role mappings for JIT access", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -5373,10 +5609,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update JIT access" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates a user mapping for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/list": { @@ -5412,10 +5649,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to list database jit access" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_read"] }], + "security": [{ "bearer": [] }], "summary": "List all user-id to role mappings for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/invite": { @@ -5459,10 +5697,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to invite external user" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_write"] }], + "security": [{ "bearer": [] }], "summary": "Invites an external user to a database for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/invite/accept": { @@ -5531,6 +5770,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "55555555-5555-4555-8555-555555555555", "type": "string" } @@ -5543,10 +5783,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to revoke invite for external user" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_write"] }], + "security": [{ "bearer": [] }], "summary": "Deletes the invite for an external user to a database for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/{user_id}": { @@ -5573,6 +5814,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "55555555-5555-4555-8555-555555555555", "type": "string" } @@ -5585,10 +5827,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove JIT access" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_jit_write"] }], + "security": [{ "bearer": [] }], "summary": "Delete JIT access by user-id", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/openapi": { @@ -5627,11 +5870,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to fetch PostgREST OpenAPI spec" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_read"] }], + "security": [{ "bearer": [] }], "summary": "Get PostgREST OpenAPI spec", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -5671,11 +5915,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's functions" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_read"] }], + "security": [{ "bearer": [] }], "summary": "List all functions", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:read", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" }, "post": { @@ -5712,15 +5957,13 @@ "name": "verify_jwt", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "schema": { "example": true, "type": "string" } }, { "name": "import_map", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": false, "type": "boolean" } + "schema": { "example": false, "type": "string" } }, { "name": "entrypoint_path", @@ -5768,11 +6011,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create project's function" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_write"] }], + "security": [{ "bearer": [] }], "summary": "Create a function", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" }, "put": { @@ -5816,11 +6060,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update functions" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_write"] }], + "security": [{ "bearer": [] }], "summary": "Bulk update functions", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -5856,8 +6101,7 @@ "name": "bundleOnly", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": false, "type": "boolean" } + "schema": { "example": false, "type": "string" } } ], "requestBody": { @@ -5883,11 +6127,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to deploy function" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_write"] }], + "security": [{ "bearer": [] }], "summary": "Deploy a function", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -5931,11 +6176,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve function with given slug" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_read"] }], + "security": [{ "bearer": [] }], "summary": "Retrieve a function", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:read", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" }, "patch": { @@ -5978,15 +6224,13 @@ "name": "verify_jwt", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": true, "type": "boolean" } + "schema": { "example": true, "type": "string" } }, { "name": "import_map", "required": false, "in": "query", - "description": "Boolean string, true or false", - "schema": { "example": false, "type": "boolean" } + "schema": { "example": false, "type": "string" } }, { "name": "entrypoint_path", @@ -6033,11 +6277,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update function with given slug" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_write"] }], + "security": [{ "bearer": [] }], "summary": "Update a function", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" }, "delete": { @@ -6072,11 +6317,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete function with given slug" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_write"] }], + "security": [{ "bearer": [] }], "summary": "Delete a function", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:write", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -6118,11 +6364,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve function body with given slug" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["edge_functions_read"] }], + "security": [{ "bearer": [] }], "summary": "Retrieve a function body", "tags": ["Edge Functions"], "x-badges": [{ "name": "OAuth scope: edge_functions:read", "position": "after" }], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" } }, @@ -6161,11 +6408,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get list of buckets" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["storage_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists all buckets", "tags": ["Storage"], "x-badges": [{ "name": "OAuth scope: storage:read", "position": "after" }], "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_read"]], "x-oauth-scope": "storage:read" } }, @@ -6199,10 +6447,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get database disk attributes" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_disk_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Get database disk attributes", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] }, "post": { "operationId": "v1-modify-database-disk", @@ -6234,10 +6483,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to modify database disk" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_disk_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Modify database disk", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_write"]] } }, "/v1/projects/{ref}/config/disk/util": { @@ -6272,10 +6522,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get disk utilization" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_disk_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Get disk utilization", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] } }, "/v1/projects/{ref}/config/disk/autoscale": { @@ -6310,10 +6561,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get project disk autoscale config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["infra_disk_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project disk autoscale config", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] } }, "/v1/projects/{ref}/config/storage": { @@ -6348,10 +6600,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's storage config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["storage_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's storage config", "tags": ["Storage"], - "x-endpoint-owners": ["storage"] + "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_config_read"]] }, "patch": { "operationId": "v1-update-storage-config", @@ -6385,10 +6638,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's storage config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["storage_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates project's storage config", "tags": ["Storage"], - "x-endpoint-owners": ["storage"] + "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_config_write"]] } }, "/v1/projects/{ref}/config/database/pgbouncer": { @@ -6423,11 +6677,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's pgbouncer config" } }, - "security": [{ "fga_permissions": ["database_read"] }], "summary": "Get project's pgbouncer config", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -6466,11 +6720,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's supavisor config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_pooling_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's supavisor config", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_pooling_config_read"]], "x-oauth-scope": "database:read" }, "patch": { @@ -6512,11 +6767,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's supavisor config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_pooling_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates project's supavisor config", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_pooling_config_write"]], "x-oauth-scope": "database:write" } }, @@ -6552,11 +6808,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve project's Postgres config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets project's Postgres config", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_config_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -6598,11 +6855,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update project's Postgres config" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["database_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates project's Postgres config", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_config_write"]], "x-oauth-scope": "database:write" } }, @@ -6637,10 +6895,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["realtime_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets realtime configuration", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_read"]] }, "patch": { "operationId": "v1-update-realtime-config", @@ -6673,10 +6932,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["realtime_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates realtime configuration", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_write"]] } }, "/v1/projects/{ref}/config/realtime/shutdown": { @@ -6704,10 +6964,11 @@ "404": { "description": "Tenant not found" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["realtime_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Shutdowns realtime connections for a project", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_write"]] } }, "/v1/projects/{ref}/config/auth/sso/providers": { @@ -6748,11 +7009,12 @@ "404": { "description": "SAML 2.0 support is not enabled for this project" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Creates a new SSO provider", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -6786,11 +7048,12 @@ "404": { "description": "SAML 2.0 support is not enabled for this project" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists all SSO providers", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -6817,6 +7080,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -6838,11 +7102,12 @@ }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets a SSO provider by its UUID", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:read", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" }, "put": { @@ -6867,6 +7132,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -6894,11 +7160,12 @@ }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates a SSO provider by its UUID", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "delete": { @@ -6923,6 +7190,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -6944,11 +7212,12 @@ }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["auth_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Removes a SSO provider by its UUID", "tags": ["Auth"], "x-badges": [{ "name": "OAuth scope: auth:write", "position": "after" }], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" } }, @@ -6982,11 +7251,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get backups" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_read"] }], + "security": [{ "bearer": [] }], "summary": "Lists all backups", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-oauth-scope": "database:read" } }, @@ -7020,11 +7290,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_write"] }], + "security": [{ "bearer": [] }], "summary": "Restores a PITR backup for a database", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-oauth-scope": "database:write" } }, @@ -7067,11 +7338,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_write"] }], + "security": [{ "bearer": [] }], "summary": "Initiates a creation of a restore point for a database", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" }, @@ -7112,11 +7384,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to get requested restore points" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_read"] }], + "security": [{ "bearer": [] }], "summary": "Get restore points for project", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-internal": true, "x-oauth-scope": "database:read" } @@ -7151,11 +7424,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_write"] }], + "security": [{ "bearer": [] }], "summary": "Restores a physical backup for a database", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" } @@ -7188,13 +7462,18 @@ } }, "401": { "description": "Unauthorized" }, - "402": { "description": "This feature requires the Enterprise organization plan." }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } + }, "403": { "description": "Forbidden action" }, "404": { "description": "Project or backup schedule not found" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve backup schedule" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets the backup schedule for a project", "tags": ["Database"], "x-allowed-plans": ["Enterprise"], @@ -7203,6 +7482,7 @@ { "name": "Only available on Enterprise", "position": "before" } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-oauth-scope": "database:read" }, "patch": { @@ -7242,13 +7522,18 @@ }, "400": { "description": "Invalid schedule_for format" }, "401": { "description": "Unauthorized" }, - "402": { "description": "This feature requires the Enterprise organization plan." }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/PlanGateErrorBody" } } + } + }, "403": { "description": "Forbidden action" }, "404": { "description": "Project or backup schedule not found" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update backup schedule" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_write"] }], + "security": [{ "bearer": [] }], "summary": "Updates the backup schedule time for a project", "tags": ["Database"], "x-allowed-plans": ["Enterprise"], @@ -7257,6 +7542,7 @@ { "name": "Only available on Enterprise", "position": "before" } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-oauth-scope": "database:write" } }, @@ -7290,11 +7576,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["backups_write"] }], + "security": [{ "bearer": [] }], "summary": "Initiates an undo to a given restore point", "tags": ["Database"], "x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" } @@ -7329,11 +7616,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Get entitlements for an organization", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["organization_admin_read"]], "x-oauth-scope": "organizations:read" } }, @@ -7366,11 +7654,12 @@ } } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["members_read"] }], + "security": [{ "bearer": [] }], "summary": "List members of an organization", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -7403,11 +7692,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets information about the organization", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_read"]], "x-oauth-scope": "organizations:read" } }, @@ -7446,10 +7736,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Gets project details for the specified organization and claim token", "tags": ["Organizations"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]], "x-internal": true }, "post": { @@ -7479,10 +7770,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Claims project for the specified organization", "tags": ["Organizations"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]], "x-internal": true } }, @@ -7507,7 +7799,13 @@ "required": false, "in": "query", "description": "Number of projects to skip", - "schema": { "minimum": 0, "default": 0, "example": 0, "type": "integer" } + "schema": { + "minimum": 0, + "maximum": 9007199254740991, + "default": 0, + "example": 0, + "type": "integer" + } }, { "name": "limit", @@ -7563,11 +7861,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve projects" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_projects_read"] }], + "security": [{ "bearer": [] }], "summary": "Gets all projects for the given organization", "tags": ["Projects"], "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_projects_read"]], "x-oauth-scope": "projects:read" } } @@ -7629,7 +7928,12 @@ ] }, "db_host": { "type": "string" }, - "db_port": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, + "db_port": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, "db_user": { "type": "string" }, "db_pass": { "type": "string" }, "jwt_secret": { "type": "string" } @@ -7650,9 +7954,9 @@ "branch_name": { "type": "string" }, "git_branch": { "type": "string" }, "reset_on_push": { - "type": "boolean", "description": "This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead.", - "deprecated": true + "deprecated": true, + "type": "boolean" }, "persistent": { "type": "boolean" }, "status": { @@ -7684,17 +7988,26 @@ "BranchResponse": { "type": "object", "properties": { - "id": { "type": "string", "format": "uuid" }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "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" }, + "pr_number": { + "type": "integer", + "format": "int32", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "latest_check_run_id": { - "type": "number", "description": "This field is deprecated and will not be populated.", - "deprecated": true + "deprecated": true, + "type": "number" }, "persistent": { "type": "boolean" }, "status": { @@ -7710,12 +8023,28 @@ "description": "This field is deprecated. List action runs to get branch status instead.", "deprecated": true }, - "created_at": { "type": "string", "format": "date-time" }, - "updated_at": { "type": "string", "format": "date-time" }, - "review_requested_at": { "type": "string", "format": "date-time" }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "review_requested_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, "with_data": { "type": "boolean" }, "notify_url": { "type": "string", "format": "uri" }, - "deletion_scheduled_at": { "type": "string", "format": "date-time" }, + "deletion_scheduled_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, "preview_project_status": { "type": "string", "enum": [ @@ -7852,9 +8181,9 @@ "db_pass": { "type": "string", "description": "Database password" }, "name": { "type": "string", "maxLength": 256, "description": "Name of your project" }, "organization_id": { - "type": "string", + "deprecated": true, "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true + "type": "string" }, "organization_slug": { "type": "string", @@ -7863,13 +8192,12 @@ "example": "tsrqponmlkjihgfedcba" }, "plan": { - "type": "string", - "enum": ["free", "pro"], "deprecated": true, - "description": "Subscription Plan is now set on organization level and is ignored in this request" + "description": "Subscription Plan is now set on organization level and is ignored in this request", + "type": "string", + "enum": ["free", "pro"] }, "region": { - "type": "string", "description": "Region you want your server to reside in. Use region_selection instead.", "deprecated": true, "enum": [ @@ -7891,10 +8219,11 @@ "ca-central-1", "ap-south-1", "sa-east-1" - ] + ], + "type": "string" }, "region_selection": { - "discriminator": { "propertyName": "type" }, + "description": "Region selection. Only one of region or region_selection can be specified.", "oneOf": [ { "type": "object", @@ -7939,13 +8268,12 @@ }, "required": ["type", "code"] } - ], - "description": "Region selection. Only one of region or region_selection can be specified." + ] }, "kps_enabled": { - "type": "boolean", "deprecated": true, - "description": "This field is deprecated and is ignored in this request" + "description": "This field is deprecated and is ignored in this request", + "type": "boolean" }, "desired_instance_size": { "description": "Desired instance size. Omit this field to always default to the smallest possible size.", @@ -7973,24 +8301,25 @@ ] }, "template_url": { + "description": "Template URL used to create the project from the CLI.", "type": "string", - "format": "uri", - "description": "Template URL used to create the project from the CLI." + "format": "uri" }, + "release_channel": { "deprecated": true, "type": "null" }, + "postgres_engine": { "deprecated": true, "type": "null" }, "high_availability": { - "type": "boolean", - "description": "[Experimental] Whether to enable high availability for the project." + "description": "[Experimental] Whether to enable high availability for the project.", + "type": "boolean" } }, "required": ["db_pass", "name", "organization_slug"], - "additionalProperties": false, - "hideDefinitions": ["release_channel", "postgres_engine"], "example": { "db_pass": "correct-horse-battery-staple", "name": "acme-prod", "organization_slug": "tsrqponmlkjihgfedcba", "region": "us-east-1" - } + }, + "additionalProperties": false }, "V1ProjectResponse": { "type": "object", @@ -8193,8 +8522,8 @@ "type": "object", "properties": { "name": { "type": "string", "maxLength": 256 } }, "required": ["name"], - "additionalProperties": false, - "example": { "name": "Acme" } + "example": { "name": "Acme" }, + "additionalProperties": false }, "OAuthTokenBody": { "type": "object", @@ -8207,24 +8536,27 @@ "urn:ietf:params:oauth:grant-type:jwt-bearer" ] }, - "client_id": { "type": "string", "format": "uuid" }, + "client_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "client_secret": { "type": "string" }, "code": { "type": "string" }, "code_verifier": { "type": "string" }, "redirect_uri": { "type": "string" }, "refresh_token": { "type": "string" }, "assertion": { - "type": "string", - "description": "IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only." + "description": "IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only.", + "type": "string" }, "resource": { + "description": "Resource indicator for MCP (Model Context Protocol) clients", "type": "string", - "format": "uri", - "description": "Resource indicator for MCP (Model Context Protocol) clients" + "format": "uri" }, "scope": { "type": "string" } }, - "additionalProperties": false, "example": { "grant_type": "authorization_code", "client_id": "66666666-6666-4666-8666-666666666666", @@ -8233,17 +8565,22 @@ "code_verifier": "qW0Z6d9pQnW0mL1dK1q9wFq6Yz2nV5rA8jT3mP7sH4c", "redirect_uri": "https://app.acme.com/auth/callback", "scope": "projects:read projects:write" - } + }, + "additionalProperties": false }, "OAuthTokenResponse": { "type": "object", "properties": { "access_token": { "type": "string" }, "refresh_token": { - "type": "string", - "description": "The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`." + "description": "The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`.", + "type": "string" + }, + "expires_in": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, - "expires_in": { "type": "integer" }, "token_type": { "type": "string", "enum": ["Bearer"] } }, "required": ["access_token", "expires_in", "token_type"], @@ -8252,17 +8589,21 @@ "OAuthRevokeTokenBody": { "type": "object", "properties": { - "client_id": { "type": "string", "format": "uuid" }, + "client_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "client_secret": { "type": "string" }, "refresh_token": { "type": "string" } }, "required": ["client_id", "client_secret", "refresh_token"], - "additionalProperties": false, "example": { "client_id": "66666666-6666-4666-8666-666666666666", "client_secret": "sb_secret_live_example_9f4d3a206b2e4a7e8c91", "refresh_token": "oauth_refresh_9f4d3a206b2e4a7e8c91" - } + }, + "additionalProperties": false }, "SnippetList": { "type": "object", @@ -8345,9 +8686,9 @@ "type": "object", "properties": { "favorite": { - "type": "boolean", "deprecated": true, - "description": "Deprecated: Rely on root-level favorite property instead." + "description": "Deprecated: Rely on root-level favorite property instead.", + "type": "boolean" }, "schema_version": { "type": "string" }, "sql": { "type": "string" } @@ -8529,16 +8870,31 @@ "id": { "type": "string", "nullable": true }, "type": { "type": "string", - "enum": ["legacy", "publishable", "secret"], + "enum": ["legacy", "publishable", "secret", null], "nullable": true }, "prefix": { "type": "string", "nullable": true }, "name": { "type": "string" }, "description": { "type": "string", "nullable": true }, "hash": { "type": "string", "nullable": true }, - "secret_jwt_template": { "type": "object", "additionalProperties": {}, "nullable": true }, - "inserted_at": { "type": "string", "format": "date-time", "nullable": true }, - "updated_at": { "type": "string", "format": "date-time", "nullable": true } + "secret_jwt_template": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {}, + "nullable": true + }, + "inserted_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "nullable": true + }, + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "nullable": true + } }, "required": ["name"] }, @@ -8558,7 +8914,12 @@ "pattern": "^[a-z_][a-z0-9_]+$" }, "description": { "type": "string", "nullable": true }, - "secret_jwt_template": { "type": "object", "additionalProperties": {}, "nullable": true } + "secret_jwt_template": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {}, + "nullable": true + } }, "required": ["type", "name"], "example": { "type": "secret", "name": "ci_secret_key", "description": "CI deploy key" } @@ -8573,7 +8934,12 @@ "pattern": "^[a-z_][a-z0-9_]+$" }, "description": { "type": "string", "nullable": true }, - "secret_jwt_template": { "type": "object", "additionalProperties": {}, "nullable": true } + "secret_jwt_template": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {}, + "nullable": true + } }, "example": { "name": "ci_secret_key_rotated", "description": "Rotated after March release" } }, @@ -8637,6 +9003,25 @@ "notify_url": "https://example.com/webhooks/branches" } }, + "UpdateCustomHostnameResponseJsonValue": { + "description": "Any JSON-serializable value", + "anyOf": [ + { + "anyOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }], + "nullable": true + }, + { + "type": "array", + "items": { "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" } + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" + } + } + ] + }, "UpdateCustomHostnameResponse": { "type": "object", "properties": { @@ -8657,11 +9042,11 @@ "success": { "type": "boolean" }, "errors": { "type": "array", - "items": { "description": "Any JSON-serializable value" } + "items": { "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" } }, "messages": { "type": "array", - "items": { "description": "Any JSON-serializable value" } + "items": { "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" } }, "result": { "type": "object", @@ -8724,34 +9109,10 @@ }, "UpdateCustomHostnameBody": { "type": "object", - "properties": { "custom_hostname": { "type": "string", "maxLength": 253, "minLength": 1 } }, + "properties": { "custom_hostname": { "type": "string", "minLength": 1, "maxLength": 253 } }, "required": ["custom_hostname"], "example": { "custom_hostname": "docs.example.com" } }, - "JitStateResponse": { - "discriminator": { "propertyName": "state" }, - "oneOf": [ - { - "type": "object", - "properties": { - "state": { "type": "string", "enum": ["enabled", "disabled"] }, - "appliedSuccessfully": { "type": "boolean" } - }, - "required": ["state"] - }, - { - "type": "object", - "properties": { - "state": { "type": "string", "enum": ["unavailable"] }, - "unavailableReason": { - "type": "string", - "enum": ["postgres_upgrade_required", "temporarily_unavailable"] - } - }, - "required": ["state", "unavailableReason"] - } - ] - }, "JitAccessRequestRequest": { "type": "object", "properties": { "state": { "type": "string", "enum": ["enabled", "disabled"] } }, @@ -8793,8 +9154,8 @@ }, "requester_ip": { "default": false, - "type": "boolean", - "description": "Include requester's public IP in the list of addresses to unban." + "description": "Include requester's public IP in the list of addresses to unban.", + "type": "boolean" }, "identifier": { "type": "string" } }, @@ -8811,9 +9172,14 @@ "dbAllowedCidrs": { "type": "array", "items": { "type": "string" } }, "dbAllowedCidrsV6": { "type": "array", "items": { "type": "string" } } }, + "example": { + "dbAllowedCidrs": ["203.0.113.0/24"], + "dbAllowedCidrsV6": ["2001:db8::/32"] + }, "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." }, "old_config": { + "description": "Populated when a new config has been received, but not registered as successfully applied to a project.", "type": "object", "properties": { "dbAllowedCidrs": { "type": "array", "items": { "type": "string" } }, @@ -8822,12 +9188,19 @@ "example": { "dbAllowedCidrs": ["203.0.113.0/24"], "dbAllowedCidrsV6": ["2001:db8::/32"] - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." + } }, "status": { "type": "string", "enum": ["stored", "applied"] }, - "updated_at": { "type": "string", "format": "date-time" }, - "applied_at": { "type": "string", "format": "date-time" } + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "applied_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + } }, "required": ["entitlement", "config", "status"] }, @@ -8884,6 +9257,7 @@ "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." }, "old_config": { + "description": "Populated when a new config has been received, but not registered as successfully applied to a project.", "type": "object", "properties": { "dbAllowedCidrs": { @@ -8897,41 +9271,71 @@ "required": ["address", "type"] } } - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." + } + }, + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "applied_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, - "updated_at": { "type": "string", "format": "date-time" }, - "applied_at": { "type": "string", "format": "date-time" }, "status": { "type": "string", "enum": ["stored", "applied"] } }, "required": ["entitlement", "config", "status"] }, "PgsodiumConfigResponse": { "type": "object", - "properties": { "root_key": { "type": "string" } }, - "required": ["root_key"] + "properties": { + "root_key": { + "type": "string", + "description": "The pgsodium root key: 32 bytes, hex-encoded (64 characters)." + } + }, + "required": ["root_key"], + "example": { + "root_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + } }, "UpdatePgsodiumConfigBody": { "type": "object", - "properties": { "root_key": { "type": "string" } }, + "properties": { + "root_key": { + "type": "string", + "description": "The pgsodium root key: 32 bytes, hex-encoded (64 characters)." + } + }, "required": ["root_key"], - "example": { "root_key": "MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=" } + "example": { + "root_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + } }, "PostgrestConfigWithJWTSecretResponse": { "type": "object", "properties": { "db_schema": { "type": "string" }, - "max_rows": { "type": "integer" }, + "max_rows": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "db_extra_search_path": { "type": "string" }, "db_pool": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured based on compute size.", + "nullable": true }, "db_pool_acquisition_timeout": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured to 10.", + "nullable": true }, "jwt_secret": { "type": "string" } }, @@ -8958,17 +9362,25 @@ "type": "object", "properties": { "db_schema": { "type": "string" }, - "max_rows": { "type": "integer" }, + "max_rows": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "db_extra_search_path": { "type": "string" }, "db_pool": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured based on compute size.", + "nullable": true }, "db_pool_acquisition_timeout": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured to 10.", + "nullable": true } }, "required": [ @@ -8982,7 +9394,7 @@ "V1ProjectRefResponse": { "type": "object", "properties": { - "id": { "type": "integer" }, + "id": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "ref": { "type": "string" }, "name": { "type": "string" } }, @@ -9004,6 +9416,7 @@ "required": ["name", "value"] }, "CreateSecretBody": { + "maxItems": 100, "type": "array", "items": { "type": "object", @@ -9065,6 +9478,36 @@ }, "required": ["status"] }, + "PlanGateErrorBody": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human-readable explanation of the plan gate" + }, + "error": { + "description": "Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message.", + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable marker for plan-gated denials", + "enum": ["entitlement_required"] + }, + "feature": { + "type": "string", + "description": "Entitlement feature key that failed the check" + }, + "upgrade_url": { + "description": "Billing page URL for the organization, present when the org is resolvable", + "type": "string" + } + }, + "required": ["code", "feature"] + } + }, + "required": ["message"] + }, "VanitySubdomainBody": { "type": "object", "properties": { "vanity_subdomain": { "type": "string", "maxLength": 63 } }, @@ -9149,7 +9592,7 @@ "validation_errors": { "type": "array", "items": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -9215,7 +9658,12 @@ "type": "string", "enum": ["user_defined_objects_in_internal_schemas"] }, - "obj_type": { "type": "string", "enum": ["table", "function"] }, + "obj_type": { + "anyOf": [ + { "type": "string", "enum": ["table"] }, + { "type": "string", "enum": ["function"] } + ] + }, "schema_name": { "type": "string" }, "obj_name": { "type": "string" } }, @@ -9245,7 +9693,6 @@ "warnings": { "type": "array", "items": { - "discriminator": { "propertyName": "type" }, "oneOf": [ { "type": "object", @@ -9403,7 +9850,7 @@ }, "status": { "type": "string", "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"] }, "info": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -9423,7 +9870,11 @@ }, "db_connected": { "type": "boolean" }, "replication_connected": { "type": "boolean" }, - "connected_cluster": { "type": "integer" } + "connected_cluster": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } }, "required": [ "healthy", @@ -9446,17 +9897,29 @@ "SigningKeyResponse": { "type": "object", "properties": { - "id": { "type": "string", "format": "uuid" }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "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" } + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + } }, - "required": ["id", "algorithm", "status", "created_at", "updated_at"], + "required": ["id", "algorithm", "status", "public_jwk", "created_at", "updated_at"], "additionalProperties": false }, "CreateSigningKeyBody": { @@ -9465,18 +9928,21 @@ "algorithm": { "type": "string", "enum": ["EdDSA", "ES256", "RS256", "HS256"] }, "status": { "type": "string", "enum": ["in_use", "standby"] }, "private_jwk": { - "discriminator": { "propertyName": "kty" }, "oneOf": [ { "type": "object", "properties": { - "kid": { "type": "string", "format": "uuid" }, + "kid": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { - "type": "array", - "items": { "type": "string", "enum": ["sign", "verify"] }, "minItems": 2, - "maxItems": 2 + "maxItems": 2, + "type": "array", + "items": { "type": "string", "enum": ["sign", "verify"] } }, "ext": { "type": "boolean", "enum": [true] }, "kty": { "type": "string", "enum": ["RSA"] }, @@ -9496,13 +9962,17 @@ { "type": "object", "properties": { - "kid": { "type": "string", "format": "uuid" }, + "kid": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { - "type": "array", - "items": { "type": "string", "enum": ["sign", "verify"] }, "minItems": 2, - "maxItems": 2 + "maxItems": 2, + "type": "array", + "items": { "type": "string", "enum": ["sign", "verify"] } }, "ext": { "type": "boolean", "enum": [true] }, "kty": { "type": "string", "enum": ["EC"] }, @@ -9518,13 +9988,17 @@ { "type": "object", "properties": { - "kid": { "type": "string", "format": "uuid" }, + "kid": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { - "type": "array", - "items": { "type": "string", "enum": ["sign", "verify"] }, "minItems": 2, - "maxItems": 2 + "maxItems": 2, + "type": "array", + "items": { "type": "string", "enum": ["sign", "verify"] } }, "ext": { "type": "boolean", "enum": [true] }, "kty": { "type": "string", "enum": ["OKP"] }, @@ -9539,13 +10013,17 @@ { "type": "object", "properties": { - "kid": { "type": "string", "format": "uuid" }, + "kid": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { - "type": "array", - "items": { "type": "string", "enum": ["sign", "verify"] }, "minItems": 2, - "maxItems": 2 + "maxItems": 2, + "type": "array", + "items": { "type": "string", "enum": ["sign", "verify"] } }, "ext": { "type": "boolean", "enum": [true] }, "kty": { "type": "string", "enum": ["oct"] }, @@ -9559,8 +10037,8 @@ } }, "required": ["algorithm"], - "additionalProperties": false, - "example": { "algorithm": "RS256", "status": "standby" } + "example": { "algorithm": "RS256", "status": "standby" }, + "additionalProperties": false }, "SigningKeysResponse": { "type": "object", @@ -9570,17 +10048,29 @@ "items": { "type": "object", "properties": { - "id": { "type": "string", "format": "uuid" }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "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" } + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" + } }, - "required": ["id", "algorithm", "status", "created_at", "updated_at"], + "required": ["id", "algorithm", "status", "public_jwk", "created_at", "updated_at"], "additionalProperties": false } } @@ -9597,17 +10087,27 @@ } }, "required": ["status"], - "additionalProperties": false, - "example": { "status": "standby" } + "example": { "status": "standby" }, + "additionalProperties": false }, "AuthConfigResponse": { "type": "object", "properties": { - "api_max_request_duration": { "type": "integer", "nullable": true }, - "db_max_pool_size": { "type": "integer", "nullable": true }, + "api_max_request_duration": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "db_max_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "db_max_pool_size_unit": { "type": "string", - "enum": ["connections", "percent"], + "enum": ["connections", "percent", null], "nullable": true }, "disable_signup": { "type": "boolean", "nullable": true }, @@ -9727,11 +10227,25 @@ "hook_after_user_created_enabled": { "type": "boolean", "nullable": true }, "hook_after_user_created_uri": { "type": "string", "nullable": true }, "hook_after_user_created_secrets": { "type": "string", "nullable": true }, - "jwt_exp": { "type": "integer", "nullable": true }, + "jwt_exp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "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_otp_exp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "mailer_otp_length": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "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 }, @@ -9799,7 +10313,12 @@ }, "mailer_notifications_identity_linked_enabled": { "type": "boolean", "nullable": true }, "mailer_notifications_identity_unlinked_enabled": { "type": "boolean", "nullable": true }, - "mfa_max_enrolled_factors": { "type": "integer", "nullable": true }, + "mfa_max_enrolled_factors": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "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 }, @@ -9810,31 +10329,81 @@ "webauthn_rp_display_name": { "type": "string", "nullable": true }, "webauthn_rp_id": { "type": "string", "nullable": true }, "webauthn_rp_origins": { "type": "string", "nullable": true }, - "mfa_phone_otp_length": { "type": "integer" }, + "mfa_phone_otp_length": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "mfa_phone_template": { "type": "string", "nullable": true }, - "mfa_phone_max_frequency": { "type": "integer", "nullable": true }, + "mfa_phone_max_frequency": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "nimbus_oauth_client_id": { "type": "string", "nullable": true }, "nimbus_oauth_email_optional": { "type": "boolean", "nullable": true }, "nimbus_oauth_client_secret": { "type": "string", "nullable": true }, "password_hibp_enabled": { "type": "boolean", "nullable": true }, - "password_min_length": { "type": "integer", "nullable": true }, + "password_min_length": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "password_required_characters": { "type": "string", "enum": [ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~", - "" + "", + null ], "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 }, + "rate_limit_anonymous_users": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_email_sent": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_sms_sent": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_token_refresh": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_verify": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_otp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "rate_limit_web3": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "refresh_token_rotation_enabled": { "type": "boolean", "nullable": true }, "saml_enabled": { "type": "boolean", "nullable": true }, "saml_external_url": { "type": "string", "nullable": true }, @@ -9843,12 +10412,17 @@ "security_captcha_enabled": { "type": "boolean", "nullable": true }, "security_captcha_provider": { "type": "string", - "enum": ["turnstile", "hcaptcha"], + "enum": ["turnstile", "hcaptcha", null], "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_refresh_token_reuse_interval": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "security_update_password_require_reauthentication": { "type": "boolean", "nullable": true @@ -9859,19 +10433,38 @@ "sessions_timebox": { "type": "number", "nullable": true }, "site_url": { "type": "string", "nullable": true }, "sms_autoconfirm": { "type": "boolean", "nullable": true }, - "sms_max_frequency": { "type": "integer", "nullable": true }, + "sms_max_frequency": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "sms_messagebird_access_key": { "type": "string", "nullable": true }, "sms_messagebird_originator": { "type": "string", "nullable": true }, - "sms_otp_exp": { "type": "integer", "nullable": true }, - "sms_otp_length": { "type": "integer" }, + "sms_otp_exp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "sms_otp_length": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "sms_provider": { "type": "string", - "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"], + "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage", null], "nullable": true }, "sms_template": { "type": "string", "nullable": true }, "sms_test_otp": { "type": "string", "nullable": true }, - "sms_test_otp_valid_until": { "type": "string", "format": "date-time", "nullable": true }, + "sms_test_otp_valid_until": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", + "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 }, @@ -9884,9 +10477,19 @@ "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", "format": "email", "nullable": true }, + "smtp_admin_email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "nullable": true + }, "smtp_host": { "type": "string", "nullable": true }, - "smtp_max_frequency": { "type": "integer", "nullable": true }, + "smtp_max_frequency": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "smtp_pass": { "type": "string", "nullable": true }, "smtp_port": { "type": "string", "nullable": true }, "smtp_sender_name": { "type": "string", "nullable": true }, @@ -9896,7 +10499,11 @@ "oauth_server_allow_dynamic_registration": { "type": "boolean" }, "oauth_server_authorization_path": { "type": "string", "nullable": true }, "custom_oauth_enabled": { "type": "boolean" }, - "custom_oauth_max_providers": { "type": "integer" } + "custom_oauth_max_providers": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } }, "required": [ "api_max_request_duration", @@ -10144,7 +10751,12 @@ "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_admin_email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "nullable": true + }, "smtp_host": { "type": "string", "nullable": true }, "smtp_port": { "type": "string", "nullable": true }, "smtp_user": { "type": "string", "nullable": true }, @@ -10240,7 +10852,7 @@ "security_captcha_enabled": { "type": "boolean", "nullable": true }, "security_captcha_provider": { "type": "string", - "enum": ["turnstile", "hcaptcha"], + "enum": ["turnstile", "hcaptcha", null], "nullable": true }, "security_captcha_secret": { "type": "string", "nullable": true }, @@ -10309,7 +10921,8 @@ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~", - "" + "", + null ], "nullable": true }, @@ -10342,7 +10955,7 @@ "sms_otp_length": { "type": "integer", "minimum": 0, "maximum": 32767 }, "sms_provider": { "type": "string", - "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"], + "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage", null], "nullable": true }, "sms_messagebird_access_key": { "type": "string", "nullable": true }, @@ -10352,7 +10965,12 @@ "pattern": "^([0-9]{1,15}=[0-9]+,?)*$", "nullable": true }, - "sms_test_otp_valid_until": { "type": "string", "format": "date-time", "nullable": true }, + "sms_test_otp_valid_until": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", + "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 }, @@ -10479,13 +11097,23 @@ "external_zoom_client_id": { "type": "string", "nullable": true }, "external_zoom_email_optional": { "type": "boolean", "nullable": true }, "external_zoom_secret": { "type": "string", "nullable": true }, - "db_max_pool_size": { "type": "integer", "nullable": true }, + "db_max_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "db_max_pool_size_unit": { "type": "string", - "enum": ["connections", "percent"], + "enum": ["connections", "percent", null], + "nullable": true + }, + "api_max_request_duration": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "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 }, @@ -10537,7 +11165,11 @@ "ThirdPartyAuth": { "type": "object", "properties": { - "id": { "type": "string", "format": "uuid" }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "type": { "type": "string" }, "oidc_issuer_url": { "type": "string", "nullable": true }, "jwks_url": { "type": "string", "nullable": true }, @@ -10573,6 +11205,25 @@ }, "required": ["available_versions"] }, + "ListProjectAddonsResponseJsonValue": { + "description": "Any JSON-serializable value", + "anyOf": [ + { + "anyOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }], + "nullable": true + }, + { + "type": "array", + "items": { "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" } + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" + } + } + ] + }, "ListProjectAddonsResponse": { "type": "object", "properties": { @@ -10598,7 +11249,7 @@ "type": "object", "properties": { "id": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -10642,7 +11293,7 @@ }, "required": ["description", "type", "interval", "amount"] }, - "meta": { "description": "Any JSON-serializable value" } + "meta": { "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" } }, "required": ["id", "name", "price"] } @@ -10675,7 +11326,7 @@ "type": "object", "properties": { "id": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -10719,7 +11370,7 @@ }, "required": ["description", "type", "interval", "amount"] }, - "meta": { "description": "Any JSON-serializable value" } + "meta": { "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" } }, "required": ["id", "name", "price"] } @@ -10735,7 +11386,7 @@ "type": "object", "properties": { "addon_variant": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -10787,7 +11438,11 @@ "token_alias": { "type": "string" }, "expires_at": { "type": "string" }, "created_at": { "type": "string" }, - "created_by": { "type": "string", "format": "uuid" } + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + } }, "required": ["token_alias", "expires_at", "created_at", "created_by"] }, @@ -10798,7 +11453,11 @@ "token_alias": { "type": "string" }, "expires_at": { "type": "string" }, "created_at": { "type": "string" }, - "created_by": { "type": "string", "format": "uuid" } + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + } }, "required": ["token", "token_alias", "expires_at", "created_at", "created_by"] }, @@ -10811,7 +11470,6 @@ "type": "object", "properties": { "name": { - "type": "string", "enum": [ "unindexed_foreign_keys", "auth_users_exposed", @@ -10842,7 +11500,8 @@ "leaked_service_key", "no_backup_admin", "vulnerable_postgres_version" - ] + ], + "type": "string" }, "title": { "type": "string" }, "level": { "type": "string", "enum": ["ERROR", "WARN", "INFO"] }, @@ -10891,7 +11550,7 @@ "properties": { "result": { "type": "array", "items": {} }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, { "type": "object", @@ -10928,7 +11587,11 @@ "items": { "type": "object", "properties": { - "timestamp": { "type": "string", "format": "date-time" }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" + }, "total_auth_requests": { "type": "number" }, "total_realtime_requests": { "type": "number" }, "total_rest_requests": { "type": "number" }, @@ -10944,7 +11607,7 @@ } }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, { "type": "object", @@ -10985,7 +11648,7 @@ } }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, { "type": "object", @@ -11025,7 +11688,12 @@ "properties": { "role": { "type": "string", "minLength": 1 }, "password": { "type": "string", "minLength": 1 }, - "ttl_seconds": { "type": "integer", "minimum": 1, "format": "int64" } + "ttl_seconds": { + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991, + "format": "int64" + } }, "required": ["role", "password", "ttl_seconds"] }, @@ -11127,12 +11795,12 @@ "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], - "additionalProperties": true + "additionalProperties": {} } } }, "required": ["name", "schemas"], - "additionalProperties": true + "additionalProperties": {} } } }, @@ -11152,7 +11820,11 @@ "JitAccessResponse": { "type": "object", "properties": { - "user_id": { "type": "string", "format": "uuid" }, + "user_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "user_roles": { "type": "array", "items": { @@ -11167,7 +11839,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11175,7 +11853,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11193,7 +11877,20 @@ "type": "object", "properties": { "role": { "type": "string", "minLength": 1 }, - "rhost": { "type": "string", "minLength": 1 } + "rhost": { + "anyOf": [ + { + "type": "string", + "format": "ipv4", + "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$" + }, + { + "type": "string", + "format": "ipv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$" + } + ] + } }, "required": ["role", "rhost"], "example": { "role": "postgres", "rhost": "203.0.113.10" } @@ -11201,7 +11898,11 @@ "JitAuthorizeAccessResponse": { "type": "object", "properties": { - "user_id": { "type": "string", "format": "uuid" }, + "user_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "user_role": { "type": "object", "properties": { @@ -11214,7 +11915,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11222,7 +11929,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11241,11 +11954,15 @@ "items": { "type": "array", "items": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { - "user_id": { "type": "string", "format": "uuid" }, + "user_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "primary_email": { "type": "string", "nullable": true }, "invite_id": { "type": "null" }, "expires_at": { "type": "null" }, @@ -11263,7 +11980,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11271,7 +11994,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11290,7 +12019,11 @@ "properties": { "user_id": { "type": "null" }, "primary_email": { "type": "string" }, - "invite_id": { "type": "string", "format": "uuid" }, + "invite_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "expires_at": { "type": "string" }, "user_roles": { "type": "array", @@ -11306,7 +12039,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11314,7 +12053,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11337,7 +12082,12 @@ "UpdateJitAccessBody": { "type": "object", "properties": { - "user_id": { "type": "string", "format": "uuid", "minLength": 1 }, + "user_id": { + "type": "string", + "minLength": 1, + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "roles": { "type": "array", "items": { @@ -11352,7 +12102,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11360,7 +12116,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11388,7 +12150,12 @@ "InviteExternalUserJitAccessBody": { "type": "object", "properties": { - "email": { "type": "string", "format": "email", "minLength": 1 }, + "email": { + "type": "string", + "minLength": 1, + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, "roles": { "type": "array", "items": { @@ -11403,7 +12170,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11411,7 +12184,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11439,8 +12218,16 @@ "InviteExternalUserJitResponse": { "type": "object", "properties": { - "email": { "type": "string", "format": "email" }, - "invite_id": { "type": "string", "format": "uuid" }, + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, + "invite_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, "user_roles": { "type": "array", "items": { @@ -11455,7 +12242,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" + } + }, "required": ["cidr"] } }, @@ -11463,7 +12256,13 @@ "type": "array", "items": { "type": "object", - "properties": { "cidr": { "type": "string" } }, + "properties": { + "cidr": { + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" + } + }, "required": ["cidr"] } } @@ -11480,7 +12279,12 @@ "AcceptInviteExternalUserJitAccessBody": { "type": "object", "properties": { - "email": { "type": "string", "format": "email", "minLength": 1 }, + "email": { + "type": "string", + "minLength": 1, + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, "token": { "type": "string", "minLength": 1 } }, "required": ["email", "token"], @@ -11493,9 +12297,23 @@ "slug": { "type": "string" }, "name": { "type": "string" }, "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, - "version": { "type": "integer" }, - "created_at": { "type": "integer", "format": "int64" }, - "updated_at": { "type": "integer", "format": "int64" }, + "version": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "created_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, + "updated_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, "verify_jwt": { "type": "boolean" }, "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, @@ -11529,8 +12347,17 @@ "slug": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" }, "name": { "type": "string" }, "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, - "version": { "type": "integer" }, - "created_at": { "type": "integer", "format": "int64" }, + "version": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "created_at": { + "type": "integer", + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "verify_jwt": { "type": "boolean" }, "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, @@ -11563,9 +12390,23 @@ "slug": { "type": "string" }, "name": { "type": "string" }, "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, - "version": { "type": "integer" }, - "created_at": { "type": "integer", "format": "int64" }, - "updated_at": { "type": "integer", "format": "int64" }, + "version": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "created_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, + "updated_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, "verify_jwt": { "type": "boolean" }, "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, @@ -11594,7 +12435,7 @@ "required": ["entrypoint_path"] } }, - "required": ["metadata"], + "required": ["file", "metadata"], "example": { "file": ["./supabase/functions/hello-world/index.ts"], "metadata": { "entrypoint_path": "index.ts", "verify_jwt": true, "name": "Hello World" } @@ -11607,9 +12448,23 @@ "slug": { "type": "string" }, "name": { "type": "string" }, "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, - "version": { "type": "integer" }, - "created_at": { "type": "integer", "format": "int64" }, - "updated_at": { "type": "integer", "format": "int64" }, + "version": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "created_at": { + "type": "integer", + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "updated_at": { + "type": "integer", + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "verify_jwt": { "type": "boolean" }, "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, @@ -11625,9 +12480,23 @@ "slug": { "type": "string" }, "name": { "type": "string" }, "status": { "type": "string", "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, - "version": { "type": "integer" }, - "created_at": { "type": "integer", "format": "int64" }, - "updated_at": { "type": "integer", "format": "int64" }, + "version": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "created_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, + "updated_at": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, "verify_jwt": { "type": "boolean" }, "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, @@ -11666,13 +12535,28 @@ "type": "object", "properties": { "attributes": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { - "iops": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "size_gb": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "throughput_mibps": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, + "iops": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "size_gb": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "throughput_mibps": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, "type": { "type": "string", "enum": ["gp3"] } }, "required": ["iops", "size_gb", "type"] @@ -11680,8 +12564,18 @@ { "type": "object", "properties": { - "iops": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "size_gb": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, + "iops": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "size_gb": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, "type": { "type": "string", "enum": ["io2"] } }, "required": ["iops", "size_gb", "type"] @@ -11696,14 +12590,28 @@ "type": "object", "properties": { "attributes": { - "discriminator": { "propertyName": "type" }, "oneOf": [ { "type": "object", "properties": { - "iops": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "size_gb": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "throughput_mibps": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, + "iops": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "size_gb": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "throughput_mibps": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, "type": { "type": "string", "enum": ["gp3"] } }, "required": ["iops", "size_gb", "type"] @@ -11711,8 +12619,18 @@ { "type": "object", "properties": { - "iops": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, - "size_gb": { "type": "integer", "minimum": 0, "exclusiveMinimum": true }, + "iops": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, + "size_gb": { + "type": "integer", + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 + }, "type": { "type": "string", "enum": ["io2"] } }, "required": ["iops", "size_gb", "type"] @@ -11746,24 +12664,24 @@ "properties": { "growth_percent": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Growth percentage for disk autoscaling" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Growth percentage for disk autoscaling", + "nullable": true }, "min_increment_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Minimum increment size for disk autoscaling in GB" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Minimum increment size for disk autoscaling in GB", + "nullable": true }, "max_size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Maximum limit the disk size will grow to in GB" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Maximum limit the disk size will grow to in GB", + "nullable": true } }, "required": ["growth_percent", "min_increment_gb", "max_size_gb"] @@ -11771,7 +12689,12 @@ "StorageConfigResponse": { "type": "object", "properties": { - "fileSizeLimit": { "type": "integer", "format": "int64" }, + "fileSizeLimit": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "format": "int64" + }, "features": { "type": "object", "properties": { @@ -11794,9 +12717,9 @@ "type": "object", "properties": { "enabled": { "type": "boolean" }, - "maxNamespaces": { "type": "integer", "minimum": 0 }, - "maxTables": { "type": "integer", "minimum": 0 }, - "maxCatalogs": { "type": "integer", "minimum": 0 } + "maxNamespaces": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxTables": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxCatalogs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] }, @@ -11804,8 +12727,8 @@ "type": "object", "properties": { "enabled": { "type": "boolean" }, - "maxBuckets": { "type": "integer", "minimum": 0 }, - "maxIndexes": { "type": "integer", "minimum": 0 } + "maxBuckets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxIndexes": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": ["enabled", "maxBuckets", "maxIndexes"] } @@ -11848,9 +12771,9 @@ "properties": { "fileSizeLimit": { "type": "integer", + "format": "int64", "minimum": 0, - "maximum": 536870912000, - "format": "int64" + "maximum": 536870912000 }, "features": { "type": "object", @@ -11874,9 +12797,9 @@ "type": "object", "properties": { "enabled": { "type": "boolean" }, - "maxNamespaces": { "type": "integer", "minimum": 0 }, - "maxTables": { "type": "integer", "minimum": 0 }, - "maxCatalogs": { "type": "integer", "minimum": 0 } + "maxNamespaces": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxTables": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxCatalogs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] }, @@ -11884,8 +12807,8 @@ "type": "object", "properties": { "enabled": { "type": "boolean" }, - "maxBuckets": { "type": "integer", "minimum": 0 }, - "maxIndexes": { "type": "integer", "minimum": 0 } + "maxBuckets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "maxIndexes": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": ["enabled", "maxBuckets", "maxIndexes"] } @@ -11897,24 +12820,48 @@ "required": ["upstreamTarget"] } }, - "additionalProperties": false, "example": { "fileSizeLimit": 10485760, "features": { "imageTransformation": { "enabled": true } } - } + }, + "additionalProperties": false }, "V1PgbouncerConfigResponse": { "type": "object", "properties": { - "default_pool_size": { "type": "integer" }, + "default_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "ignore_startup_parameters": { "type": "string" }, - "max_client_conn": { "type": "integer" }, + "max_client_conn": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "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" } + "server_idle_timeout": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "server_lifetime": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "query_wait_timeout": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "reserve_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } } }, "SupavisorConfigResponse": { @@ -11925,12 +12872,26 @@ "is_using_scram_auth": { "type": "boolean" }, "db_user": { "type": "string" }, "db_host": { "type": "string" }, - "db_port": { "type": "integer" }, + "db_port": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "db_name": { "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 }, + "default_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, + "max_client_conn": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "pool_mode": { "type": "string", "enum": ["transaction", "session"] } }, "required": [ @@ -11958,9 +12919,9 @@ "nullable": true }, "pool_mode": { + "description": "Dedicated pooler mode for the project", "type": "string", - "enum": ["transaction", "session"], - "description": "Dedicated pooler mode for the project" + "enum": ["transaction", "session"] } }, "example": { "default_pool_size": 25, "pool_mode": "transaction" } @@ -11968,7 +12929,12 @@ "UpdateSupavisorConfigResponse": { "type": "object", "properties": { - "default_pool_size": { "type": "integer", "nullable": true }, + "default_pool_size": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "nullable": true + }, "pool_mode": { "type": "string" } }, "required": ["default_pool_size", "pool_mode"] @@ -12001,15 +12967,29 @@ "track_activity_query_size": { "type": "string" }, "max_connections": { "type": "integer", "minimum": 1, "maximum": 262143 }, "max_locks_per_transaction": { "type": "integer", "minimum": 10, "maximum": 2147483640 }, + "max_logical_replication_workers": { "type": "integer", "minimum": 0, "maximum": 262143 }, "max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, "maximum": 1024 }, "max_parallel_workers": { "type": "integer", "minimum": 0, "maximum": 1024 }, "max_parallel_workers_per_gather": { "type": "integer", "minimum": 0, "maximum": 1024 }, - "max_replication_slots": { "type": "integer" }, + "max_replication_slots": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "max_slot_wal_keep_size": { "type": "string" }, "max_standby_archive_delay": { "type": "string" }, "max_standby_streaming_delay": { "type": "string" }, + "max_sync_workers_per_subscription": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_wal_size": { "type": "string" }, - "max_wal_senders": { "type": "integer" }, + "max_wal_senders": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 }, "session_replication_role": { "type": "string", "enum": ["origin", "replica", "local"] }, "shared_buffers": { "type": "string" }, @@ -12062,15 +13042,29 @@ "track_activity_query_size": { "type": "string" }, "max_connections": { "type": "integer", "minimum": 1, "maximum": 262143 }, "max_locks_per_transaction": { "type": "integer", "minimum": 10, "maximum": 2147483640 }, + "max_logical_replication_workers": { "type": "integer", "minimum": 0, "maximum": 262143 }, "max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, "maximum": 1024 }, "max_parallel_workers": { "type": "integer", "minimum": 0, "maximum": 1024 }, "max_parallel_workers_per_gather": { "type": "integer", "minimum": 0, "maximum": 1024 }, - "max_replication_slots": { "type": "integer" }, + "max_replication_slots": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "max_slot_wal_keep_size": { "type": "string" }, "max_standby_archive_delay": { "type": "string" }, "max_standby_streaming_delay": { "type": "string" }, + "max_sync_workers_per_subscription": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_wal_size": { "type": "string" }, - "max_wal_senders": { "type": "integer" }, + "max_wal_senders": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "max_worker_processes": { "type": "integer", "minimum": 0, "maximum": 262143 }, "session_replication_role": { "type": "string", "enum": ["origin", "replica", "local"] }, "shared_buffers": { "type": "string" }, @@ -12095,82 +13089,82 @@ "hot_standby_feedback": { "type": "boolean" }, "restart_database": { "type": "boolean" } }, - "additionalProperties": false, "example": { "max_connections": 120, "shared_buffers": "256MB", "work_mem": "4MB", "statement_timeout": "60000ms" - } + }, + "additionalProperties": false }, "RealtimeConfigResponse": { "type": "object", "properties": { "private_only": { "type": "boolean", - "nullable": true, - "description": "Whether to only allow private channels" + "description": "Whether to only allow private channels", + "nullable": true }, "connection_pool": { "type": "integer", "minimum": 1, "maximum": 100, - "nullable": true, - "description": "Sets connection pool size for Realtime Authorization" + "description": "Sets connection pool size for Realtime Authorization", + "nullable": true }, "max_concurrent_users": { "type": "integer", "minimum": 1, "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of concurrent users rate limit" + "description": "Sets maximum number of concurrent users rate limit", + "nullable": true }, "max_events_per_second": { "type": "integer", "minimum": 1, "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of events per second rate per channel limit" + "description": "Sets maximum number of events per second rate per channel limit", + "nullable": true }, "max_bytes_per_second": { "type": "integer", "minimum": 1, "maximum": 10000000, - "nullable": true, - "description": "Sets maximum number of bytes per second rate per channel limit" + "description": "Sets maximum number of bytes per second rate per channel limit", + "nullable": true }, "max_channels_per_client": { "type": "integer", "minimum": 1, "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of channels per client rate limit" + "description": "Sets maximum number of channels per client rate limit", + "nullable": true }, "max_joins_per_second": { "type": "integer", "minimum": 1, "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of joins per second rate limit" + "description": "Sets maximum number of joins per second rate limit", + "nullable": true }, "max_presence_events_per_second": { "type": "integer", "minimum": 1, "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of presence events per second rate limit" + "description": "Sets maximum number of presence events per second rate limit", + "nullable": true }, "max_payload_size_in_kb": { "type": "integer", "minimum": 1, "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of payload size in KB rate limit" + "description": "Sets maximum number of payload size in KB rate limit", + "nullable": true }, "suspend": { "type": "boolean", - "nullable": true, - "description": "Disables the Realtime service for this project when true. Set to false to re-enable it." + "description": "Disables the Realtime service for this project when true. Set to false to re-enable it.", + "nullable": true }, "presence_enabled": { "type": "boolean", "description": "Whether to enable presence" } }, @@ -12249,12 +13243,12 @@ }, "presence_enabled": { "type": "boolean", "description": "Whether to enable presence" } }, - "additionalProperties": false, "example": { "private_only": false, "max_concurrent_users": 1000, "max_channels_per_client": 100 - } + }, + "additionalProperties": false }, "CreateProviderBody": { "type": "object", @@ -12278,7 +13272,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12323,7 +13317,6 @@ "saml": { "type": "object", "properties": { - "id": { "type": "string" }, "entity_id": { "type": "string" }, "metadata_url": { "type": "string" }, "metadata_xml": { "type": "string" }, @@ -12338,7 +13331,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12362,19 +13355,17 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["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" }, @@ -12394,7 +13385,6 @@ "saml": { "type": "object", "properties": { - "id": { "type": "string" }, "entity_id": { "type": "string" }, "metadata_url": { "type": "string" }, "metadata_xml": { "type": "string" }, @@ -12409,7 +13399,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12433,19 +13423,17 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["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" }, @@ -12464,7 +13452,6 @@ "saml": { "type": "object", "properties": { - "id": { "type": "string" }, "entity_id": { "type": "string" }, "metadata_url": { "type": "string" }, "metadata_xml": { "type": "string" }, @@ -12479,7 +13466,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12503,19 +13490,17 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["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" }, @@ -12540,7 +13525,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12576,7 +13561,6 @@ "saml": { "type": "object", "properties": { - "id": { "type": "string" }, "entity_id": { "type": "string" }, "metadata_url": { "type": "string" }, "metadata_xml": { "type": "string" }, @@ -12591,7 +13575,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12615,19 +13599,17 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["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" }, @@ -12642,7 +13624,6 @@ "saml": { "type": "object", "properties": { - "id": { "type": "string" }, "entity_id": { "type": "string" }, "metadata_url": { "type": "string" }, "metadata_xml": { "type": "string" }, @@ -12657,7 +13638,7 @@ "name": { "type": "string" }, "names": { "type": "array", "items": { "type": "string" } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} }, { "type": "number" }, { "type": "string" }, @@ -12681,19 +13662,17 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["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" }, @@ -12712,7 +13691,11 @@ "items": { "type": "object", "properties": { - "id": { "type": "integer" }, + "id": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, "is_physical_backup": { "type": "boolean" }, "status": { "type": "string", @@ -12726,8 +13709,16 @@ "physical_backup_data": { "type": "object", "properties": { - "earliest_physical_backup_date_unix": { "type": "integer" }, - "latest_physical_backup_date_unix": { "type": "integer" } + "earliest_physical_backup_date_unix": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "latest_physical_backup_date_unix": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } } } }, @@ -12736,7 +13727,12 @@ "V1RestorePitrBody": { "type": "object", "properties": { - "recovery_time_target_unix": { "type": "integer", "minimum": 0, "format": "int64" } + "recovery_time_target_unix": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991, + "format": "int64" + } }, "required": ["recovery_time_target_unix"], "example": { "recovery_time_target_unix": 1740787200 } @@ -12752,13 +13748,20 @@ "properties": { "name": { "type": "string" }, "status": { "type": "string", "enum": ["AVAILABLE", "PENDING", "REMOVED", "FAILED"] }, - "completed_on": { "type": "string", "format": "date-time", "nullable": true } + "completed_on": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "nullable": true + } }, "required": ["name", "status", "completed_on"] }, "V1RestoreBackupBody": { "type": "object", - "properties": { "id": { "type": "integer" } }, + "properties": { + "id": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 } + }, "required": ["id"], "example": { "id": 12345 } }, @@ -12767,12 +13770,14 @@ "properties": { "schedule_for": { "type": "string", + "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$", "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", "example": "04:00:00" }, "updated_at": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "description": "Timestamp of when the backup schedule was last updated.", "example": "2026-05-04T14:40:44+00:00" } @@ -12784,6 +13789,7 @@ "properties": { "schedule_for": { "type": "string", + "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$", "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", "example": "04:00:00" } @@ -12883,7 +13889,7 @@ "hasAccess": { "type": "boolean" }, "type": { "type": "string", "enum": ["boolean", "numeric", "set"] }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { "enabled": { "type": "boolean" } }, @@ -12937,7 +13943,6 @@ "opt_in_tags": { "type": "array", "items": { - "type": "string", "enum": [ "AI_SQL_GENERATOR_OPT_IN", "AI_DATA_GENERATOR_OPT_IN", @@ -13005,7 +14010,7 @@ }, "target_subscription_plan": { "type": "string", - "enum": ["free", "pro", "team", "enterprise", "platform"], + "enum": ["free", "pro", "team", "enterprise", "platform", null], "nullable": true } }, @@ -13021,7 +14026,11 @@ }, "expires_at": { "type": "string" }, "created_at": { "type": "string" }, - "created_by": { "type": "string", "format": "uuid" } + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + } }, "required": ["project", "preview", "expires_at", "created_at", "created_by"] }, diff --git a/apps/docs/spec/api_v2_openapi.json b/apps/docs/spec/api_v2_openapi.json index 3f82b25778f..2e07d5ac062 100644 --- a/apps/docs/spec/api_v2_openapi.json +++ b/apps/docs/spec/api_v2_openapi.json @@ -33,11 +33,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to fetch log drains" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_config_read"] }], + "security": [{ "bearer": [] }], "summary": "List project log drains", "tags": ["Analytics"], "x-badges": [{ "name": "OAuth scope: analytics_config:read", "position": "after" }], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_read"]], "x-oauth-scope": "analytics_config:read" }, "post": { @@ -74,13 +75,18 @@ }, "401": { "description": "Unauthorized" }, "402": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PlanGateErrorBodyV2" } + } + } }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to create a log drain" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Create a log drain for a project", "tags": ["Analytics"], "x-allowed-plans": ["Pro", "Team", "Enterprise"], @@ -89,6 +95,7 @@ { "name": "OAuth scope: analytics_config:write", "position": "after" } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" } }, @@ -114,7 +121,11 @@ "required": true, "in": "path", "description": "Log drains identifier", - "schema": { "format": "uuid", "type": "string" } + "schema": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } } ], "requestBody": { @@ -137,11 +148,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to update log drain" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Update a project log drain", "tags": ["Analytics"], "x-badges": [{ "name": "OAuth scope: analytics_config:write", "position": "after" }], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" }, "delete": { @@ -165,7 +177,11 @@ "required": true, "in": "path", "description": "Log drains identifier", - "schema": { "format": "uuid", "type": "string" } + "schema": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } } ], "responses": { @@ -175,11 +191,12 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to delete a log drain" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["analytics_config_write"] }], + "security": [{ "bearer": [] }], "summary": "Delete a project log drain", "tags": ["Analytics"], "x-badges": [{ "name": "OAuth scope: analytics_config:write", "position": "after" }], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" } }, @@ -222,10 +239,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "Previews transferring a project to a different organizations, shows eligibility and impact", "tags": ["Projects"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]] } }, "/v2/projects/{ref}/transfers": { @@ -260,10 +278,11 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Transfers a project to a different organization", "tags": ["Projects"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]] } }, "/v2/projects/{ref}/private-link/associations": { @@ -298,10 +317,11 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to retrieve AWS accounts for project" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_read"] }], + "security": [{ "bearer": [] }], "summary": "List AWS accounts attached to the project PrivateLink share", "tags": ["Projects"], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_read"]] }, "post": { "description": "Adds an AWS account to the project's PrivateLink configuration and schedules the AWS resources to be created.", @@ -340,23 +360,29 @@ }, "401": { "description": "Unauthorized" }, "402": { - "description": "This feature requires the Team, or Enterprise organization plan." + "description": "This feature requires the Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PlanGateErrorBodyV2" } + } + } }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to add AWS account to PrivateLink share" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Add an AWS account to the project PrivateLink share", "tags": ["Projects"], "x-allowed-plans": ["Team", "Enterprise"], "x-badges": [{ "name": "Only available on Team, Enterprise", "position": "before" }], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] } }, "/v2/projects/{ref}/private-link/associations/aws-account/{aws_account_id}": { "delete": { - "description": "Removes an AWS account from the project's PrivateLink configuration. Cleans up the associated AWS resources.", + "description": "Removes an AWS account from the project's PrivateLink configuration (targeting the primary database). Cleans up the associated AWS resources.", "operationId": "v2-delete-private-link-association", "parameters": [ { @@ -374,7 +400,7 @@ }, { "name": "aws_account_id", - "required": false, + "required": true, "in": "path", "description": "AWS account ID used in PrivateLink association", "schema": { "type": "string" } @@ -387,10 +413,58 @@ "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to remove AWS account from PrivateLink share" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["project_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Remove an AWS account from the project PrivateLink share", "tags": ["Projects"], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] + } + }, + "/v2/projects/{ref}/private-link/associations/aws-account/{aws_account_id}/database/{database_identifier}": { + "delete": { + "description": "Removes an AWS account from the project's PrivateLink configuration for the given read replica. Cleans up the associated AWS resources.", + "operationId": "v2-delete-private-link-association-for-database", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + }, + { + "name": "aws_account_id", + "required": true, + "in": "path", + "description": "AWS account ID used in PrivateLink association", + "schema": { "type": "string" } + }, + { + "name": "database_identifier", + "required": true, + "in": "path", + "description": "Identifier of the read replica this PrivateLink association targets", + "schema": { "type": "string" } + } + ], + "responses": { + "204": { "description": "" }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" }, + "500": { "description": "Failed to remove AWS account from PrivateLink share" } + }, + "security": [{ "bearer": [] }], + "summary": "Remove an AWS account from a specific database PrivateLink share", + "tags": ["Projects"], + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] } }, "/v2/organizations/{slug}/members": { @@ -415,12 +489,21 @@ "in": "query", "schema": { "properties": { - "size": { "type": "integer", "minimum": 1, "maximum": 100, "required": false }, - "after": { "type": "string", "format": "uuid", "required": false }, - "before": { "type": "string", "format": "uuid", "required": false } + "size": { "type": "integer", "minimum": 1, "maximum": 100 }, + "after": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "before": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + } }, "type": "object" - } + }, + "style": "deepObject" }, { "name": "filter", @@ -428,11 +511,16 @@ "in": "query", "schema": { "properties": { - "username": { "type": "string", "required": false }, - "primary_email": { "type": "string", "format": "email", "required": false } + "username": { "type": "string" }, + "primary_email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } }, "type": "object" - } + }, + "style": "deepObject" } ], "responses": { @@ -448,11 +536,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["members_read"] }], + "security": [{ "bearer": [] }], "summary": "List members of an organization", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -476,7 +565,11 @@ "name": "user_id", "required": true, "in": "path", - "schema": { "format": "uuid", "type": "string" } + "schema": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } } ], "requestBody": { @@ -497,17 +590,25 @@ } }, "401": { "description": "Unauthorized" }, - "402": { "description": "This feature requires the Enterprise organization plan." }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PlanGateErrorBodyV2" } + } + } + }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" }, "500": { "description": "Failed to assign organization member role" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["organization_admin_write"] }], + "security": [{ "bearer": [] }], "summary": "Assign or change an organization member role", "tags": ["Organizations"], "x-allowed-plans": ["Enterprise"], "x-badges": [{ "name": "Only available on Enterprise", "position": "before" }], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]] } }, "/v2/organizations/{slug}/roles": { @@ -540,11 +641,12 @@ "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["members_read"] }], + "security": [{ "bearer": [] }], "summary": "List roles of an organization", "tags": ["Organizations"], "x-badges": [{ "name": "OAuth scope: organizations:read", "position": "after" }], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -583,11 +685,18 @@ } }, "401": { "description": "Unauthorized" }, - "402": { "description": "This feature requires the Enterprise organization plan." }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PlanGateErrorBodyV2" } + } + } + }, "403": { "description": "Forbidden action" }, "429": { "description": "Rate limit exceeded" } }, - "security": [{ "bearer": [] }, { "fga_permissions": ["members_write"] }], + "security": [{ "bearer": [] }], "summary": "Creates organization invitations", "tags": ["Organizations Members Invitations"], "x-allowed-plans": ["Enterprise"], @@ -596,7 +705,14614 @@ { "name": "Only available on Enterprise", "position": "before" } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_write"]], "x-oauth-scope": "organizations:write" + }, + "delete": { + "description": "Bulk delete member invitations for an organization by email address.", + "operationId": "v2-delete-organization-invitations", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/V2DeleteInvitationsRequest" } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/V2DeleteInvitationsResponse" } + } + } + }, + "401": { "description": "Unauthorized" }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PlanGateErrorBodyV2" } + } + } + }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, + "security": [{ "bearer": [] }], + "summary": "Deletes organization invitations by email", + "tags": ["Organizations Members Invitations"], + "x-allowed-plans": ["Enterprise"], + "x-badges": [ + { "name": "OAuth scope: organizations:write", "position": "after" }, + { "name": "Only available on Enterprise", "position": "before" } + ], + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_write"]], + "x-oauth-scope": "organizations:write" + } + }, + "/v2/organizations/{slug}/projects": { + "get": { + "description": "Returns a cursor-paginated list of projects for the specified organization, including their databases.\n\nUse `page[after]` and `page[before]` to navigate pages and `page[size]` to control the number of projects returned per page.", + "operationId": "v2-list-organization-projects", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "properties": { + "size": { "type": "integer", "minimum": 1, "maximum": 100 }, + "after": { "type": "string", "minLength": 1 }, + "before": { "type": "string", "minLength": 1 } + }, + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "sort", + "required": false, + "in": "query", + "description": "Sort order by creation time: `inserted_at` (oldest first) or `-inserted_at` (newest first). Defaults to `inserted_at`.", + "schema": { + "example": "-inserted_at", + "type": "string", + "enum": ["inserted_at", "-inserted_at"] + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "Case-insensitive substring match on the project name.", + "schema": { "minLength": 1, "type": "string" } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/V2ListProjectsResponse" } + } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, + "security": [{ "bearer": [] }], + "summary": "List projects of an organization", + "tags": ["Organizations"], + "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_projects_read"]], + "x-oauth-scope": "projects:read" + } + }, + "/v2/organizations/{slug}/integrations/github/connections": { + "get": { + "description": "Returns a cursor-paginated list of the GitHub connections of the organization's projects.\n\nUse `page[after]` and `page[before]` to navigate pages and `page[size]` to control the page size.\nPaging walks the organization projects, so a page holds at most `page[size]` connections and can hold fewer (or none) when some of its projects are not connected.\nFollow `links.next` until it is `null` rather than stopping on a short page.\n\nUse `filter[project_ref]` to narrow the list down to a single project.", + "operationId": "v2-list-organization-github-connections", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "properties": { + "size": { "type": "integer", "minimum": 1, "maximum": 100 }, + "after": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "before": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + } + }, + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "filter", + "required": false, + "in": "query", + "schema": { + "properties": { + "project_ref": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + } + }, + "type": "object" + }, + "style": "deepObject" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/V2ListGitHubConnectionsResponse" } + } + } + }, + "401": { "description": "Unauthorized" }, + "403": { "description": "Forbidden action" }, + "429": { "description": "Rate limit exceeded" } + }, + "security": [{ "bearer": [] }], + "summary": "List GitHub connections of an organization", + "tags": ["Organizations"], + "x-badges": [{ "name": "OAuth scope: projects:read", "position": "after" }], + "x-endpoint-owners": ["management-api", "dev-workflows"], + "x-fga-permissions": [["organization_projects_read"]], + "x-oauth-scope": "projects:read" + } + }, + "/v2/projects/{ref}/webhooks/endpoints": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "query", + "name": "page[offset]", + "schema": { "default": "0", "type": "string", "pattern": "^\\d+$" }, + "description": "Offset for offset-based pagination.\n\nOffset should be dividable by `page[limit]` without a reminder (`offset % limit === 0`), otherwise it will cause weird behavior when used on a frontend." + }, + { + "in": "query", + "name": "page[limit]", + "schema": { "default": "20", "type": "string", "pattern": "^\\d+$" }, + "description": "Up to how many records to return." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Collection of endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { "type": "string", "maxLength": 512 }, + { "type": "null" } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0", + "anyOf": [{ "type": "string" }, { "type": "null" }] + }, + "prev": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the previous page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0" + }, + "next": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the next page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=20" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=30", + "anyOf": [{ "type": "string" }, { "type": "null" }] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List endpoints", + "description": "List all Webhook endpoints based on a project's ref or an organization's slug." + }, + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + } + ], + "tags": ["Project webhooks"], + "responses": { + "201": { + "description": "Created endpoint", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Create endpoint", + "description": "Create new endpoint configuration to subscribe to specific webhook events.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "default": true, + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + }, + "required": ["url", "event_types", "signing_secret"] + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Deleted endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { "type": "string", "maxLength": 512 }, + { "type": "null" } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete all endpoints", + "description": "Delete all endpoints including all events and deliveries.\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get endpoint", + "description": "Get details of a specific endpoint." + }, + "patch": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Updated endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Update endpoint", + "description": "Update endpoint's configuration.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + } + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Deleted endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete endpoint", + "description": "Delete the endpoint including all events and deliveries\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}/deliveries": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + }, + { + "in": "query", + "name": "page[before]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records before (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[after]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records after (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[size]", + "schema": { "default": "20", "type": "string", "pattern": "^\\d+$" }, + "description": "Up to how many records to return." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "List of deliveries", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { "type": "null" } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10", + "anyOf": [{ "type": "string" }, { "type": "null" }] + }, + "prev": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the previous page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + }, + "next": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the next page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "anyOf": [{ "type": "string" }, { "type": "null" }] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List deliveries", + "description": "List all deliveries for a specific endpoint in descending order (newest first).\n\nDeliveries which has expired are no longer available and will not be listed." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}/test": { + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "201": { + "description": "Event published", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.disabled" + }, + "message": { + "type": "string", + "const": "Bad Request: Endpoint is disabled" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "EndpointTestDisabled" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.wrong_event_type" + }, + "message": { + "type": "string", + "const": "Bad Request: Provided event type is not subscribed to by the endpoint" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "EndpointTestWrongEventType" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "EndpointTestDisabled": { + "value": { + "error": { + "code": "bad_request.endpoint.test.disabled", + "message": "Bad Request: Endpoint is disabled", + "description": "Endpoint is disabled, to send test event endpoint must first be enabled." + } + } + }, + "EndpointTestWrongEventType": { + "value": { + "error": { + "code": "bad_request.endpoint.test.wrong_event_type", + "message": "Bad Request: Provided event type is not subscribed to by the endpoint", + "description": "Only event types that the endpoint is subscribed to can be specified." + } + } + }, + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Send test event", + "description": "Publish a test event to verify the endpoint is working.\n\nWhich event type to use can be specified in the request body, otherwise\nit will use any matching type the endpoint is listening for.\n\nThe event will contain `is_test: true` in it's payload.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + } + }, + "required": ["type"] + } + }, + "required": ["type", "attributes"] + } + } + } + } + } + } + } + }, + "/v2/projects/{ref}/webhooks/deliveries/{id}": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { "type": "null" } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + }, + "event": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + }, + "payload": { + "type": "object", + "properties": { + "organization_slug": { + "type": "string", + "pattern": "^[\\w-]+$", + "description": "Organization slug", + "example": "tsrqponmlkjihgfedcba" + }, + "project_ref": { + "anyOf": [ + { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + { "type": "null" } + ] + } + }, + "required": ["organization_slug", "project_ref"], + "additionalProperties": {}, + "description": "Final data sent to the consumer." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of event publication." + } + }, + "required": ["type", "payload", "timestamp"] + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp", + "event" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.delivery" }, + "message": { "type": "string", "const": "Not Found: Delivery not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get delivery", + "description": "Get details of a specific delivery attempt." + } + }, + "/v2/projects/{ref}/webhooks/deliveries/{id}/retry": { + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.delivery" }, + "message": { "type": "string", "const": "Not Found: Delivery not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Retry delivery", + "description": "Retry delivering the same event again.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "query", + "name": "page[offset]", + "schema": { "default": "0", "type": "string", "pattern": "^\\d+$" }, + "description": "Offset for offset-based pagination.\n\nOffset should be dividable by `page[limit]` without a reminder (`offset % limit === 0`), otherwise it will cause weird behavior when used on a frontend." + }, + { + "in": "query", + "name": "page[limit]", + "schema": { "default": "20", "type": "string", "pattern": "^\\d+$" }, + "description": "Up to how many records to return." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Collection of endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { "type": "string", "maxLength": 512 }, + { "type": "null" } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0", + "anyOf": [{ "type": "string" }, { "type": "null" }] + }, + "prev": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the previous page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0" + }, + "next": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the next page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=20" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=30", + "anyOf": [{ "type": "string" }, { "type": "null" }] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List endpoints", + "description": "List all Webhook endpoints based on a project's ref or an organization's slug." + }, + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + } + ], + "tags": ["Organization webhooks"], + "responses": { + "201": { + "description": "Created endpoint", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Create endpoint", + "description": "Create new endpoint configuration to subscribe to specific webhook events.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "default": true, + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + }, + "required": ["url", "event_types", "signing_secret"] + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Deleted endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { "type": "string", "maxLength": 512 }, + { "type": "null" } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete all endpoints", + "description": "Delete all endpoints including all events and deliveries.\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get endpoint", + "description": "Get details of a specific endpoint." + }, + "patch": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Updated endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Update endpoint", + "description": "Update endpoint's configuration.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + } + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Deleted endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [{ "type": "v1.project.paused" }] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { "Authorization": "Bearer example_token" } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete endpoint", + "description": "Delete the endpoint including all events and deliveries\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}/deliveries": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + }, + { + "in": "query", + "name": "page[before]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records before (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[after]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records after (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[size]", + "schema": { "default": "20", "type": "string", "pattern": "^\\d+$" }, + "description": "Up to how many records to return." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "List of deliveries", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { "type": "null" } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10", + "anyOf": [{ "type": "string" }, { "type": "null" }] + }, + "prev": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the previous page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + }, + "next": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "URL path to the next page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "anyOf": [{ "type": "string" }, { "type": "null" }] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List deliveries", + "description": "List all deliveries for a specific endpoint in descending order (newest first).\n\nDeliveries which has expired are no longer available and will not be listed." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}/test": { + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "201": { + "description": "Event published", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.disabled" + }, + "message": { + "type": "string", + "const": "Bad Request: Endpoint is disabled" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "EndpointTestDisabled" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.wrong_event_type" + }, + "message": { + "type": "string", + "const": "Bad Request: Provided event type is not subscribed to by the endpoint" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "EndpointTestWrongEventType" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "EndpointTestDisabled": { + "value": { + "error": { + "code": "bad_request.endpoint.test.disabled", + "message": "Bad Request: Endpoint is disabled", + "description": "Endpoint is disabled, to send test event endpoint must first be enabled." + } + } + }, + "EndpointTestWrongEventType": { + "value": { + "error": { + "code": "bad_request.endpoint.test.wrong_event_type", + "message": "Bad Request: Provided event type is not subscribed to by the endpoint", + "description": "Only event types that the endpoint is subscribed to can be specified." + } + } + }, + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.endpoint" }, + "message": { "type": "string", "const": "Not Found: Endpoint not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Send test event", + "description": "Publish a test event to verify the endpoint is working.\n\nWhich event type to use can be specified in the request body, otherwise\nit will use any matching type the endpoint is listening for.\n\nThe event will contain `is_test: true` in it's payload.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + } + }, + "required": ["type"] + } + }, + "required": ["type", "attributes"] + } + } + } + } + } + } + } + }, + "/v2/organizations/{slug}/webhooks/deliveries/{id}": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" } + }, + { "type": "null" } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { "type": "string" }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { "type": "null" } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + }, + "event": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + }, + "payload": { + "type": "object", + "properties": { + "organization_slug": { + "type": "string", + "pattern": "^[\\w-]+$", + "description": "Organization slug", + "example": "tsrqponmlkjihgfedcba" + }, + "project_ref": { + "anyOf": [ + { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + { "type": "null" } + ] + } + }, + "required": ["organization_slug", "project_ref"], + "additionalProperties": {}, + "description": "Final data sent to the consumer." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of event publication." + } + }, + "required": ["type", "payload", "timestamp"] + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp", + "event" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.delivery" }, + "message": { "type": "string", "const": "Not Found: Delivery not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get delivery", + "description": "Get details of a specific delivery attempt." + } + }, + "/v2/organizations/{slug}/webhooks/deliveries/{id}/retry": { + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_slug" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "bad_request.invalid_ref" }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "unauthorized" }, + "message": { "type": "string", "const": "Unauthorized" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { "error": { "code": "unauthorized", "message": "Unauthorized" } } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.permission_denied" }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "forbidden.access_disabled" }, + "message": { "type": "string", "const": "Forbidden: Access disabled" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "not_found.delivery" }, + "message": { "type": "string", "const": "Not Found: Delivery not found" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "request_timeout" }, + "message": { "type": "string", "const": "Request Timeout" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "request_timeout", "message": "Request Timeout" } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "too_many_requests" }, + "message": { "type": "string", "const": "Too Many Requests" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { "code": "too_many_requests", "message": "Too Many Requests" } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string", "const": "internal_server_error" }, + "message": { "type": "string", "const": "Internal Server Error" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { "$ref": "#/components/schemas/APIErrorObject" } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { "APIErrorObject": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Retry delivery", + "description": "Retry delivering the same event again.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds." } } }, @@ -621,8 +15337,8 @@ "properties": { "type": { "type": "string", - "enum": ["log_drain"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["log_drain"] }, "id": { "type": "string" }, "attributes": { @@ -631,7 +15347,7 @@ "name": { "type": "string" }, "description": { "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -757,14 +15473,14 @@ "data": { "type": "object", "properties": { - "type": { "type": "string", "enum": ["log_drain"], "description": "Resource type." }, + "type": { "type": "string", "description": "Resource type.", "enum": ["log_drain"] }, "attributes": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -889,7 +15605,7 @@ "data": { "type": "object", "properties": { - "type": { "type": "string", "enum": ["log_drain"], "description": "Resource type." }, + "type": { "type": "string", "description": "Resource type.", "enum": ["log_drain"] }, "id": { "type": "string" }, "attributes": { "type": "object", @@ -897,7 +15613,7 @@ "name": { "type": "string" }, "description": { "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -1016,20 +15732,41 @@ }, "required": ["data"] }, + "PlanGateErrorBodyV2": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "HTTP status-derived error code, e.g. \"payment_required\"" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the plan gate" + } + }, + "required": ["code", "message"], + "description": "Plan-gate error object" + } + }, + "required": ["error"] + }, "UpdateLogDrainRequestOpenApi": { "type": "object", "properties": { "data": { "type": "object", "properties": { - "type": { "type": "string", "enum": ["log_drain"], "description": "Resource type." }, + "type": { "type": "string", "description": "Resource type.", "enum": ["log_drain"] }, "attributes": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -1156,8 +15893,8 @@ "properties": { "type": { "type": "string", - "enum": ["project_transfer_input"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["project_transfer_input"] }, "attributes": { "type": "object", @@ -1178,8 +15915,8 @@ "properties": { "type": { "type": "string", - "enum": ["project_transfer_result"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["project_transfer_result"] }, "attributes": { "type": "object", @@ -1237,8 +15974,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "id": { "type": "string" }, "attributes": { @@ -1252,8 +15989,8 @@ "description": "The AWS account ID this PrivateLink share is associated with." }, "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." + "description": "Human-readable name for the AWS account.", + "type": "string" }, "status": { "type": "string", @@ -1270,11 +16007,27 @@ "shared_at": { "type": "string", "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending.", + "nullable": true + }, + "database_type": { + "type": "string", + "enum": ["PRIMARY", "READ_REPLICA"], + "description": "Whether this PrivateLink share targets the primary database or a read replica." + }, + "database_identifier": { + "type": "string", + "description": "Identifier of the database this PrivateLink share targets - the project ref for the primary, or the read replica identifier." } }, - "required": ["aws_account_id", "status", "shared_at"] + "required": [ + "aws_account_id", + "status", + "shared_at", + "database_type", + "database_identifier" + ] } }, "required": ["type", "id", "attributes"] @@ -1291,8 +16044,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "attributes": { "type": "object", @@ -1305,9 +16058,13 @@ "description": "The AWS account ID to add to the project PrivateLink share." }, "account_name": { + "description": "Optional human-readable name for the AWS account.", "type": "string", - "maxLength": 128, - "description": "Optional human-readable name for the AWS account." + "maxLength": 128 + }, + "database_identifier": { + "description": "Identifier of the read replica this PrivateLink share should target. Omit to target the primary database.", + "type": "string" } }, "required": ["aws_account_id"] @@ -1326,8 +16083,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "id": { "type": "string" }, "attributes": { @@ -1341,8 +16098,8 @@ "description": "The AWS account ID this PrivateLink share is associated with." }, "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." + "description": "Human-readable name for the AWS account.", + "type": "string" }, "status": { "type": "string", @@ -1359,11 +16116,27 @@ "shared_at": { "type": "string", "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending.", + "nullable": true + }, + "database_type": { + "type": "string", + "enum": ["PRIMARY", "READ_REPLICA"], + "description": "Whether this PrivateLink share targets the primary database or a read replica." + }, + "database_identifier": { + "type": "string", + "description": "Identifier of the database this PrivateLink share targets - the project ref for the primary, or the read replica identifier." } }, - "required": ["aws_account_id", "status", "shared_at"] + "required": [ + "aws_account_id", + "status", + "shared_at", + "database_type", + "database_identifier" + ] } }, "required": ["type", "id", "attributes"] @@ -1381,22 +16154,26 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member"] + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" }, - "id": { "type": "string", "format": "uuid" }, "attributes": { "type": "object", "properties": { "username": { "type": "string", - "nullable": true, - "description": "Member's username" + "description": "Member's username", + "nullable": true }, "primary_email": { "type": "string", - "nullable": true, - "description": "Member's primary email" + "description": "Member's primary email", + "nullable": true }, "mfa_enabled": { "type": "boolean", @@ -1408,8 +16185,8 @@ }, "avatar_url": { "type": "string", - "nullable": true, - "description": "Member's avatar URL" + "description": "Member's avatar URL", + "nullable": true }, "roles": { "type": "array", @@ -1462,27 +16239,27 @@ "properties": { "first": { "type": "string", - "nullable": true, "description": "URL path to the first page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10" + "example": "/v2/organizations/my-org/members?page[size]=10", + "nullable": true }, "prev": { "type": "string", - "nullable": true, "description": "URL path to the previous page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + "example": "/v2/organizations/my-org/members?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true }, "next": { "type": "string", - "nullable": true, "description": "URL path to the next page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true }, "last": { "type": "string", - "nullable": true, "description": "URL path to the last page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295" + "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true } }, "required": ["prev", "next"] @@ -1498,8 +16275,8 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member_role"] }, "attributes": { "type": "object", @@ -1511,6 +16288,8 @@ "example": "developer" }, "projects": { + "description": "The projects to assign a project-scoped role for. If omitted, assigns an org-wide role.", + "minItems": 1, "type": "array", "items": { "type": "object", @@ -1522,9 +16301,7 @@ } }, "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to assign a project-scoped role for. If omitted, assigns an org-wide role." + } } }, "required": ["role"] @@ -1543,8 +16320,8 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member_role"] }, "attributes": { "type": "object", @@ -1587,10 +16364,9 @@ "properties": { "type": { "type": "string", - "enum": ["organization_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_role"] }, - "id": {}, "attributes": { "type": "object", "properties": { @@ -1613,19 +16389,25 @@ "type": "object", "properties": { "data": { + "minItems": 1, + "maxItems": 50, "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["organization_invitation"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_invitation"] }, "attributes": { "type": "object", "properties": { - "email": { "type": "string", "format": "email" }, + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, "role": { "type": "string", "enum": ["owner", "administrator", "developer", "read-only"], @@ -1633,6 +16415,8 @@ "example": "developer" }, "projects": { + "description": "The projects to limit a user to. If omitted, user will have org-wide access with the provided role.", + "minItems": 1, "type": "array", "items": { "type": "object", @@ -1644,9 +16428,7 @@ } }, "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to limit a user to. If omitted, user will have org-wide access with the provided role." + } }, "require_sso": { "type": "boolean" } }, @@ -1654,9 +16436,7 @@ } }, "required": ["type", "attributes"] - }, - "minItems": 1, - "maxItems": 50 + } } }, "required": ["data"] @@ -1713,7 +16493,13 @@ }, "meta": { "type": "object", - "properties": { "email": { "type": "string", "format": "email" } }, + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, "required": ["email"] } }, @@ -1730,13 +16516,18 @@ "properties": { "type": { "type": "string", - "enum": ["organization_invitation"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_invitation"] }, - "id": {}, "attributes": { "type": "object", - "properties": { "email": { "type": "string", "format": "email" } }, + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, "required": ["email"] } }, @@ -1745,6 +16536,397 @@ } }, "required": ["data"] + }, + "V2DeleteInvitationsRequest": { + "type": "object", + "properties": { + "data": { + "minItems": 1, + "maxItems": 100, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["organization_invitation"] + }, + "attributes": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, + "required": ["email"] + } + }, + "required": ["type", "attributes"] + } + } + }, + "required": ["data"] + }, + "V2DeleteInvitationsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["organization_invitation"] + }, + "attributes": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, + "required": ["email"] + } + }, + "required": ["type", "attributes"] + } + } + }, + "required": ["data"] + }, + "V2ListProjectsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { "type": "string", "description": "Resource type.", "enum": ["project"] }, + "id": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "attributes": { + "type": "object", + "properties": { + "name": { "type": "string", "description": "Project name" }, + "status": { + "type": "string", + "enum": [ + "INACTIVE", + "ACTIVE_HEALTHY", + "ACTIVE_UNHEALTHY", + "COMING_UP", + "UNKNOWN", + "GOING_DOWN", + "INIT_FAILED", + "REMOVED", + "RESTORING", + "UPGRADING", + "PAUSING", + "RESTORE_FAILED", + "RESTARTING", + "PAUSE_FAILED", + "RESIZING" + ], + "description": "Project status" + }, + "cloud_provider": { + "type": "string", + "description": "Cloud provider hosting the project" + }, + "region": { + "type": "string", + "description": "Region the project is hosted in" + }, + "inserted_at": { + "type": "string", + "description": "When the project was created" + }, + "databases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "cloud_provider": { "type": "string" }, + "identifier": { "type": "string" }, + "region": { "type": "string", "nullable": true }, + "status": { + "type": "string", + "enum": [ + "ACTIVE_HEALTHY", + "ACTIVE_UNHEALTHY", + "COMING_UP", + "GOING_DOWN", + "INIT_FAILED", + "REMOVED", + "RESTORING", + "UNKNOWN", + "INIT_READ_REPLICA", + "INIT_READ_REPLICA_FAILED", + "RESTARTING", + "RESIZING" + ] + }, + "type": { "type": "string", "enum": ["PRIMARY", "READ_REPLICA"] }, + "infra_compute_size": { + "type": "string", + "enum": [ + "pico", + "nano", + "micro", + "small", + "medium", + "large", + "xlarge", + "2xlarge", + "4xlarge", + "8xlarge", + "12xlarge", + "16xlarge", + "24xlarge", + "24xlarge_optimized_memory", + "24xlarge_optimized_cpu", + "24xlarge_high_memory", + "48xlarge", + "48xlarge_optimized_memory", + "48xlarge_optimized_cpu", + "48xlarge_high_memory" + ] + }, + "disk_volume_size_gb": { "type": "number" }, + "disk_type": { "type": "string", "enum": ["gp3", "io2"] }, + "disk_throughput_mbps": { "type": "number" }, + "disk_last_modified_at": { "type": "string" } + }, + "required": ["cloud_provider", "identifier", "region", "status", "type"] + }, + "description": "The project's databases including compute and disk attributes." + } + }, + "required": [ + "name", + "status", + "cloud_provider", + "region", + "inserted_at", + "databases" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": "string", + "description": "URL path to the first page if available.", + "example": "/v2/organizations/my-org/projects?page[size]=10", + "nullable": true + }, + "prev": { + "type": "string", + "description": "URL path to the previous page.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true + }, + "next": { + "type": "string", + "description": "URL path to the next page.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true + }, + "last": { + "type": "string", + "description": "URL path to the last page if available.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + }, + "V2ListGitHubConnectionsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["github_connection"] + }, + "id": { "type": "string", "description": "Connection id.", "example": "7" }, + "attributes": { + "type": "object", + "properties": { + "inserted_at": { + "type": "string", + "description": "When the connection was created" + }, + "updated_at": { + "type": "string", + "description": "When the connection was last updated" + }, + "installation_id": { + "type": "number", + "description": "GitHub App installation id" + }, + "workdir": { + "type": "string", + "description": "Directory within the repository the project lives in" + }, + "supabase_changes_only": { + "type": "boolean", + "description": "Whether branches are only created for changes under `supabase/`" + }, + "branch_limit": { + "type": "number", + "description": "Maximum number of preview branches" + }, + "new_branch_per_pr": { + "type": "boolean", + "description": "Whether a preview branch is created for every pull request" + }, + "project": { + "type": "object", + "properties": { + "id": { "type": "number" }, + "ref": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "name": { "type": "string" } + }, + "required": ["id", "ref", "name"], + "description": "The connected Supabase project" + }, + "repository": { + "type": "object", + "properties": { "id": { "type": "number" }, "name": { "type": "string" } }, + "required": ["id", "name"], + "description": "The connected GitHub repository" + }, + "user": { + "type": "object", + "properties": { + "id": { "type": "number" }, + "username": { "type": "string" }, + "primary_email": { "type": "string", "nullable": true } + }, + "required": ["id", "username", "primary_email"], + "description": "The user who created the connection, if still known", + "nullable": true + } + }, + "required": [ + "inserted_at", + "updated_at", + "installation_id", + "workdir", + "supabase_changes_only", + "branch_limit", + "new_branch_per_pr", + "project", + "repository", + "user" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": "string", + "description": "URL path to the first page if available.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10", + "nullable": true + }, + "prev": { + "type": "string", + "description": "URL path to the previous page.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true + }, + "next": { + "type": "string", + "description": "URL path to the next page.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true + }, + "last": { + "type": "string", + "description": "URL path to the last page if available.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + }, + "APIErrorObject": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "code": { "type": "string" }, + "message": { "type": "string" }, + "description": { "type": "string" }, + "links": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { "type": "string" }, + "rel": { "type": "string" }, + "title": { "type": "string" }, + "type": { "type": "string" }, + "describedby": { "type": "string" }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "issues": { "type": "array", "items": { "$ref": "#/components/schemas/APIErrorObject" } } + }, + "required": ["code", "message"] } } } diff --git a/apps/docs/spec/common-api-sections.json b/apps/docs/spec/common-api-sections.json index ffe92d96efb..9421f19a16b 100644 --- a/apps/docs/spec/common-api-sections.json +++ b/apps/docs/spec/common-api-sections.json @@ -76,6 +76,12 @@ "slug": "v2-list-log-drains", "type": "operation" }, + { + "id": "v1-scrape-project-metrics", + "title": "Scrape project metrics", + "slug": "v1-scrape-project-metrics", + "type": "operation" + }, { "id": "v2-update-log-drain", "title": "Update log drain", @@ -760,6 +766,12 @@ "slug": "v1-list-all-organizations", "type": "operation" }, + { + "id": "v2-list-organization-github-connections", + "title": "List organization github connections", + "slug": "v2-list-organization-github-connections", + "type": "operation" + }, { "id": "v1-list-organization-members", "title": "List organization members", @@ -772,6 +784,12 @@ "slug": "v2-list-organization-members", "type": "operation" }, + { + "id": "v2-list-organization-projects", + "title": "List organization projects", + "slug": "v2-list-organization-projects", + "type": "operation" + }, { "id": "v2-list-organization-roles", "title": "List organization roles", @@ -789,6 +807,12 @@ "title": "Create organization invitations", "slug": "v2-create-organization-invitations", "type": "operation" + }, + { + "id": "v2-delete-organization-invitations", + "title": "Delete organization invitations", + "slug": "v2-delete-organization-invitations", + "type": "operation" } ] }, @@ -844,6 +868,12 @@ "slug": "v2-delete-private-link-association", "type": "operation" }, + { + "id": "v2-delete-private-link-association-for-database", + "title": "Delete private link association for database", + "slug": "v2-delete-private-link-association-for-database", + "type": "operation" + }, { "id": "v1-get-all-projects-for-organization", "title": "Get all projects for organization", diff --git a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json index c7576a9b540..da424d3bcd5 100644 --- a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json +++ b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json @@ -78,7 +78,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -90,6 +90,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -102,67 +103,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "ref": { - "type": "string" - }, - "postgres_version": { - "type": "string" - }, - "postgres_engine": { - "type": "string" - }, - "release_channel": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - }, - "db_host": { - "type": "string" - }, - "db_port": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "db_user": { - "type": "string" - }, - "db_pass": { - "type": "string" - }, - "jwt_secret": { - "type": "string" - } - }, - "required": [ - "ref", - "postgres_version", - "postgres_engine", - "release_channel", - "status", - "db_host", - "db_port" - ] + "$ref": "#/components/schemas/BranchDetailResponse" } } } @@ -174,12 +115,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_read"] - }, - { - "fga_permissions": ["branching_development_read"] } ], "summary": "Get database branch config", @@ -191,6 +126,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" }, "patch": { @@ -204,7 +140,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -216,6 +152,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -227,49 +164,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "branch_name": { - "type": "string" - }, - "git_branch": { - "type": "string" - }, - "reset_on_push": { - "type": "boolean", - "description": "This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead.", - "deprecated": true - }, - "persistent": { - "type": "boolean" - }, - "status": { - "type": "string", - "enum": [ - "CREATING_PROJECT", - "RUNNING_MIGRATIONS", - "MIGRATIONS_PASSED", - "MIGRATIONS_FAILED", - "FUNCTIONS_DEPLOYED", - "FUNCTIONS_FAILED" - ] - }, - "request_review": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri", - "description": "HTTP endpoint to receive branch status updates." - } - }, - "example": { - "branch_name": "preview-login-page", - "git_branch": "feature/login-page", - "persistent": true, - "request_review": true, - "notify_url": "https://example.com/webhooks/branches" - } + "$ref": "#/components/schemas/UpdateBranchBody" } } } @@ -280,108 +175,7 @@ "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" - ], - "description": "This field is deprecated. List action runs to get branch status instead.", - "deprecated": true - }, - "created_at": { - "type": "string", - "format": "date-time" - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "review_requested_at": { - "type": "string", - "format": "date-time" - }, - "with_data": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri" - }, - "deletion_scheduled_at": { - "type": "string", - "format": "date-time" - }, - "preview_project_status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - } - }, - "required": [ - "id", - "name", - "project_ref", - "parent_project_ref", - "is_default", - "persistent", - "status", - "created_at", - "updated_at", - "with_data" - ] + "$ref": "#/components/schemas/BranchResponse" } } } @@ -393,12 +187,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "Update database branch config", @@ -410,6 +198,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" }, "delete": { @@ -423,7 +212,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -435,6 +224,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -446,9 +236,8 @@ "in": "query", "description": "If set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled).", "schema": { - "default": "true", "example": false, - "type": "boolean" + "type": "string" } } ], @@ -458,14 +247,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["message"] + "$ref": "#/components/schemas/BranchDeleteResponse" } } } @@ -477,12 +259,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_delete"] - }, - { - "fga_permissions": ["branching_development_delete"] } ], "summary": "Delete a database branch", @@ -494,6 +270,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_delete"], ["branching_production_delete"]], "x-oauth-scope": "environment:write" } }, @@ -509,7 +286,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -521,6 +298,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -532,15 +310,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "migration_version": { - "type": "string" - } - }, - "example": { - "migration_version": "20250312000000" - } + "$ref": "#/components/schemas/BranchActionBody" } } } @@ -551,17 +321,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "workflow_run_id": { - "type": "string" - }, - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["workflow_run_id", "message"] + "$ref": "#/components/schemas/BranchUpdateResponse" } } } @@ -573,12 +333,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "Pushes a database branch", @@ -590,6 +344,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -605,7 +360,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -617,6 +372,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -628,15 +384,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "migration_version": { - "type": "string" - } - }, - "example": { - "migration_version": "20250312000000" - } + "$ref": "#/components/schemas/BranchActionBody" } } } @@ -647,17 +395,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "workflow_run_id": { - "type": "string" - }, - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["workflow_run_id", "message"] + "$ref": "#/components/schemas/BranchUpdateResponse" } } } @@ -669,12 +407,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "Merges a database branch", @@ -686,6 +418,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -701,7 +434,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -713,6 +446,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -724,15 +458,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "migration_version": { - "type": "string" - } - }, - "example": { - "migration_version": "20250312000000" - } + "$ref": "#/components/schemas/BranchActionBody" } } } @@ -743,17 +469,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "workflow_run_id": { - "type": "string" - }, - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["workflow_run_id", "message"] + "$ref": "#/components/schemas/BranchUpdateResponse" } } } @@ -765,12 +481,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "Resets a database branch", @@ -782,6 +492,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -797,7 +508,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -809,6 +520,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -821,14 +533,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "enum": ["Branch restoration initiated"] - } - }, - "required": ["message"] + "$ref": "#/components/schemas/BranchRestoreResponse" } } } @@ -840,12 +545,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "Restore a scheduled branch deletion", @@ -857,6 +556,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -872,7 +572,7 @@ "description": "Branch ref or deprecated branch ID", "schema": { "example": "abcdefghijklmnopqrst", - "oneOf": [ + "anyOf": [ { "type": "string", "minLength": 20, @@ -884,6 +584,7 @@ { "type": "string", "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "deprecated": true } ] @@ -902,10 +603,10 @@ "name": "pgdelta", "required": false, "in": "query", - "description": "Use pg-delta instead of Migra for diffing when true", + "description": "Use pg-delta instead of Migra for diffing when true. \nBoolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": false, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -927,12 +628,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_write"] - }, - { - "fga_permissions": ["branching_development_write"] } ], "summary": "[Beta] Diffs a database branch", @@ -944,6 +639,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_write"], ["branching_production_write"]], "x-oauth-scope": "environment:write" } }, @@ -960,98 +656,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "deprecated": true, - "description": "Deprecated: Use `ref` instead." - }, - "ref": { - "type": "string", - "minLength": 20, - "maxLength": 20, - "pattern": "^[a-z]+$", - "description": "Project ref", - "example": "abcdefghijklmnopqrst" - }, - "organization_id": { - "type": "string", - "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true - }, - "organization_slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "name": { - "type": "string", - "description": "Name of your project" - }, - "region": { - "type": "string", - "description": "Region of your project" - }, - "created_at": { - "type": "string", - "description": "Creation timestamp" - }, - "status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - }, - "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", - "ref", - "organization_id", - "organization_slug", - "name", - "region", - "created_at", - "status", - "database" - ] + "$ref": "#/components/schemas/V1ProjectWithDatabaseResponse" } } } @@ -1070,9 +675,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["projects_read"] } ], "summary": "List all projects", @@ -1084,6 +686,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["projects_read"]], "x-oauth-scope": "projects:read" }, "post": { @@ -1094,165 +697,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "db_pass": { - "type": "string", - "description": "Database password" - }, - "name": { - "type": "string", - "maxLength": 256, - "description": "Name of your project" - }, - "organization_id": { - "type": "string", - "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true - }, - "organization_slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "plan": { - "type": "string", - "enum": ["free", "pro"], - "deprecated": true, - "description": "Subscription Plan is now set on organization level and is ignored in this request" - }, - "region": { - "type": "string", - "description": "Region you want your server to reside in. Use region_selection instead.", - "deprecated": true, - "enum": [ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "ap-east-1", - "ap-southeast-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-southeast-2", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "eu-north-1", - "eu-central-1", - "eu-central-2", - "ca-central-1", - "ap-south-1", - "sa-east-1" - ] - }, - "region_selection": { - "discriminator": { - "propertyName": "type" - }, - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["specific"] - }, - "code": { - "type": "string", - "description": "Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint.", - "enum": [ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "ap-east-1", - "ap-southeast-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-southeast-2", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "eu-north-1", - "eu-central-1", - "eu-central-2", - "ca-central-1", - "ap-south-1", - "sa-east-1" - ] - } - }, - "required": ["type", "code"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["smartGroup"] - }, - "code": { - "type": "string", - "enum": ["americas", "emea", "apac"], - "description": "The Smart Region Group's code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint." - } - }, - "required": ["type", "code"] - } - ], - "description": "Region selection. Only one of region or region_selection can be specified." - }, - "kps_enabled": { - "type": "boolean", - "deprecated": true, - "description": "This field is deprecated and is ignored in this request" - }, - "desired_instance_size": { - "description": "Desired instance size. Omit this field to always default to the smallest possible size.", - "type": "string", - "enum": [ - "nano", - "micro", - "small", - "medium", - "large", - "xlarge", - "2xlarge", - "4xlarge", - "8xlarge", - "12xlarge", - "16xlarge", - "24xlarge", - "24xlarge_optimized_memory", - "24xlarge_optimized_cpu", - "24xlarge_high_memory", - "48xlarge", - "48xlarge_optimized_memory", - "48xlarge_optimized_cpu", - "48xlarge_high_memory" - ] - }, - "template_url": { - "type": "string", - "format": "uri", - "description": "Template URL used to create the project from the CLI." - }, - "high_availability": { - "type": "boolean", - "description": "[Experimental] Whether to enable high availability for the project." - } - }, - "required": ["db_pass", "name", "organization_slug"], - "additionalProperties": false, - "hideDefinitions": ["release_channel", "postgres_engine"], - "example": { - "db_pass": "correct-horse-battery-staple", - "name": "acme-prod", - "organization_slug": "tsrqponmlkjihgfedcba", - "region": "us-east-1" - } + "$ref": "#/components/schemas/V1CreateProjectBody" } } } @@ -1263,75 +708,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "deprecated": true, - "description": "Deprecated: Use `ref` instead." - }, - "ref": { - "type": "string", - "minLength": 20, - "maxLength": 20, - "pattern": "^[a-z]+$", - "description": "Project ref", - "example": "abcdefghijklmnopqrst" - }, - "organization_id": { - "type": "string", - "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true - }, - "organization_slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "name": { - "type": "string", - "description": "Name of your project" - }, - "region": { - "type": "string", - "description": "Region of your project" - }, - "created_at": { - "type": "string", - "description": "Creation timestamp" - }, - "status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - } - }, - "required": [ - "id", - "ref", - "organization_id", - "organization_slug", - "name", - "region", - "created_at", - "status" - ] + "$ref": "#/components/schemas/V1ProjectResponse" } } } @@ -1349,9 +726,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_projects_create"] } ], "summary": "Create a project", @@ -1363,6 +737,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["organization_projects_create"]], "x-oauth-scope": "projects:write" } }, @@ -1428,153 +803,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "recommendations": { - "type": "object", - "properties": { - "smartGroup": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "code": { - "type": "string", - "enum": ["americas", "emea", "apac"] - }, - "type": { - "type": "string", - "enum": ["smartGroup"] - } - }, - "required": ["name", "code", "type"] - }, - "specific": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "code": { - "type": "string", - "enum": [ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "ap-southeast-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-east-1", - "ap-southeast-2", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "eu-north-1", - "eu-central-1", - "eu-central-2", - "ca-central-1", - "ap-south-1", - "sa-east-1" - ] - }, - "type": { - "type": "string", - "enum": ["specific"] - }, - "provider": { - "type": "string", - "enum": ["AWS", "FLY", "AWS_K8S", "AWS_NIMBUS"] - }, - "status": { - "type": "string", - "enum": ["capacity", "other"] - } - }, - "required": ["name", "code", "type", "provider"] - } - } - }, - "required": ["smartGroup", "specific"] - }, - "all": { - "type": "object", - "properties": { - "smartGroup": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "code": { - "type": "string", - "enum": ["americas", "emea", "apac"] - }, - "type": { - "type": "string", - "enum": ["smartGroup"] - } - }, - "required": ["name", "code", "type"] - } - }, - "specific": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "code": { - "type": "string", - "enum": [ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "ap-southeast-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-east-1", - "ap-southeast-2", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "eu-north-1", - "eu-central-1", - "eu-central-2", - "ca-central-1", - "ap-south-1", - "sa-east-1" - ] - }, - "type": { - "type": "string", - "enum": ["specific"] - }, - "provider": { - "type": "string", - "enum": ["AWS", "FLY", "AWS_K8S", "AWS_NIMBUS"] - }, - "status": { - "type": "string", - "enum": ["capacity", "other"] - } - }, - "required": ["name", "code", "type", "provider"] - } - } - }, - "required": ["smartGroup", "specific"] - } - }, - "required": ["recommendations", "all"] + "$ref": "#/components/schemas/RegionsInfo" } } } @@ -1610,24 +839,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Deprecated: Use `slug` instead.", - "deprecated": true - }, - "slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "name": { - "type": "string" - } - }, - "required": ["id", "slug", "name"] + "$ref": "#/components/schemas/OrganizationResponseV1" } } } @@ -1649,9 +861,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organizations_read"] } ], "summary": "List all organizations", @@ -1663,6 +872,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organizations_read"]], "x-oauth-scope": "organizations:read" }, "post": { @@ -1673,18 +883,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 256 - } - }, - "required": ["name"], - "additionalProperties": false, - "example": { - "name": "Acme" - } + "$ref": "#/components/schemas/CreateOrganizationV1" } } } @@ -1695,24 +894,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Deprecated: Use `slug` instead.", - "deprecated": true - }, - "slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "name": { - "type": "string" - } - }, - "required": ["id", "slug", "name"] + "$ref": "#/components/schemas/OrganizationResponseV1" } } } @@ -1733,14 +915,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organizations_create"] } ], "summary": "Create an organization", "tags": ["Organizations"], - "x-endpoint-owners": ["management-api", "billing"] + "x-endpoint-owners": ["management-api", "billing"], + "x-fga-permissions": [["organizations_create"]] } }, "/v1/oauth/authorize": { @@ -1753,6 +933,7 @@ "in": "query", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "66666666-6666-4666-8666-666666666666", "type": "string" } @@ -1848,6 +1029,7 @@ "description": "Resource indicator for MCP (Model Context Protocol) clients", "schema": { "format": "uri", + "example": "https://mcp.supabase.com/projects", "type": "string" } } @@ -1857,11 +1039,6 @@ "description": "" } }, - "security": [ - { - "oauth2": ["read"] - } - ], "summary": "[Beta] Authorize user through oauth", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -1877,58 +1054,7 @@ "content": { "application/x-www-form-urlencoded": { "schema": { - "type": "object", - "properties": { - "grant_type": { - "type": "string", - "enum": [ - "authorization_code", - "refresh_token", - "urn:ietf:params:oauth:grant-type:jwt-bearer" - ] - }, - "client_id": { - "type": "string", - "format": "uuid" - }, - "client_secret": { - "type": "string" - }, - "code": { - "type": "string" - }, - "code_verifier": { - "type": "string" - }, - "redirect_uri": { - "type": "string" - }, - "refresh_token": { - "type": "string" - }, - "assertion": { - "type": "string", - "description": "IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only." - }, - "resource": { - "type": "string", - "format": "uri", - "description": "Resource indicator for MCP (Model Context Protocol) clients" - }, - "scope": { - "type": "string" - } - }, - "additionalProperties": false, - "example": { - "grant_type": "authorization_code", - "client_id": "66666666-6666-4666-8666-666666666666", - "client_secret": "sb_secret_live_example_9f4d3a206b2e4a7e8c91", - "code": "oauth_code_9f4d3a206b2e4a7e8c91", - "code_verifier": "qW0Z6d9pQnW0mL1dK1q9wFq6Yz2nV5rA8jT3mP7sH4c", - "redirect_uri": "https://app.acme.com/auth/callback", - "scope": "projects:read projects:write" - } + "$ref": "#/components/schemas/OAuthTokenBody" } } } @@ -1939,35 +1065,12 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "access_token": { - "type": "string" - }, - "refresh_token": { - "type": "string", - "description": "The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`." - }, - "expires_in": { - "type": "integer" - }, - "token_type": { - "type": "string", - "enum": ["Bearer"] - } - }, - "required": ["access_token", "expires_in", "token_type"], - "additionalProperties": false + "$ref": "#/components/schemas/OAuthTokenResponse" } } } } }, - "security": [ - { - "oauth2": ["write"] - } - ], "summary": "[Beta] Exchange auth code for user's access and refresh token", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -1982,26 +1085,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "format": "uuid" - }, - "client_secret": { - "type": "string" - }, - "refresh_token": { - "type": "string" - } - }, - "required": ["client_id", "client_secret", "refresh_token"], - "additionalProperties": false, - "example": { - "client_id": "66666666-6666-4666-8666-666666666666", - "client_secret": "sb_secret_live_example_9f4d3a206b2e4a7e8c91", - "refresh_token": "oauth_refresh_9f4d3a206b2e4a7e8c91" - } + "$ref": "#/components/schemas/OAuthRevokeTokenBody" } } } @@ -2011,11 +1095,6 @@ "description": "" } }, - "security": [ - { - "oauth2": ["write"] - } - ], "summary": "[Beta] Revoke oauth app authorization and it's corresponding tokens", "tags": ["OAuth"], "x-endpoint-owners": ["auth", "management-api"] @@ -2045,6 +1124,7 @@ "in": "query", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "66666666-6666-4666-8666-666666666666", "type": "string" } @@ -2123,14 +1203,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write", "project_admin_write"] } ], "summary": "Authorize user through oauth and claim a project", "tags": ["OAuth"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]] } }, "/v1/snippets": { @@ -2193,97 +1271,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "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"] - }, - "favorite": { - "type": "boolean" - } - }, - "required": [ - "id", - "inserted_at", - "updated_at", - "type", - "visibility", - "name", - "description", - "project", - "owner", - "updated_by", - "favorite" - ] - } - }, - "cursor": { - "type": "string" - } - }, - "required": ["data"] + "$ref": "#/components/schemas/SnippetList" } } } @@ -2304,9 +1292,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["snippets_read"] } ], "summary": "Lists SQL snippets for the logged in user", @@ -2318,6 +1303,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["snippets_read"]], "x-oauth-scope": "database:read" } }, @@ -2331,6 +1317,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "44444444-4444-4444-8444-444444444444", "type": "string" } @@ -2342,103 +1329,7 @@ "content": { "application/json": { "schema": { - "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"] - }, - "favorite": { - "type": "boolean" - }, - "content": { - "type": "object", - "properties": { - "favorite": { - "type": "boolean", - "deprecated": true, - "description": "Deprecated: Rely on root-level favorite property instead." - }, - "schema_version": { - "type": "string" - }, - "sql": { - "type": "string" - } - }, - "required": ["schema_version", "sql"] - } - }, - "required": [ - "id", - "inserted_at", - "updated_at", - "type", - "visibility", - "name", - "description", - "project", - "owner", - "updated_by", - "favorite", - "content" - ] + "$ref": "#/components/schemas/SnippetResponse" } } } @@ -2459,9 +1350,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["snippets_read"] } ], "summary": "Gets a specific SQL snippet", @@ -2473,6 +1361,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["snippets_read"]], "x-oauth-scope": "database:read" } }, @@ -2486,19 +1375,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "gotrue_id": { - "type": "string" - }, - "primary_email": { - "type": "string" - }, - "username": { - "type": "string" - } - }, - "required": ["gotrue_id", "primary_email", "username"] + "$ref": "#/components/schemas/V1ProfileResponse" } } } @@ -2515,163 +1392,6 @@ } }, "/v1/projects/{ref}/actions": { - "get": { - "description": "Returns a paginated list of action runs of the specified project.", - "operationId": "v1-list-action-runs", - "parameters": [ - { - "name": "ref", - "required": true, - "in": "path", - "description": "Project ref", - "schema": { - "minLength": 20, - "maxLength": 20, - "pattern": "^[a-z]+$", - "example": "abcdefghijklmnopqrst", - "type": "string" - } - }, - { - "name": "offset", - "required": false, - "in": "query", - "schema": { - "minimum": 0, - "example": 0, - "type": "number" - } - }, - { - "name": "limit", - "required": false, - "in": "query", - "schema": { - "minimum": 10, - "example": 20, - "type": "number" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "branch_id": { - "type": "string" - }, - "run_steps": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "enum": [ - "clone", - "pull", - "health", - "configure", - "migrate", - "seed", - "deploy" - ] - }, - "status": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "required": ["name", "status", "created_at", "updated_at"] - } - }, - "git_config": { - "nullable": true - }, - "workdir": { - "type": "string", - "nullable": true - }, - "check_run_id": { - "type": "number", - "nullable": true - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "required": [ - "id", - "branch_id", - "run_steps", - "workdir", - "check_run_id", - "created_at", - "updated_at" - ] - } - } - } - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden action" - }, - "429": { - "description": "Rate limit exceeded" - }, - "500": { - "description": "Failed to list action runs" - } - }, - "security": [ - { - "bearer": [] - }, - { - "fga_permissions": ["action_runs_read"] - } - ], - "summary": "List all action runs", - "tags": ["Environments"], - "x-badges": [ - { - "name": "OAuth scope: environment:read", - "position": "after" - } - ], - "x-endpoint-owners": ["dev-workflows"], - "x-oauth-scope": "environment:read" - }, "head": { "description": "Returns the total number of action runs of the specified project.", "operationId": "v1-count-action-runs", @@ -2720,9 +1440,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["action_runs_read"] } ], "summary": "Count the number of action runs", @@ -2733,6 +1450,86 @@ "position": "after" } ], + "x-fga-permissions": [["action_runs_read"]], + "x-oauth-scope": "environment:read" + }, + "get": { + "description": "Returns a paginated list of action runs of the specified project.", + "operationId": "v1-list-action-runs", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + }, + { + "name": "offset", + "required": false, + "in": "query", + "schema": { + "minimum": 0, + "example": 0, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "minimum": 10, + "example": 20, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListActionRunResponse" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + }, + "500": { + "description": "Failed to list action runs" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "List all action runs", + "tags": ["Environments"], + "x-badges": [ + { + "name": "OAuth scope: environment:read", + "position": "after" + } + ], + "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -2771,80 +1568,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "branch_id": { - "type": "string" - }, - "run_steps": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "enum": [ - "clone", - "pull", - "health", - "configure", - "migrate", - "seed", - "deploy" - ] - }, - "status": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "required": ["name", "status", "created_at", "updated_at"] - } - }, - "git_config": { - "nullable": true - }, - "workdir": { - "type": "string", - "nullable": true - }, - "check_run_id": { - "type": "number", - "nullable": true - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "required": [ - "id", - "branch_id", - "run_steps", - "workdir", - "check_run_id", - "created_at", - "updated_at" - ] + "$ref": "#/components/schemas/ActionRunResponse" } } } @@ -2865,9 +1589,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["action_runs_read"] } ], "summary": "Get the status of an action run", @@ -2879,6 +1600,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -2916,99 +1638,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "clone": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "pull": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "health": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "configure": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "migrate": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "seed": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - }, - "deploy": { - "type": "string", - "enum": [ - "CREATED", - "DEAD", - "EXITED", - "PAUSED", - "REMOVING", - "RESTARTING", - "RUNNING" - ] - } - }, - "example": { - "clone": "RUNNING", - "configure": "RUNNING", - "migrate": "RUNNING", - "deploy": "CREATED" - } + "$ref": "#/components/schemas/UpdateRunStatusBody" } } } @@ -3019,14 +1649,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["message"] + "$ref": "#/components/schemas/UpdateRunStatusResponse" } } } @@ -3047,9 +1670,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["action_runs_write"] } ], "summary": "Update the status of an action run", @@ -3061,6 +1681,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_write"]], "x-oauth-scope": "environment:write" } }, @@ -3120,9 +1741,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["action_runs_read"] } ], "summary": "Get the logs of an action run", @@ -3134,6 +1752,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["action_runs_read"]], "x-oauth-scope": "environment:read" } }, @@ -3158,10 +1777,10 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": true, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -3173,53 +1792,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "api_key": { - "type": "string", - "nullable": true - }, - "id": { - "type": "string", - "nullable": true - }, - "type": { - "type": "string", - "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": { - "type": "object", - "additionalProperties": {}, - "nullable": true - }, - "inserted_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name"] + "$ref": "#/components/schemas/ApiKeyResponse" } } } @@ -3238,9 +1811,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_read"] } ], "summary": "Get project api keys", @@ -3252,6 +1822,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "post": { @@ -3274,10 +1845,10 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": true, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -3286,34 +1857,7 @@ "content": { "application/json": { "schema": { - "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", - "additionalProperties": {}, - "nullable": true - } - }, - "required": ["type", "name"], - "example": { - "type": "secret", - "name": "ci_secret_key", - "description": "CI deploy key" - } + "$ref": "#/components/schemas/CreateApiKeyBody" } } } @@ -3324,53 +1868,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_key": { - "type": "string", - "nullable": true - }, - "id": { - "type": "string", - "nullable": true - }, - "type": { - "type": "string", - "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": { - "type": "object", - "additionalProperties": {}, - "nullable": true - }, - "inserted_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name"] + "$ref": "#/components/schemas/ApiKeyResponse" } } } @@ -3388,9 +1886,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_write"] } ], "summary": "Creates a new API key for the project", @@ -3402,6 +1897,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -3429,13 +1925,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] + "$ref": "#/components/schemas/LegacyApiKeysResponse" } } } @@ -3453,9 +1943,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_read"] } ], "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.", @@ -3467,6 +1954,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "put": { @@ -3489,10 +1977,10 @@ "name": "enabled", "required": true, "in": "query", - "description": "Boolean string, true or false", + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": true, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -3502,13 +1990,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] + "$ref": "#/components/schemas/LegacyApiKeysResponse" } } } @@ -3526,9 +2008,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_write"] } ], "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.", @@ -3540,6 +2019,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -3566,6 +2046,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -3574,10 +2055,10 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": true, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -3586,28 +2067,7 @@ "content": { "application/json": { "schema": { - "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", - "additionalProperties": {}, - "nullable": true - } - }, - "example": { - "name": "ci_secret_key_rotated", - "description": "Rotated after March release" - } + "$ref": "#/components/schemas/UpdateApiKeyBody" } } } @@ -3618,53 +2078,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_key": { - "type": "string", - "nullable": true - }, - "id": { - "type": "string", - "nullable": true - }, - "type": { - "type": "string", - "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": { - "type": "object", - "additionalProperties": {}, - "nullable": true - }, - "inserted_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name"] + "$ref": "#/components/schemas/ApiKeyResponse" } } } @@ -3682,9 +2096,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_write"] } ], "summary": "Updates an API key for the project", @@ -3696,6 +2107,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -3720,6 +2132,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -3728,10 +2141,10 @@ "name": "reveal", "required": false, "in": "query", - "description": "Boolean string, true or false", + "description": "Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`", "schema": { - "example": true, - "type": "boolean" + "example": "true", + "type": "string" } } ], @@ -3741,53 +2154,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_key": { - "type": "string", - "nullable": true - }, - "id": { - "type": "string", - "nullable": true - }, - "type": { - "type": "string", - "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": { - "type": "object", - "additionalProperties": {}, - "nullable": true - }, - "inserted_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name"] + "$ref": "#/components/schemas/ApiKeyResponse" } } } @@ -3805,9 +2172,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_read"] } ], "summary": "Get API key", @@ -3819,6 +2183,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_read"]], "x-oauth-scope": "secrets:read" }, "delete": { @@ -3843,6 +2208,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "22222222-2222-4222-8222-222222222222", "type": "string" } @@ -3854,7 +2220,7 @@ "description": "Boolean string, true or false", "schema": { "example": true, - "type": "boolean" + "type": "string" } }, { @@ -3864,7 +2230,7 @@ "description": "Boolean string, true or false", "schema": { "example": false, - "type": "boolean" + "type": "string" } }, { @@ -3883,53 +2249,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_key": { - "type": "string", - "nullable": true - }, - "id": { - "type": "string", - "nullable": true - }, - "type": { - "type": "string", - "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": { - "type": "object", - "additionalProperties": {}, - "nullable": true - }, - "inserted_at": { - "type": "string", - "format": "date-time", - "nullable": true - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name"] + "$ref": "#/components/schemas/ApiKeyResponse" } } } @@ -3947,9 +2267,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["api_gateway_keys_write"] } ], "summary": "Deletes an API key for the project", @@ -3961,6 +2278,7 @@ } ], "x-endpoint-owners": ["auth", "management-api"], + "x-fga-permissions": [["api_gateway_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -3991,108 +2309,7 @@ "schema": { "type": "array", "items": { - "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" - ], - "description": "This field is deprecated. List action runs to get branch status instead.", - "deprecated": true - }, - "created_at": { - "type": "string", - "format": "date-time" - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "review_requested_at": { - "type": "string", - "format": "date-time" - }, - "with_data": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri" - }, - "deletion_scheduled_at": { - "type": "string", - "format": "date-time" - }, - "preview_project_status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - } - }, - "required": [ - "id", - "name", - "project_ref", - "parent_project_ref", - "is_default", - "persistent", - "status", - "created_at", - "updated_at", - "with_data" - ] + "$ref": "#/components/schemas/BranchResponse" } } } @@ -4105,12 +2322,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_read"] - }, - { - "fga_permissions": ["branching_development_read"] } ], "summary": "List all database branches", @@ -4122,6 +2333,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" }, "post": { @@ -4147,82 +2359,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "branch_name": { - "type": "string", - "minLength": 1 - }, - "git_branch": { - "type": "string" - }, - "is_default": { - "type": "boolean" - }, - "persistent": { - "type": "boolean" - }, - "region": { - "type": "string" - }, - "desired_instance_size": { - "type": "string", - "enum": [ - "pico", - "nano", - "micro", - "small", - "medium", - "large", - "xlarge", - "2xlarge", - "4xlarge", - "8xlarge", - "12xlarge", - "16xlarge", - "24xlarge", - "24xlarge_optimized_memory", - "24xlarge_optimized_cpu", - "24xlarge_high_memory", - "48xlarge", - "48xlarge_optimized_memory", - "48xlarge_optimized_cpu", - "48xlarge_high_memory" - ] - }, - "release_channel": { - "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"], - "description": "Release channel. If not provided, GA will be used." - }, - "postgres_engine": { - "type": "string", - "enum": ["15", "17", "17-oriole"], - "description": "Postgres engine version. If not provided, the latest version will be used." - }, - "secrets": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "with_data": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri", - "description": "HTTP endpoint to receive branch status updates." - } - }, - "required": ["branch_name"], - "example": { - "branch_name": "preview-login-page", - "git_branch": "feature/login-page", - "persistent": true, - "with_data": false, - "notify_url": "https://example.com/webhooks/branches" - } + "$ref": "#/components/schemas/CreateBranchBody" } } } @@ -4233,108 +2370,7 @@ "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" - ], - "description": "This field is deprecated. List action runs to get branch status instead.", - "deprecated": true - }, - "created_at": { - "type": "string", - "format": "date-time" - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "review_requested_at": { - "type": "string", - "format": "date-time" - }, - "with_data": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri" - }, - "deletion_scheduled_at": { - "type": "string", - "format": "date-time" - }, - "preview_project_status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - } - }, - "required": [ - "id", - "name", - "project_ref", - "parent_project_ref", - "is_default", - "persistent", - "status", - "created_at", - "updated_at", - "with_data" - ] + "$ref": "#/components/schemas/BranchResponse" } } } @@ -4346,12 +2382,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_create"] - }, - { - "fga_permissions": ["branching_development_create"] } ], "summary": "Create a database branch", @@ -4363,6 +2393,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_create"], ["branching_production_create"]], "x-oauth-scope": "environment:write" }, "delete": { @@ -4403,9 +2434,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_delete"] } ], "summary": "Disables preview branching", @@ -4417,6 +2445,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_production_delete"]], "x-oauth-scope": "environment:write" } }, @@ -4454,108 +2483,7 @@ "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" - ], - "description": "This field is deprecated. List action runs to get branch status instead.", - "deprecated": true - }, - "created_at": { - "type": "string", - "format": "date-time" - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "review_requested_at": { - "type": "string", - "format": "date-time" - }, - "with_data": { - "type": "boolean" - }, - "notify_url": { - "type": "string", - "format": "uri" - }, - "deletion_scheduled_at": { - "type": "string", - "format": "date-time" - }, - "preview_project_status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - } - }, - "required": [ - "id", - "name", - "project_ref", - "parent_project_ref", - "is_default", - "persistent", - "status", - "created_at", - "updated_at", - "with_data" - ] + "$ref": "#/components/schemas/BranchResponse" } } } @@ -4567,12 +2495,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["branching_production_read"] - }, - { - "fga_permissions": ["branching_development_read"] } ], "summary": "Get a database branch", @@ -4584,6 +2506,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["branching_development_read"], ["branching_production_read"]], "x-oauth-scope": "environment:read" } }, @@ -4611,126 +2534,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "1_not_started", - "2_initiated", - "3_challenge_verified", - "4_origin_setup_completed", - "5_services_reconfigured" - ] - }, - "custom_hostname": { - "type": "string" - }, - "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"] + "$ref": "#/components/schemas/UpdateCustomHostnameResponse" } } } @@ -4751,9 +2555,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["custom_domain_read"] } ], "summary": "[Beta] Gets project's custom hostname config", @@ -4765,6 +2566,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_read"]], "x-oauth-scope": "domains:read" }, "delete": { @@ -4789,8 +2591,7 @@ "in": "query", "description": "If true, also removes the custom domain add-on from the project subscription.", "schema": { - "default": "false", - "type": "boolean" + "type": "string" } } ], @@ -4814,9 +2615,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["custom_domain_write"] } ], "summary": "[Beta] Deletes a project's custom hostname configuration", @@ -4828,6 +2626,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -4854,18 +2653,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "custom_hostname": { - "type": "string", - "maxLength": 253, - "minLength": 1 - } - }, - "required": ["custom_hostname"], - "example": { - "custom_hostname": "docs.example.com" - } + "$ref": "#/components/schemas/UpdateCustomHostnameBody" } } } @@ -4876,126 +2664,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "1_not_started", - "2_initiated", - "3_challenge_verified", - "4_origin_setup_completed", - "5_services_reconfigured" - ] - }, - "custom_hostname": { - "type": "string" - }, - "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"] + "$ref": "#/components/schemas/UpdateCustomHostnameResponse" } } } @@ -5016,9 +2685,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["custom_domain_write"] } ], "summary": "[Beta] Updates project's custom hostname configuration", @@ -5030,6 +2696,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -5057,126 +2724,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "1_not_started", - "2_initiated", - "3_challenge_verified", - "4_origin_setup_completed", - "5_services_reconfigured" - ] - }, - "custom_hostname": { - "type": "string" - }, - "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"] + "$ref": "#/components/schemas/UpdateCustomHostnameResponse" } } } @@ -5197,9 +2745,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["custom_domain_write"] } ], "summary": "[Beta] Attempts to verify the DNS configuration for project's custom hostname configuration", @@ -5211,6 +2756,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -5238,126 +2784,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "1_not_started", - "2_initiated", - "3_challenge_verified", - "4_origin_setup_completed", - "5_services_reconfigured" - ] - }, - "custom_hostname": { - "type": "string" - }, - "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"] + "$ref": "#/components/schemas/UpdateCustomHostnameResponse" } } } @@ -5378,9 +2805,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["custom_domain_write"] } ], "summary": "[Beta] Activates a custom hostname for a project.", @@ -5392,6 +2816,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["custom_domain_write"]], "x-oauth-scope": "domains:write" } }, @@ -5419,9 +2844,7 @@ "content": { "application/json": { "schema": { - "discriminator": { - "propertyName": "state" - }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "oneOf": [ { "type": "object", @@ -5434,21 +2857,27 @@ "type": "boolean" } }, - "required": ["state"] + "required": ["state"], + "additionalProperties": false }, { "type": "object", "properties": { "state": { "type": "string", - "enum": ["unavailable"] + "const": "unavailable" }, "unavailableReason": { "type": "string", - "enum": ["postgres_upgrade_required", "temporarily_unavailable"] + "enum": [ + "postgres_upgrade_required", + "ssl_enforcement_required", + "temporarily_unavailable" + ] } }, - "required": ["state", "unavailableReason"] + "required": ["state", "unavailableReason"], + "additionalProperties": false } ] } @@ -5471,9 +2900,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "[Beta] Get project's temporary access configuration.", @@ -5485,6 +2911,7 @@ } ], "x-endpoint-owners": ["security", "management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -5509,17 +2936,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "state": { - "type": "string", - "enum": ["enabled", "disabled"] - } - }, - "required": ["state"], - "example": { - "state": "enabled" - } + "$ref": "#/components/schemas/JitAccessRequestRequest" } } } @@ -5530,9 +2947,7 @@ "content": { "application/json": { "schema": { - "discriminator": { - "propertyName": "state" - }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "oneOf": [ { "type": "object", @@ -5545,21 +2960,27 @@ "type": "boolean" } }, - "required": ["state"] + "required": ["state"], + "additionalProperties": false }, { "type": "object", "properties": { "state": { "type": "string", - "enum": ["unavailable"] + "const": "unavailable" }, "unavailableReason": { "type": "string", - "enum": ["postgres_upgrade_required", "temporarily_unavailable"] + "enum": [ + "postgres_upgrade_required", + "ssl_enforcement_required", + "temporarily_unavailable" + ] } }, - "required": ["state", "unavailableReason"] + "required": ["state", "unavailableReason"], + "additionalProperties": false } ] } @@ -5582,9 +3003,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "[Beta] Update project's temporary access configuration.", @@ -5596,6 +3014,7 @@ } ], "x-endpoint-owners": ["security", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "database:write" } }, @@ -5623,16 +3042,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "banned_ipv4_addresses": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["banned_ipv4_addresses"] + "$ref": "#/components/schemas/NetworkBanResponse" } } } @@ -5653,9 +3063,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_bans_read"] } ], "summary": "[Beta] Gets project's network bans", @@ -5667,6 +3074,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_read"]], "x-oauth-scope": "projects:read" } }, @@ -5694,28 +3102,7 @@ "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"] + "$ref": "#/components/schemas/NetworkBanResponseEnriched" } } } @@ -5736,9 +3123,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_bans_read"] } ], "summary": "[Beta] Gets project's network bans with additional information about which databases they affect", @@ -5750,6 +3134,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_read"]], "x-oauth-scope": "projects:read" } }, @@ -5776,29 +3161,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "ipv4_addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of IP addresses to unban." - }, - "requester_ip": { - "default": false, - "type": "boolean", - "description": "Include requester's public IP in the list of addresses to unban." - }, - "identifier": { - "type": "string" - } - }, - "required": ["ipv4_addresses"], - "example": { - "ipv4_addresses": ["203.0.113.10"], - "requester_ip": false - } + "$ref": "#/components/schemas/RemoveNetworkBanRequest" } } } @@ -5823,9 +3186,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_bans_write"] } ], "summary": "[Beta] Remove network bans.", @@ -5837,6 +3197,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_network_bans_write"]], "x-oauth-scope": "projects:write" } }, @@ -5864,66 +3225,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "entitlement": { - "type": "string", - "enum": ["disallowed", "allowed"] - }, - "config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." - }, - "old_config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "example": { - "dbAllowedCidrs": ["203.0.113.0/24"], - "dbAllowedCidrsV6": ["2001:db8::/32"] - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." - }, - "status": { - "type": "string", - "enum": ["stored", "applied"] - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "applied_at": { - "type": "string", - "format": "date-time" - } - }, - "required": ["entitlement", "config", "status"] + "$ref": "#/components/schemas/NetworkRestrictionsResponse" } } } @@ -5944,9 +3246,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_restrictions_read"] } ], "summary": "[Beta] Gets project's network restrictions", @@ -5958,6 +3257,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_read"]], "x-oauth-scope": "projects:read" }, "patch": { @@ -5982,51 +3282,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "add": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "remove": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - }, - "example": { - "add": { - "dbAllowedCidrs": ["203.0.113.0/24"] - }, - "remove": { - "dbAllowedCidrs": ["198.51.100.0/24"] - } - } + "$ref": "#/components/schemas/NetworkRestrictionsPatchRequest" } } } @@ -6037,70 +3293,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "entitlement": { - "type": "string", - "enum": ["disallowed", "allowed"] - }, - "config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["v4", "v6"] - } - }, - "required": ["address", "type"] - } - } - }, - "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." - }, - "old_config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "address": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["v4", "v6"] - } - }, - "required": ["address", "type"] - } - } - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "applied_at": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "enum": ["stored", "applied"] - } - }, - "required": ["entitlement", "config", "status"] + "$ref": "#/components/schemas/NetworkRestrictionsV2Response" } } } @@ -6121,9 +3314,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_restrictions_write"] } ], "summary": "[Alpha] Updates project's network restrictions by adding or removing CIDRs", @@ -6135,6 +3325,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_write"]], "x-oauth-scope": "projects:write" } }, @@ -6161,25 +3352,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "example": { - "dbAllowedCidrs": ["203.0.113.0/24"], - "dbAllowedCidrsV6": ["2001:db8::/32"] - } + "$ref": "#/components/schemas/NetworkRestrictionsRequest" } } } @@ -6190,66 +3363,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "entitlement": { - "type": "string", - "enum": ["disallowed", "allowed"] - }, - "config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." - }, - "old_config": { - "type": "object", - "properties": { - "dbAllowedCidrs": { - "type": "array", - "items": { - "type": "string" - } - }, - "dbAllowedCidrsV6": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "example": { - "dbAllowedCidrs": ["203.0.113.0/24"], - "dbAllowedCidrsV6": ["2001:db8::/32"] - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." - }, - "status": { - "type": "string", - "enum": ["stored", "applied"] - }, - "updated_at": { - "type": "string", - "format": "date-time" - }, - "applied_at": { - "type": "string", - "format": "date-time" - } - }, - "required": ["entitlement", "config", "status"] + "$ref": "#/components/schemas/NetworkRestrictionsResponse" } } } @@ -6270,9 +3384,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_network_restrictions_write"] } ], "summary": "[Beta] Updates project's network restrictions", @@ -6284,6 +3395,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_network_restrictions_write"]], "x-oauth-scope": "projects:write" } }, @@ -6311,13 +3423,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "root_key": { - "type": "string" - } - }, - "required": ["root_key"] + "$ref": "#/components/schemas/PgsodiumConfigResponse" } } } @@ -6338,9 +3444,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "[Beta] Gets project's pgsodium config", @@ -6352,6 +3455,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "secrets:read" }, "put": { @@ -6376,16 +3480,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "root_key": { - "type": "string" - } - }, - "required": ["root_key"], - "example": { - "root_key": "MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=" - } + "$ref": "#/components/schemas/UpdatePgsodiumConfigBody" } } } @@ -6396,13 +3491,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "root_key": { - "type": "string" - } - }, - "required": ["root_key"] + "$ref": "#/components/schemas/PgsodiumConfigResponse" } } } @@ -6423,9 +3512,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "[Beta] Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.", @@ -6437,6 +3523,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "secrets:write" } }, @@ -6464,38 +3551,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "db_schema": { - "type": "string" - }, - "max_rows": { - "type": "integer" - }, - "db_extra_search_path": { - "type": "string" - }, - "db_pool": { - "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." - }, - "db_pool_acquisition_timeout": { - "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." - }, - "jwt_secret": { - "type": "string" - } - }, - "required": [ - "db_schema", - "max_rows", - "db_extra_search_path", - "db_pool", - "db_pool_acquisition_timeout" - ] + "$ref": "#/components/schemas/PostgrestConfigWithJWTSecretResponse" } } } @@ -6516,9 +3572,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["data_api_config_read"] } ], "summary": "Gets project's postgrest config", @@ -6530,6 +3583,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["data_api_config_read"]], "x-oauth-scope": "rest:read" }, "patch": { @@ -6554,35 +3608,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "db_extra_search_path": { - "type": "string" - }, - "db_schema": { - "type": "string" - }, - "max_rows": { - "type": "integer", - "minimum": 0, - "maximum": 1000000 - }, - "db_pool": { - "type": "integer", - "minimum": 0, - "maximum": 1000 - }, - "db_pool_acquisition_timeout": { - "type": "integer", - "minimum": 0, - "maximum": 60 - } - }, - "example": { - "db_schema": "public,storage", - "db_pool": 20, - "max_rows": 1000 - } + "$ref": "#/components/schemas/V1UpdatePostgrestConfigBody" } } } @@ -6593,35 +3619,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "db_schema": { - "type": "string" - }, - "max_rows": { - "type": "integer" - }, - "db_extra_search_path": { - "type": "string" - }, - "db_pool": { - "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." - }, - "db_pool_acquisition_timeout": { - "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." - } - }, - "required": [ - "db_schema", - "max_rows", - "db_extra_search_path", - "db_pool", - "db_pool_acquisition_timeout" - ] + "$ref": "#/components/schemas/V1PostgrestConfigResponse" } } } @@ -6642,9 +3640,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["data_api_config_write"] } ], "summary": "Updates project's postgrest config", @@ -6656,6 +3651,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["data_api_config_write"]], "x-oauth-scope": "rest:write" } }, @@ -6683,98 +3679,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "deprecated": true, - "description": "Deprecated: Use `ref` instead." - }, - "ref": { - "type": "string", - "minLength": 20, - "maxLength": 20, - "pattern": "^[a-z]+$", - "description": "Project ref", - "example": "abcdefghijklmnopqrst" - }, - "organization_id": { - "type": "string", - "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true - }, - "organization_slug": { - "type": "string", - "pattern": "^[\\w-]+$", - "description": "Organization slug", - "example": "tsrqponmlkjihgfedcba" - }, - "name": { - "type": "string", - "description": "Name of your project" - }, - "region": { - "type": "string", - "description": "Region of your project" - }, - "created_at": { - "type": "string", - "description": "Creation timestamp" - }, - "status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - }, - "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", - "ref", - "organization_id", - "organization_slug", - "name", - "region", - "created_at", - "status", - "database" - ] + "$ref": "#/components/schemas/V1ProjectWithDatabaseResponse" } } } @@ -6795,9 +3700,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "Gets a specific project that belongs to the authenticated user", @@ -6809,6 +3711,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" }, "delete": { @@ -6834,19 +3737,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": ["id", "ref", "name"] + "$ref": "#/components/schemas/V1ProjectRefResponse" } } } @@ -6864,9 +3755,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Deletes the given project", @@ -6878,6 +3766,7 @@ } ], "x-endpoint-owners": ["management-api", "infra", "dev-workflows"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" }, "patch": { @@ -6902,18 +3791,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 256 - } - }, - "required": ["name"], - "example": { - "name": "Acme Platform" - } + "$ref": "#/components/schemas/V1UpdateProjectBody" } } } @@ -6924,19 +3802,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": ["id", "ref", "name"] + "$ref": "#/components/schemas/V1ProjectRefResponse" } } } @@ -6957,9 +3823,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Updates the given project", @@ -6971,6 +3834,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -7001,19 +3865,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "required": ["name", "value"] + "$ref": "#/components/schemas/SecretResponse" } } } @@ -7035,9 +3887,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_secrets_read"] } ], "summary": "List all secrets", @@ -7049,6 +3898,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_read"]], "x-oauth-scope": "secrets:read" }, "post": { @@ -7074,33 +3924,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 256, - "pattern": "^(?!SUPABASE_).*", - "description": "Secret name must not start with the SUPABASE_ prefix." - }, - "value": { - "type": "string", - "maxLength": 24576 - } - }, - "required": ["name", "value"] - }, - "example": [ - { - "name": "OPENAI_API_KEY", - "value": "sk-example-secret" - }, - { - "name": "STRIPE_WEBHOOK_SECRET", - "value": "whsec_example" - } - ] + "$ref": "#/components/schemas/CreateSecretBody" } } } @@ -7125,9 +3949,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_secrets_write"] } ], "summary": "Bulk create secrets", @@ -7139,6 +3960,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_write"]], "x-oauth-scope": "secrets:write" }, "delete": { @@ -7164,11 +3986,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "string" - }, - "example": ["OPENAI_API_KEY"] + "$ref": "#/components/schemas/DeleteSecretsBody" } } } @@ -7193,9 +4011,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_secrets_write"] } ], "summary": "Bulk delete secrets", @@ -7207,6 +4022,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_secrets_write"]], "x-oauth-scope": "secrets:write" } }, @@ -7234,22 +4050,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "currentConfig": { - "type": "object", - "properties": { - "database": { - "type": "boolean" - } - }, - "required": ["database"] - }, - "appliedSuccessfully": { - "type": "boolean" - } - }, - "required": ["currentConfig", "appliedSuccessfully"] + "$ref": "#/components/schemas/SslEnforcementResponse" } } } @@ -7270,9 +4071,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_ssl_config_read"] } ], "summary": "[Beta] Get project's SSL enforcement configuration.", @@ -7284,6 +4082,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_ssl_config_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -7308,24 +4107,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "requestedConfig": { - "type": "object", - "properties": { - "database": { - "type": "boolean" - } - }, - "required": ["database"] - } - }, - "required": ["requestedConfig"], - "example": { - "requestedConfig": { - "database": true - } - } + "$ref": "#/components/schemas/SslEnforcementRequest" } } } @@ -7336,22 +4118,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "currentConfig": { - "type": "object", - "properties": { - "database": { - "type": "boolean" - } - }, - "required": ["database"] - }, - "appliedSuccessfully": { - "type": "boolean" - } - }, - "required": ["currentConfig", "appliedSuccessfully"] + "$ref": "#/components/schemas/SslEnforcementResponse" } } } @@ -7372,9 +4139,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_ssl_config_write"] } ], "summary": "[Beta] Update project's SSL enforcement configuration.", @@ -7386,6 +4150,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_ssl_config_write"]], "x-oauth-scope": "database:write" } }, @@ -7424,13 +4189,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "types": { - "type": "string" - } - }, - "required": ["types"] + "$ref": "#/components/schemas/TypescriptResponse" } } } @@ -7451,9 +4210,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_read"] } ], "summary": "Generate TypeScript types", @@ -7465,6 +4221,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -7492,24 +4249,20 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": ["not-used", "custom-domain-used", "active"] - }, - "custom_domain": { - "type": "string", - "minLength": 1 - } - }, - "required": ["status"] + "$ref": "#/components/schemas/VanitySubdomainConfigResponse" } } } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "401": { "description": "Unauthorized" @@ -7527,9 +4280,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["vanity_subdomain_read"] } ], "summary": "[Beta] Gets current vanity subdomain config", @@ -7546,6 +4296,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_read"]], "x-oauth-scope": "domains:read" }, "delete": { @@ -7585,9 +4336,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["vanity_subdomain_write"] } ], "summary": "[Beta] Deletes a project's vanity subdomain configuration", @@ -7599,6 +4347,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -7625,17 +4374,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "vanity_subdomain": { - "type": "string", - "maxLength": 63 - } - }, - "required": ["vanity_subdomain"], - "example": { - "vanity_subdomain": "acme-prod" - } + "$ref": "#/components/schemas/VanitySubdomainBody" } } } @@ -7646,19 +4385,20 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "available": { - "type": "boolean" - } - }, - "required": ["available"] + "$ref": "#/components/schemas/SubdomainAvailabilityResponse" } } } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "401": { "description": "Unauthorized" @@ -7676,9 +4416,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["vanity_subdomain_write"] } ], "summary": "[Beta] Checks vanity subdomain availability", @@ -7695,6 +4432,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -7721,17 +4459,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "vanity_subdomain": { - "type": "string", - "maxLength": 63 - } - }, - "required": ["vanity_subdomain"], - "example": { - "vanity_subdomain": "acme-prod" - } + "$ref": "#/components/schemas/VanitySubdomainBody" } } } @@ -7742,19 +4470,20 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "custom_domain": { - "type": "string" - } - }, - "required": ["custom_domain"] + "$ref": "#/components/schemas/ActivateVanitySubdomainResponse" } } } }, "400": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "401": { "description": "Unauthorized" @@ -7772,9 +4501,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["vanity_subdomain_write"] } ], "summary": "[Beta] Activates a vanity subdomain for a project.", @@ -7791,6 +4517,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["vanity_subdomain_write"]], "x-oauth-scope": "domains:write" } }, @@ -7817,21 +4544,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "target_version": { - "type": "string" - }, - "release_channel": { - "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] - } - }, - "required": ["target_version"], - "example": { - "target_version": "17", - "release_channel": "ga" - } + "$ref": "#/components/schemas/UpgradeDatabaseBody" } } } @@ -7842,13 +4555,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "tracking_id": { - "type": "string" - } - }, - "required": ["tracking_id"] + "$ref": "#/components/schemas/ProjectUpgradeInitiateResponse" } } } @@ -7869,9 +4576,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write", "database_write"] } ], "summary": "[Beta] Upgrades the project's Postgres version", @@ -7883,6 +4587,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write", "database_write"]], "x-oauth-scope": "projects:write" } }, @@ -7910,291 +4615,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "eligible": { - "type": "boolean" - }, - "current_app_version": { - "type": "string" - }, - "current_app_version_release_channel": { - "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] - }, - "latest_app_version": { - "type": "string" - }, - "target_upgrade_versions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "postgres_version": { - "type": "string", - "enum": ["13", "14", "15", "17", "17-oriole"] - }, - "release_channel": { - "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] - }, - "app_version": { - "type": "string" - } - }, - "required": ["postgres_version", "release_channel", "app_version"] - } - }, - "duration_estimate_hours": { - "type": "number" - }, - "legacy_auth_custom_roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "objects_to_be_dropped": { - "type": "array", - "items": { - "type": "string" - }, - "deprecated": true, - "description": "Use validation_errors instead." - }, - "unsupported_extensions": { - "type": "array", - "items": { - "type": "string" - }, - "deprecated": true, - "description": "Use validation_errors instead." - }, - "user_defined_objects_in_internal_schemas": { - "type": "array", - "items": { - "type": "string" - }, - "deprecated": true, - "description": "Use validation_errors instead." - }, - "validation_errors": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["objects_depending_on_pg_cron"] - }, - "dependents": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["type", "dependents"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["indexes_referencing_ll_to_earth"] - }, - "schema_name": { - "type": "string" - }, - "table_name": { - "type": "string" - }, - "index_name": { - "type": "string" - } - }, - "required": ["type", "schema_name", "table_name", "index_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["function_using_obsolete_lang"] - }, - "schema_name": { - "type": "string" - }, - "function_name": { - "type": "string" - }, - "lang_name": { - "type": "string" - } - }, - "required": ["type", "schema_name", "function_name", "lang_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["unsupported_extension"] - }, - "extension_name": { - "type": "string" - } - }, - "required": ["type", "extension_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["unsupported_fdw_handler"] - }, - "fdw_name": { - "type": "string" - }, - "fdw_handler_name": { - "type": "string" - } - }, - "required": ["type", "fdw_name", "fdw_handler_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["unlogged_table_with_persistent_sequence"] - }, - "schema_name": { - "type": "string" - }, - "table_name": { - "type": "string" - }, - "sequence_name": { - "type": "string" - } - }, - "required": ["type", "schema_name", "table_name", "sequence_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["user_defined_objects_in_internal_schemas"] - }, - "obj_type": { - "type": "string", - "enum": ["table", "function"] - }, - "schema_name": { - "type": "string" - }, - "obj_name": { - "type": "string" - } - }, - "required": ["type", "obj_type", "schema_name", "obj_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["active_replication_slot"] - }, - "slot_name": { - "type": "string" - } - }, - "required": ["type", "slot_name"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["x86_architecture"] - } - }, - "required": ["type"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["project_hibernating"] - } - }, - "required": ["type"] - } - ] - } - }, - "warnings": { - "type": "array", - "items": { - "discriminator": { - "propertyName": "type" - }, - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["pg_graphql_introspection_change"] - } - }, - "required": ["type"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ltree_reindex_required"] - } - }, - "required": ["type"] - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["operator_estimator_gate"] - } - }, - "required": ["type"] - } - ] - } - } - }, - "required": [ - "eligible", - "current_app_version", - "current_app_version_release_channel", - "latest_app_version", - "target_upgrade_versions", - "duration_estimate_hours", - "legacy_auth_custom_roles", - "objects_to_be_dropped", - "unsupported_extensions", - "user_defined_objects_in_internal_schemas", - "validation_errors", - "warnings" - ] + "$ref": "#/components/schemas/ProjectUpgradeEligibilityResponse" } } } @@ -8215,9 +4636,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read", "database_read"] } ], "summary": "[Beta] Returns the project's eligibility for upgrades", @@ -8229,6 +4647,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read", "database_read"]], "x-oauth-scope": "projects:read" } }, @@ -8265,59 +4684,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "databaseUpgradeStatus": { - "type": "object", - "properties": { - "initiated_at": { - "type": "string" - }, - "latest_status_at": { - "type": "string" - }, - "target_version": { - "type": "number" - }, - "error": { - "type": "string", - "enum": [ - "1_upgraded_instance_launch_failed", - "2_volume_detachchment_from_upgraded_instance_failed", - "3_volume_attachment_to_original_instance_failed", - "4_data_upgrade_initiation_failed", - "5_data_upgrade_completion_failed", - "6_volume_detachchment_from_original_instance_failed", - "7_volume_attachment_to_upgraded_instance_failed", - "8_upgrade_completion_failed", - "9_post_physical_backup_failed" - ] - }, - "progress": { - "type": "string", - "enum": [ - "0_requested", - "1_started", - "2_launched_upgraded_instance", - "3_detached_volume_from_upgraded_instance", - "4_attached_volume_to_original_instance", - "5_initiated_data_upgrade", - "6_completed_data_upgrade", - "7_detached_volume_from_original_instance", - "8_attached_volume_to_upgraded_instance", - "9_completed_upgrade", - "10_completed_post_physical_backup" - ] - }, - "status": { - "type": "number" - } - }, - "required": ["initiated_at", "latest_status_at", "target_version", "status"], - "nullable": true - } - }, - "required": ["databaseUpgradeStatus"] + "$ref": "#/components/schemas/DatabaseUpgradeStatusResponse" } } } @@ -8338,9 +4705,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read", "database_read"] } ], "summary": "[Beta] Gets the latest status of the project's upgrade", @@ -8352,6 +4716,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read", "database_read"]], "x-oauth-scope": "projects:read" } }, @@ -8379,19 +4744,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "override_enabled": { - "type": "boolean" - }, - "override_active_until": { - "type": "string" - } - }, - "required": ["enabled", "override_enabled", "override_active_until"] + "$ref": "#/components/schemas/ReadOnlyStatusResponse" } } } @@ -8412,9 +4765,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_readonly_config_read"] } ], "summary": "Returns project's readonly mode status", @@ -8426,6 +4776,7 @@ } ], "x-endpoint-owners": ["management-api", "infra", "support-tooling"], + "x-fga-permissions": [["database_readonly_config_read"]], "x-oauth-scope": "database:read" } }, @@ -8467,9 +4818,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_readonly_config_write"] } ], "summary": "Disables project's readonly mode for the next 15 minutes", @@ -8481,6 +4829,7 @@ } ], "x-endpoint-owners": ["management-api", "infra", "support-tooling"], + "x-fga-permissions": [["database_readonly_config_write"]], "x-oauth-scope": "database:write" } }, @@ -8507,37 +4856,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "read_replica_region": { - "type": "string", - "enum": [ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "ap-east-1", - "ap-southeast-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-southeast-2", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "eu-north-1", - "eu-central-1", - "eu-central-2", - "ca-central-1", - "ap-south-1", - "sa-east-1" - ], - "description": "Region you want your read replica to reside in" - } - }, - "required": ["read_replica_region"], - "example": { - "read_replica_region": "us-west-1" - } + "$ref": "#/components/schemas/SetUpReadReplicaBody" } } } @@ -8550,7 +4869,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "403": { "description": "Forbidden action" @@ -8565,9 +4891,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_read_replicas_write"] } ], "summary": "[Beta] Set up a read replica", @@ -8579,7 +4902,8 @@ "position": "before" } ], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_read_replicas_write"]] } }, "/v1/projects/{ref}/read-replicas/remove": { @@ -8605,16 +4929,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "database_identifier": { - "type": "string" - } - }, - "required": ["database_identifier"], - "example": { - "database_identifier": "abcdefghijklmnopqrst-rr-us-west-1-abcde" - } + "$ref": "#/components/schemas/RemoveReadReplicaBody" } } } @@ -8639,14 +4954,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_read_replicas_write"] } ], "summary": "[Beta] Remove a read replica", "tags": ["Database"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_read_replicas_write"]] } }, "/v1/projects/{ref}/health": { @@ -8670,22 +4983,34 @@ "name": "services", "required": true, "in": "query", + "description": "Comma-separated list of enums or array of enums.", "schema": { - "example": ["auth", "rest"], - "type": "array", - "items": { - "type": "string", - "enum": [ - "auth", - "db", - "db_postgres_user", - "pooler", - "realtime", - "rest", - "storage", - "pg_bouncer" - ] - } + "example": ["auth,db", "auth"], + "anyOf": [ + { + "type": "string", + "description": "Comma-separated list of enums:\n\n- `auth`\n- `db`\n- `db_postgres_user`\n- `pooler`\n- `realtime`\n- `rest`\n- `storage`\n- `pg_bouncer`", + "example": ["auth,db", "auth"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "auth", + "db", + "db_postgres_user", + "pooler", + "realtime", + "rest", + "storage", + "pg_bouncer" + ] + }, + "description": "Array of enums.", + "example": ["{field}=auth&{field}=db", "{field}=auth"] + } + ] } }, { @@ -8708,89 +5033,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "enum": [ - "auth", - "db", - "db_postgres_user", - "pooler", - "realtime", - "rest", - "storage", - "pg_bouncer" - ] - }, - "healthy": { - "type": "boolean", - "deprecated": true, - "description": "Deprecated. Use `status` instead." - }, - "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", - "deprecated": true, - "description": "Deprecated. Use `status` instead." - }, - "db_connected": { - "type": "boolean" - }, - "replication_connected": { - "type": "boolean" - }, - "connected_cluster": { - "type": "integer" - } - }, - "required": [ - "healthy", - "db_connected", - "replication_connected", - "connected_cluster" - ] - }, - { - "type": "object", - "properties": { - "db_schema": { - "type": "string" - } - }, - "required": ["db_schema"] - } - ] - }, - "error": { - "type": "string" - } - }, - "required": ["name", "healthy", "status"] + "$ref": "#/components/schemas/V1ServiceHealthResponse" } } } @@ -8812,9 +5055,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "Gets project's service health status", @@ -8826,6 +5066,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" } }, @@ -8853,34 +5094,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -8898,9 +5112,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_write"] } ], "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.", @@ -8912,6 +5123,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -8937,34 +5149,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -8982,9 +5167,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_read"] } ], "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.", @@ -8996,6 +5178,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]], "x-oauth-scope": "secrets:read" } }, @@ -9022,226 +5205,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "enum": ["EdDSA", "ES256", "RS256", "HS256"] - }, - "status": { - "type": "string", - "enum": ["in_use", "standby"] - }, - "private_jwk": { - "discriminator": { - "propertyName": "kty" - }, - "oneOf": [ - { - "type": "object", - "properties": { - "kid": { - "type": "string", - "format": "uuid" - }, - "use": { - "type": "string", - "enum": ["sig"] - }, - "key_ops": { - "type": "array", - "items": { - "type": "string", - "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 - }, - "ext": { - "type": "boolean", - "enum": [true] - }, - "kty": { - "type": "string", - "enum": ["RSA"] - }, - "alg": { - "type": "string", - "enum": ["RS256"] - }, - "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": { - "kid": { - "type": "string", - "format": "uuid" - }, - "use": { - "type": "string", - "enum": ["sig"] - }, - "key_ops": { - "type": "array", - "items": { - "type": "string", - "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 - }, - "ext": { - "type": "boolean", - "enum": [true] - }, - "kty": { - "type": "string", - "enum": ["EC"] - }, - "alg": { - "type": "string", - "enum": ["ES256"] - }, - "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": { - "kid": { - "type": "string", - "format": "uuid" - }, - "use": { - "type": "string", - "enum": ["sig"] - }, - "key_ops": { - "type": "array", - "items": { - "type": "string", - "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 - }, - "ext": { - "type": "boolean", - "enum": [true] - }, - "kty": { - "type": "string", - "enum": ["OKP"] - }, - "alg": { - "type": "string", - "enum": ["EdDSA"] - }, - "crv": { - "type": "string", - "enum": ["Ed25519"] - }, - "x": { - "type": "string" - }, - "d": { - "type": "string" - } - }, - "required": ["kty", "crv", "x", "d"], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kid": { - "type": "string", - "format": "uuid" - }, - "use": { - "type": "string", - "enum": ["sig"] - }, - "key_ops": { - "type": "array", - "items": { - "type": "string", - "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 - }, - "ext": { - "type": "boolean", - "enum": [true] - }, - "kty": { - "type": "string", - "enum": ["oct"] - }, - "alg": { - "type": "string", - "enum": ["HS256"] - }, - "k": { - "type": "string", - "minLength": 16 - } - }, - "required": ["kty", "k"], - "additionalProperties": false - } - ] - } - }, - "required": ["algorithm"], - "additionalProperties": false, - "example": { - "algorithm": "RS256", - "status": "standby" - } + "$ref": "#/components/schemas/CreateSigningKeyBody" } } } @@ -9252,34 +5216,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -9297,9 +5234,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_write"] } ], "summary": "Create a new signing key for the project in standby status", @@ -9311,6 +5245,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "get": { @@ -9336,44 +5271,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "keys": { - "type": "array", - "items": { - "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 - } - } - }, - "required": ["keys"], - "additionalProperties": false + "$ref": "#/components/schemas/SigningKeysResponse" } } } @@ -9391,9 +5289,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_read"] } ], "summary": "List all signing keys for the project", @@ -9405,6 +5300,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]], "x-oauth-scope": "secrets:read" } }, @@ -9418,6 +5314,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -9442,34 +5339,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -9487,14 +5357,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_read"] } ], "summary": "Get information about a signing key", "tags": ["Auth"], - "x-endpoint-owners": ["auth"] + "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_read"]] }, "delete": { "operationId": "v1-remove-project-signing-key", @@ -9505,6 +5373,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -9529,34 +5398,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -9574,9 +5416,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_write"] } ], "summary": "Remove a signing key from a project. Only possible if the key has been in revoked status for a while.", @@ -9588,6 +5427,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" }, "patch": { @@ -9599,6 +5439,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "33333333-3333-4333-8333-333333333333", "type": "string" } @@ -9622,18 +5463,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": ["in_use", "previously_used", "revoked", "standby"] - } - }, - "required": ["status"], - "additionalProperties": false, - "example": { - "status": "standby" - } + "$ref": "#/components/schemas/UpdateSigningKeyBody" } } } @@ -9644,34 +5474,7 @@ "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 + "$ref": "#/components/schemas/SigningKeyResponse" } } } @@ -9689,9 +5492,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_signing_keys_write"] } ], "summary": "Update a signing key, mainly its status", @@ -9703,6 +5503,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_signing_keys_write"]], "x-oauth-scope": "secrets:write" } }, @@ -9730,1199 +5531,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_max_request_duration": { - "type": "integer", - "nullable": true - }, - "db_max_pool_size": { - "type": "integer", - "nullable": true - }, - "db_max_pool_size_unit": { - "type": "string", - "enum": ["connections", "percent"], - "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 - }, - "external_apple_client_id": { - "type": "string", - "nullable": true - }, - "external_apple_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_apple_enabled": { - "type": "boolean", - "nullable": true - }, - "external_apple_secret": { - "type": "string", - "nullable": true - }, - "external_azure_client_id": { - "type": "string", - "nullable": true - }, - "external_azure_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_azure_enabled": { - "type": "boolean", - "nullable": true - }, - "external_azure_secret": { - "type": "string", - "nullable": true - }, - "external_azure_url": { - "type": "string", - "nullable": true - }, - "external_bitbucket_client_id": { - "type": "string", - "nullable": true - }, - "external_bitbucket_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_bitbucket_enabled": { - "type": "boolean", - "nullable": true - }, - "external_bitbucket_secret": { - "type": "string", - "nullable": true - }, - "external_discord_client_id": { - "type": "string", - "nullable": true - }, - "external_discord_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_discord_enabled": { - "type": "boolean", - "nullable": true - }, - "external_discord_secret": { - "type": "string", - "nullable": true - }, - "external_email_enabled": { - "type": "boolean", - "nullable": true - }, - "external_facebook_client_id": { - "type": "string", - "nullable": true - }, - "external_facebook_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_facebook_enabled": { - "type": "boolean", - "nullable": true - }, - "external_facebook_secret": { - "type": "string", - "nullable": true - }, - "external_figma_client_id": { - "type": "string", - "nullable": true - }, - "external_figma_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_figma_enabled": { - "type": "boolean", - "nullable": true - }, - "external_figma_secret": { - "type": "string", - "nullable": true - }, - "external_github_client_id": { - "type": "string", - "nullable": true - }, - "external_github_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_github_enabled": { - "type": "boolean", - "nullable": true - }, - "external_github_secret": { - "type": "string", - "nullable": true - }, - "external_gitlab_client_id": { - "type": "string", - "nullable": true - }, - "external_gitlab_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_gitlab_enabled": { - "type": "boolean", - "nullable": true - }, - "external_gitlab_secret": { - "type": "string", - "nullable": true - }, - "external_gitlab_url": { - "type": "string", - "nullable": true - }, - "external_google_additional_client_ids": { - "type": "string", - "nullable": true - }, - "external_google_client_id": { - "type": "string", - "nullable": true - }, - "external_google_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_google_enabled": { - "type": "boolean", - "nullable": true - }, - "external_google_secret": { - "type": "string", - "nullable": true - }, - "external_google_skip_nonce_check": { - "type": "boolean", - "nullable": true - }, - "external_kakao_client_id": { - "type": "string", - "nullable": true - }, - "external_kakao_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_kakao_enabled": { - "type": "boolean", - "nullable": true - }, - "external_kakao_secret": { - "type": "string", - "nullable": true - }, - "external_keycloak_client_id": { - "type": "string", - "nullable": true - }, - "external_keycloak_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_keycloak_enabled": { - "type": "boolean", - "nullable": true - }, - "external_keycloak_secret": { - "type": "string", - "nullable": true - }, - "external_keycloak_url": { - "type": "string", - "nullable": true - }, - "external_linkedin_oidc_client_id": { - "type": "string", - "nullable": true - }, - "external_linkedin_oidc_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_linkedin_oidc_enabled": { - "type": "boolean", - "nullable": true - }, - "external_linkedin_oidc_secret": { - "type": "string", - "nullable": true - }, - "external_slack_oidc_client_id": { - "type": "string", - "nullable": true - }, - "external_slack_oidc_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_slack_oidc_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_oidc_secret": { - "type": "string", - "nullable": true - }, - "external_notion_client_id": { - "type": "string", - "nullable": true - }, - "external_notion_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_notion_enabled": { - "type": "boolean", - "nullable": true - }, - "external_notion_secret": { - "type": "string", - "nullable": true - }, - "external_phone_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_client_id": { - "type": "string", - "nullable": true - }, - "external_slack_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_slack_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_secret": { - "type": "string", - "nullable": true - }, - "external_spotify_client_id": { - "type": "string", - "nullable": true - }, - "external_spotify_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_spotify_enabled": { - "type": "boolean", - "nullable": true - }, - "external_spotify_secret": { - "type": "string", - "nullable": true - }, - "external_twitch_client_id": { - "type": "string", - "nullable": true - }, - "external_twitch_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_twitch_enabled": { - "type": "boolean", - "nullable": true - }, - "external_twitch_secret": { - "type": "string", - "nullable": true - }, - "external_twitter_client_id": { - "type": "string", - "nullable": true - }, - "external_twitter_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_twitter_enabled": { - "type": "boolean", - "nullable": true - }, - "external_twitter_secret": { - "type": "string", - "nullable": true - }, - "external_x_client_id": { - "type": "string", - "nullable": true - }, - "external_x_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_x_enabled": { - "type": "boolean", - "nullable": true - }, - "external_x_secret": { - "type": "string", - "nullable": true - }, - "external_workos_client_id": { - "type": "string", - "nullable": true - }, - "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_web3_ethereum_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_client_id": { - "type": "string", - "nullable": true - }, - "external_zoom_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_zoom_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_secret": { - "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_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_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 - }, - "hook_after_user_created_enabled": { - "type": "boolean", - "nullable": true - }, - "hook_after_user_created_uri": { - "type": "string", - "nullable": true - }, - "hook_after_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 - }, - "mailer_subjects_invite": { - "type": "string", - "nullable": true - }, - "mailer_subjects_magic_link": { - "type": "string", - "nullable": true - }, - "mailer_subjects_reauthentication": { - "type": "string", - "nullable": true - }, - "mailer_subjects_recovery": { - "type": "string", - "nullable": true - }, - "mailer_subjects_password_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_email_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_phone_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_enrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_unenrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_linked_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_unlinked_notification": { - "type": "string", - "nullable": true - }, - "mailer_templates_confirmation_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_email_change_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_invite_content": { - "type": "string", - "nullable": true - }, - "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 - }, - "mailer_templates_password_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_email_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_phone_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_enrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_unenrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_linked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_unlinked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_notifications_password_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_email_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_phone_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_enrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_unenrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_linked_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_unlinked_enabled": { - "type": "boolean", - "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 - }, - "passkey_enabled": { - "type": "boolean" - }, - "webauthn_rp_display_name": { - "type": "string", - "nullable": true - }, - "webauthn_rp_id": { - "type": "string", - "nullable": true - }, - "webauthn_rp_origins": { - "type": "string", - "nullable": true - }, - "mfa_phone_otp_length": { - "type": "integer" - }, - "mfa_phone_template": { - "type": "string", - "nullable": true - }, - "mfa_phone_max_frequency": { - "type": "integer", - "nullable": true - }, - "nimbus_oauth_client_id": { - "type": "string", - "nullable": true - }, - "nimbus_oauth_email_optional": { - "type": "boolean", - "nullable": true - }, - "nimbus_oauth_client_secret": { - "type": "string", - "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": { - "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_sb_forwarded_for_enabled": { - "type": "boolean", - "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 - }, - "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": "number", - "nullable": true - }, - "sessions_single_per_user": { - "type": "boolean", - "nullable": true - }, - "sessions_tags": { - "type": "string", - "nullable": true - }, - "sessions_timebox": { - "type": "number", - "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_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", - "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 - }, - "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 - }, - "smtp_user": { - "type": "string", - "nullable": true - }, - "uri_allow_list": { - "type": "string", - "nullable": true - }, - "oauth_server_enabled": { - "type": "boolean" - }, - "oauth_server_allow_dynamic_registration": { - "type": "boolean" - }, - "oauth_server_authorization_path": { - "type": "string", - "nullable": true - }, - "custom_oauth_enabled": { - "type": "boolean" - }, - "custom_oauth_max_providers": { - "type": "integer" - } - }, - "required": [ - "api_max_request_duration", - "db_max_pool_size", - "db_max_pool_size_unit", - "disable_signup", - "external_anonymous_users_enabled", - "external_apple_additional_client_ids", - "external_apple_client_id", - "external_apple_email_optional", - "external_apple_enabled", - "external_apple_secret", - "external_azure_client_id", - "external_azure_email_optional", - "external_azure_enabled", - "external_azure_secret", - "external_azure_url", - "external_bitbucket_client_id", - "external_bitbucket_email_optional", - "external_bitbucket_enabled", - "external_bitbucket_secret", - "external_discord_client_id", - "external_discord_email_optional", - "external_discord_enabled", - "external_discord_secret", - "external_email_enabled", - "external_facebook_client_id", - "external_facebook_email_optional", - "external_facebook_enabled", - "external_facebook_secret", - "external_figma_client_id", - "external_figma_email_optional", - "external_figma_enabled", - "external_figma_secret", - "external_github_client_id", - "external_github_email_optional", - "external_github_enabled", - "external_github_secret", - "external_gitlab_client_id", - "external_gitlab_email_optional", - "external_gitlab_enabled", - "external_gitlab_secret", - "external_gitlab_url", - "external_google_additional_client_ids", - "external_google_client_id", - "external_google_email_optional", - "external_google_enabled", - "external_google_secret", - "external_google_skip_nonce_check", - "external_kakao_client_id", - "external_kakao_email_optional", - "external_kakao_enabled", - "external_kakao_secret", - "external_keycloak_client_id", - "external_keycloak_email_optional", - "external_keycloak_enabled", - "external_keycloak_secret", - "external_keycloak_url", - "external_linkedin_oidc_client_id", - "external_linkedin_oidc_email_optional", - "external_linkedin_oidc_enabled", - "external_linkedin_oidc_secret", - "external_slack_oidc_client_id", - "external_slack_oidc_email_optional", - "external_slack_oidc_enabled", - "external_slack_oidc_secret", - "external_notion_client_id", - "external_notion_email_optional", - "external_notion_enabled", - "external_notion_secret", - "external_phone_enabled", - "external_slack_client_id", - "external_slack_email_optional", - "external_slack_enabled", - "external_slack_secret", - "external_spotify_client_id", - "external_spotify_email_optional", - "external_spotify_enabled", - "external_spotify_secret", - "external_twitch_client_id", - "external_twitch_email_optional", - "external_twitch_enabled", - "external_twitch_secret", - "external_twitter_client_id", - "external_twitter_email_optional", - "external_twitter_enabled", - "external_twitter_secret", - "external_x_client_id", - "external_x_email_optional", - "external_x_enabled", - "external_x_secret", - "external_workos_client_id", - "external_workos_enabled", - "external_workos_secret", - "external_workos_url", - "external_web3_solana_enabled", - "external_web3_ethereum_enabled", - "external_zoom_client_id", - "external_zoom_email_optional", - "external_zoom_enabled", - "external_zoom_secret", - "hook_custom_access_token_enabled", - "hook_custom_access_token_uri", - "hook_custom_access_token_secrets", - "hook_mfa_verification_attempt_enabled", - "hook_mfa_verification_attempt_uri", - "hook_mfa_verification_attempt_secrets", - "hook_password_verification_attempt_enabled", - "hook_password_verification_attempt_uri", - "hook_password_verification_attempt_secrets", - "hook_send_sms_enabled", - "hook_send_sms_uri", - "hook_send_sms_secrets", - "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", - "hook_after_user_created_enabled", - "hook_after_user_created_uri", - "hook_after_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", - "mailer_subjects_invite", - "mailer_subjects_magic_link", - "mailer_subjects_reauthentication", - "mailer_subjects_recovery", - "mailer_subjects_password_changed_notification", - "mailer_subjects_email_changed_notification", - "mailer_subjects_phone_changed_notification", - "mailer_subjects_mfa_factor_enrolled_notification", - "mailer_subjects_mfa_factor_unenrolled_notification", - "mailer_subjects_identity_linked_notification", - "mailer_subjects_identity_unlinked_notification", - "mailer_templates_confirmation_content", - "mailer_templates_email_change_content", - "mailer_templates_invite_content", - "mailer_templates_magic_link_content", - "mailer_templates_reauthentication_content", - "mailer_templates_recovery_content", - "mailer_templates_password_changed_notification_content", - "mailer_templates_email_changed_notification_content", - "mailer_templates_phone_changed_notification_content", - "mailer_templates_mfa_factor_enrolled_notification_content", - "mailer_templates_mfa_factor_unenrolled_notification_content", - "mailer_templates_identity_linked_notification_content", - "mailer_templates_identity_unlinked_notification_content", - "mailer_notifications_password_changed_enabled", - "mailer_notifications_email_changed_enabled", - "mailer_notifications_phone_changed_enabled", - "mailer_notifications_mfa_factor_enrolled_enabled", - "mailer_notifications_mfa_factor_unenrolled_enabled", - "mailer_notifications_identity_linked_enabled", - "mailer_notifications_identity_unlinked_enabled", - "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", - "passkey_enabled", - "webauthn_rp_display_name", - "webauthn_rp_id", - "webauthn_rp_origins", - "mfa_phone_otp_length", - "mfa_phone_template", - "mfa_phone_max_frequency", - "nimbus_oauth_client_id", - "nimbus_oauth_email_optional", - "nimbus_oauth_client_secret", - "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", - "saml_allow_encrypted_assertions", - "security_sb_forwarded_for_enabled", - "security_captcha_enabled", - "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", - "sms_test_otp_valid_until", - "sms_textlocal_api_key", - "sms_textlocal_sender", - "sms_twilio_account_sid", - "sms_twilio_auth_token", - "sms_twilio_content_sid", - "sms_twilio_message_service_sid", - "sms_twilio_verify_account_sid", - "sms_twilio_verify_auth_token", - "sms_twilio_verify_message_service_sid", - "sms_vonage_api_key", - "sms_vonage_api_secret", - "sms_vonage_from", - "smtp_admin_email", - "smtp_host", - "smtp_max_frequency", - "smtp_pass", - "smtp_port", - "smtp_sender_name", - "smtp_user", - "uri_allow_list", - "oauth_server_enabled", - "oauth_server_allow_dynamic_registration", - "oauth_server_authorization_path", - "custom_oauth_enabled", - "custom_oauth_max_providers" - ] + "$ref": "#/components/schemas/AuthConfigResponse" } } } @@ -10943,9 +5552,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_read"] } ], "summary": "Gets project's auth config", @@ -10957,6 +5563,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" }, "patch": { @@ -10981,1001 +5588,7 @@ "content": { "application/json": { "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, - "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, - "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_subjects_password_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_email_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_phone_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_enrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_unenrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_linked_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_unlinked_notification": { - "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 - }, - "mailer_templates_password_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_email_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_phone_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_enrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_unenrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_linked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_unlinked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_notifications_password_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_email_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_phone_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_enrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_unenrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_linked_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_unlinked_enabled": { - "type": "boolean", - "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_sb_forwarded_for_enabled": { - "type": "boolean", - "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": "number", - "minimum": 0, - "nullable": true - }, - "sessions_inactivity_timeout": { - "type": "number", - "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, - "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 - }, - "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, - "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 - }, - "hook_after_user_created_enabled": { - "type": "boolean", - "nullable": true - }, - "hook_after_user_created_uri": { - "type": "string", - "nullable": true - }, - "hook_after_user_created_secrets": { - "type": "string", - "nullable": true - }, - "external_apple_enabled": { - "type": "boolean", - "nullable": true - }, - "external_apple_client_id": { - "type": "string", - "nullable": true - }, - "external_apple_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "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_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_twitter_secret": { - "type": "string", - "nullable": true - }, - "external_x_enabled": { - "type": "boolean", - "nullable": true - }, - "external_x_client_id": { - "type": "string", - "nullable": true - }, - "external_x_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_x_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_web3_ethereum_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_client_id": { - "type": "string", - "nullable": true - }, - "external_zoom_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_zoom_secret": { - "type": "string", - "nullable": true - }, - "db_max_pool_size": { - "type": "integer", - "nullable": true - }, - "db_max_pool_size_unit": { - "type": "string", - "enum": ["connections", "percent"], - "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 - }, - "passkey_enabled": { - "type": "boolean" - }, - "webauthn_rp_display_name": { - "type": "string", - "nullable": true - }, - "webauthn_rp_id": { - "type": "string", - "nullable": true - }, - "webauthn_rp_origins": { - "type": "string", - "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 - }, - "nimbus_oauth_client_id": { - "type": "string", - "nullable": true - }, - "nimbus_oauth_client_secret": { - "type": "string", - "nullable": true - }, - "oauth_server_enabled": { - "type": "boolean", - "nullable": true - }, - "oauth_server_allow_dynamic_registration": { - "type": "boolean", - "nullable": true - }, - "oauth_server_authorization_path": { - "type": "string", - "nullable": true - }, - "custom_oauth_enabled": { - "type": "boolean" - } - }, - "example": { - "site_url": "https://app.example.com", - "disable_signup": false, - "jwt_exp": 3600 - } + "$ref": "#/components/schemas/UpdateAuthConfigBody" } } } @@ -11986,1199 +5599,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "api_max_request_duration": { - "type": "integer", - "nullable": true - }, - "db_max_pool_size": { - "type": "integer", - "nullable": true - }, - "db_max_pool_size_unit": { - "type": "string", - "enum": ["connections", "percent"], - "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 - }, - "external_apple_client_id": { - "type": "string", - "nullable": true - }, - "external_apple_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_apple_enabled": { - "type": "boolean", - "nullable": true - }, - "external_apple_secret": { - "type": "string", - "nullable": true - }, - "external_azure_client_id": { - "type": "string", - "nullable": true - }, - "external_azure_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_azure_enabled": { - "type": "boolean", - "nullable": true - }, - "external_azure_secret": { - "type": "string", - "nullable": true - }, - "external_azure_url": { - "type": "string", - "nullable": true - }, - "external_bitbucket_client_id": { - "type": "string", - "nullable": true - }, - "external_bitbucket_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_bitbucket_enabled": { - "type": "boolean", - "nullable": true - }, - "external_bitbucket_secret": { - "type": "string", - "nullable": true - }, - "external_discord_client_id": { - "type": "string", - "nullable": true - }, - "external_discord_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_discord_enabled": { - "type": "boolean", - "nullable": true - }, - "external_discord_secret": { - "type": "string", - "nullable": true - }, - "external_email_enabled": { - "type": "boolean", - "nullable": true - }, - "external_facebook_client_id": { - "type": "string", - "nullable": true - }, - "external_facebook_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_facebook_enabled": { - "type": "boolean", - "nullable": true - }, - "external_facebook_secret": { - "type": "string", - "nullable": true - }, - "external_figma_client_id": { - "type": "string", - "nullable": true - }, - "external_figma_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_figma_enabled": { - "type": "boolean", - "nullable": true - }, - "external_figma_secret": { - "type": "string", - "nullable": true - }, - "external_github_client_id": { - "type": "string", - "nullable": true - }, - "external_github_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_github_enabled": { - "type": "boolean", - "nullable": true - }, - "external_github_secret": { - "type": "string", - "nullable": true - }, - "external_gitlab_client_id": { - "type": "string", - "nullable": true - }, - "external_gitlab_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_gitlab_enabled": { - "type": "boolean", - "nullable": true - }, - "external_gitlab_secret": { - "type": "string", - "nullable": true - }, - "external_gitlab_url": { - "type": "string", - "nullable": true - }, - "external_google_additional_client_ids": { - "type": "string", - "nullable": true - }, - "external_google_client_id": { - "type": "string", - "nullable": true - }, - "external_google_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_google_enabled": { - "type": "boolean", - "nullable": true - }, - "external_google_secret": { - "type": "string", - "nullable": true - }, - "external_google_skip_nonce_check": { - "type": "boolean", - "nullable": true - }, - "external_kakao_client_id": { - "type": "string", - "nullable": true - }, - "external_kakao_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_kakao_enabled": { - "type": "boolean", - "nullable": true - }, - "external_kakao_secret": { - "type": "string", - "nullable": true - }, - "external_keycloak_client_id": { - "type": "string", - "nullable": true - }, - "external_keycloak_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_keycloak_enabled": { - "type": "boolean", - "nullable": true - }, - "external_keycloak_secret": { - "type": "string", - "nullable": true - }, - "external_keycloak_url": { - "type": "string", - "nullable": true - }, - "external_linkedin_oidc_client_id": { - "type": "string", - "nullable": true - }, - "external_linkedin_oidc_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_linkedin_oidc_enabled": { - "type": "boolean", - "nullable": true - }, - "external_linkedin_oidc_secret": { - "type": "string", - "nullable": true - }, - "external_slack_oidc_client_id": { - "type": "string", - "nullable": true - }, - "external_slack_oidc_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_slack_oidc_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_oidc_secret": { - "type": "string", - "nullable": true - }, - "external_notion_client_id": { - "type": "string", - "nullable": true - }, - "external_notion_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_notion_enabled": { - "type": "boolean", - "nullable": true - }, - "external_notion_secret": { - "type": "string", - "nullable": true - }, - "external_phone_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_client_id": { - "type": "string", - "nullable": true - }, - "external_slack_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_slack_enabled": { - "type": "boolean", - "nullable": true - }, - "external_slack_secret": { - "type": "string", - "nullable": true - }, - "external_spotify_client_id": { - "type": "string", - "nullable": true - }, - "external_spotify_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_spotify_enabled": { - "type": "boolean", - "nullable": true - }, - "external_spotify_secret": { - "type": "string", - "nullable": true - }, - "external_twitch_client_id": { - "type": "string", - "nullable": true - }, - "external_twitch_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_twitch_enabled": { - "type": "boolean", - "nullable": true - }, - "external_twitch_secret": { - "type": "string", - "nullable": true - }, - "external_twitter_client_id": { - "type": "string", - "nullable": true - }, - "external_twitter_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_twitter_enabled": { - "type": "boolean", - "nullable": true - }, - "external_twitter_secret": { - "type": "string", - "nullable": true - }, - "external_x_client_id": { - "type": "string", - "nullable": true - }, - "external_x_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_x_enabled": { - "type": "boolean", - "nullable": true - }, - "external_x_secret": { - "type": "string", - "nullable": true - }, - "external_workos_client_id": { - "type": "string", - "nullable": true - }, - "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_web3_ethereum_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_client_id": { - "type": "string", - "nullable": true - }, - "external_zoom_email_optional": { - "type": "boolean", - "nullable": true - }, - "external_zoom_enabled": { - "type": "boolean", - "nullable": true - }, - "external_zoom_secret": { - "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_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_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 - }, - "hook_after_user_created_enabled": { - "type": "boolean", - "nullable": true - }, - "hook_after_user_created_uri": { - "type": "string", - "nullable": true - }, - "hook_after_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 - }, - "mailer_subjects_invite": { - "type": "string", - "nullable": true - }, - "mailer_subjects_magic_link": { - "type": "string", - "nullable": true - }, - "mailer_subjects_reauthentication": { - "type": "string", - "nullable": true - }, - "mailer_subjects_recovery": { - "type": "string", - "nullable": true - }, - "mailer_subjects_password_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_email_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_phone_changed_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_enrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_mfa_factor_unenrolled_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_linked_notification": { - "type": "string", - "nullable": true - }, - "mailer_subjects_identity_unlinked_notification": { - "type": "string", - "nullable": true - }, - "mailer_templates_confirmation_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_email_change_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_invite_content": { - "type": "string", - "nullable": true - }, - "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 - }, - "mailer_templates_password_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_email_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_phone_changed_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_enrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_mfa_factor_unenrolled_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_linked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_templates_identity_unlinked_notification_content": { - "type": "string", - "nullable": true - }, - "mailer_notifications_password_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_email_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_phone_changed_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_enrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_mfa_factor_unenrolled_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_linked_enabled": { - "type": "boolean", - "nullable": true - }, - "mailer_notifications_identity_unlinked_enabled": { - "type": "boolean", - "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 - }, - "passkey_enabled": { - "type": "boolean" - }, - "webauthn_rp_display_name": { - "type": "string", - "nullable": true - }, - "webauthn_rp_id": { - "type": "string", - "nullable": true - }, - "webauthn_rp_origins": { - "type": "string", - "nullable": true - }, - "mfa_phone_otp_length": { - "type": "integer" - }, - "mfa_phone_template": { - "type": "string", - "nullable": true - }, - "mfa_phone_max_frequency": { - "type": "integer", - "nullable": true - }, - "nimbus_oauth_client_id": { - "type": "string", - "nullable": true - }, - "nimbus_oauth_email_optional": { - "type": "boolean", - "nullable": true - }, - "nimbus_oauth_client_secret": { - "type": "string", - "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": { - "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_sb_forwarded_for_enabled": { - "type": "boolean", - "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 - }, - "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": "number", - "nullable": true - }, - "sessions_single_per_user": { - "type": "boolean", - "nullable": true - }, - "sessions_tags": { - "type": "string", - "nullable": true - }, - "sessions_timebox": { - "type": "number", - "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_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", - "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 - }, - "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 - }, - "smtp_user": { - "type": "string", - "nullable": true - }, - "uri_allow_list": { - "type": "string", - "nullable": true - }, - "oauth_server_enabled": { - "type": "boolean" - }, - "oauth_server_allow_dynamic_registration": { - "type": "boolean" - }, - "oauth_server_authorization_path": { - "type": "string", - "nullable": true - }, - "custom_oauth_enabled": { - "type": "boolean" - }, - "custom_oauth_max_providers": { - "type": "integer" - } - }, - "required": [ - "api_max_request_duration", - "db_max_pool_size", - "db_max_pool_size_unit", - "disable_signup", - "external_anonymous_users_enabled", - "external_apple_additional_client_ids", - "external_apple_client_id", - "external_apple_email_optional", - "external_apple_enabled", - "external_apple_secret", - "external_azure_client_id", - "external_azure_email_optional", - "external_azure_enabled", - "external_azure_secret", - "external_azure_url", - "external_bitbucket_client_id", - "external_bitbucket_email_optional", - "external_bitbucket_enabled", - "external_bitbucket_secret", - "external_discord_client_id", - "external_discord_email_optional", - "external_discord_enabled", - "external_discord_secret", - "external_email_enabled", - "external_facebook_client_id", - "external_facebook_email_optional", - "external_facebook_enabled", - "external_facebook_secret", - "external_figma_client_id", - "external_figma_email_optional", - "external_figma_enabled", - "external_figma_secret", - "external_github_client_id", - "external_github_email_optional", - "external_github_enabled", - "external_github_secret", - "external_gitlab_client_id", - "external_gitlab_email_optional", - "external_gitlab_enabled", - "external_gitlab_secret", - "external_gitlab_url", - "external_google_additional_client_ids", - "external_google_client_id", - "external_google_email_optional", - "external_google_enabled", - "external_google_secret", - "external_google_skip_nonce_check", - "external_kakao_client_id", - "external_kakao_email_optional", - "external_kakao_enabled", - "external_kakao_secret", - "external_keycloak_client_id", - "external_keycloak_email_optional", - "external_keycloak_enabled", - "external_keycloak_secret", - "external_keycloak_url", - "external_linkedin_oidc_client_id", - "external_linkedin_oidc_email_optional", - "external_linkedin_oidc_enabled", - "external_linkedin_oidc_secret", - "external_slack_oidc_client_id", - "external_slack_oidc_email_optional", - "external_slack_oidc_enabled", - "external_slack_oidc_secret", - "external_notion_client_id", - "external_notion_email_optional", - "external_notion_enabled", - "external_notion_secret", - "external_phone_enabled", - "external_slack_client_id", - "external_slack_email_optional", - "external_slack_enabled", - "external_slack_secret", - "external_spotify_client_id", - "external_spotify_email_optional", - "external_spotify_enabled", - "external_spotify_secret", - "external_twitch_client_id", - "external_twitch_email_optional", - "external_twitch_enabled", - "external_twitch_secret", - "external_twitter_client_id", - "external_twitter_email_optional", - "external_twitter_enabled", - "external_twitter_secret", - "external_x_client_id", - "external_x_email_optional", - "external_x_enabled", - "external_x_secret", - "external_workos_client_id", - "external_workos_enabled", - "external_workos_secret", - "external_workos_url", - "external_web3_solana_enabled", - "external_web3_ethereum_enabled", - "external_zoom_client_id", - "external_zoom_email_optional", - "external_zoom_enabled", - "external_zoom_secret", - "hook_custom_access_token_enabled", - "hook_custom_access_token_uri", - "hook_custom_access_token_secrets", - "hook_mfa_verification_attempt_enabled", - "hook_mfa_verification_attempt_uri", - "hook_mfa_verification_attempt_secrets", - "hook_password_verification_attempt_enabled", - "hook_password_verification_attempt_uri", - "hook_password_verification_attempt_secrets", - "hook_send_sms_enabled", - "hook_send_sms_uri", - "hook_send_sms_secrets", - "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", - "hook_after_user_created_enabled", - "hook_after_user_created_uri", - "hook_after_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", - "mailer_subjects_invite", - "mailer_subjects_magic_link", - "mailer_subjects_reauthentication", - "mailer_subjects_recovery", - "mailer_subjects_password_changed_notification", - "mailer_subjects_email_changed_notification", - "mailer_subjects_phone_changed_notification", - "mailer_subjects_mfa_factor_enrolled_notification", - "mailer_subjects_mfa_factor_unenrolled_notification", - "mailer_subjects_identity_linked_notification", - "mailer_subjects_identity_unlinked_notification", - "mailer_templates_confirmation_content", - "mailer_templates_email_change_content", - "mailer_templates_invite_content", - "mailer_templates_magic_link_content", - "mailer_templates_reauthentication_content", - "mailer_templates_recovery_content", - "mailer_templates_password_changed_notification_content", - "mailer_templates_email_changed_notification_content", - "mailer_templates_phone_changed_notification_content", - "mailer_templates_mfa_factor_enrolled_notification_content", - "mailer_templates_mfa_factor_unenrolled_notification_content", - "mailer_templates_identity_linked_notification_content", - "mailer_templates_identity_unlinked_notification_content", - "mailer_notifications_password_changed_enabled", - "mailer_notifications_email_changed_enabled", - "mailer_notifications_phone_changed_enabled", - "mailer_notifications_mfa_factor_enrolled_enabled", - "mailer_notifications_mfa_factor_unenrolled_enabled", - "mailer_notifications_identity_linked_enabled", - "mailer_notifications_identity_unlinked_enabled", - "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", - "passkey_enabled", - "webauthn_rp_display_name", - "webauthn_rp_id", - "webauthn_rp_origins", - "mfa_phone_otp_length", - "mfa_phone_template", - "mfa_phone_max_frequency", - "nimbus_oauth_client_id", - "nimbus_oauth_email_optional", - "nimbus_oauth_client_secret", - "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", - "saml_allow_encrypted_assertions", - "security_sb_forwarded_for_enabled", - "security_captcha_enabled", - "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", - "sms_test_otp_valid_until", - "sms_textlocal_api_key", - "sms_textlocal_sender", - "sms_twilio_account_sid", - "sms_twilio_auth_token", - "sms_twilio_content_sid", - "sms_twilio_message_service_sid", - "sms_twilio_verify_account_sid", - "sms_twilio_verify_auth_token", - "sms_twilio_verify_message_service_sid", - "sms_vonage_api_key", - "sms_vonage_api_secret", - "sms_vonage_from", - "smtp_admin_email", - "smtp_host", - "smtp_max_frequency", - "smtp_pass", - "smtp_port", - "smtp_sender_name", - "smtp_user", - "uri_allow_list", - "oauth_server_enabled", - "oauth_server_allow_dynamic_registration", - "oauth_server_authorization_path", - "custom_oauth_enabled", - "custom_oauth_max_providers" - ] + "$ref": "#/components/schemas/AuthConfigResponse" } } } @@ -13199,9 +5620,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write", "project_admin_write"] } ], "summary": "Updates a project's auth config", @@ -13213,6 +5631,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write", "project_admin_write"]], "x-oauth-scope": "auth:write" } }, @@ -13239,20 +5658,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "oidc_issuer_url": { - "type": "string" - }, - "jwks_url": { - "type": "string" - }, - "custom_jwks": {} - }, - "example": { - "oidc_issuer_url": "https://login.acme.com", - "jwks_url": "https://login.acme.com/.well-known/jwks.json" - } + "$ref": "#/components/schemas/CreateThirdPartyAuthBody" } } } @@ -13263,41 +5669,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string" - }, - "oidc_issuer_url": { - "type": "string", - "nullable": true - }, - "jwks_url": { - "type": "string", - "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"] + "$ref": "#/components/schemas/ThirdPartyAuth" } } } @@ -13315,9 +5687,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write"] } ], "summary": "Creates a new third-party auth integration", @@ -13329,6 +5698,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -13356,41 +5726,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string" - }, - "oidc_issuer_url": { - "type": "string", - "nullable": true - }, - "jwks_url": { - "type": "string", - "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"] + "$ref": "#/components/schemas/ThirdPartyAuth" } } } @@ -13409,9 +5745,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_read"] } ], "summary": "Lists all third-party auth integrations", @@ -13423,6 +5756,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -13449,6 +5783,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "88888888-8888-4888-8888-888888888888", "type": "string" } @@ -13460,41 +5795,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string" - }, - "oidc_issuer_url": { - "type": "string", - "nullable": true - }, - "jwks_url": { - "type": "string", - "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"] + "$ref": "#/components/schemas/ThirdPartyAuth" } } } @@ -13512,9 +5813,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write"] } ], "summary": "Removes a third-party auth integration", @@ -13526,6 +5824,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -13550,6 +5849,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "88888888-8888-4888-8888-888888888888", "type": "string" } @@ -13561,41 +5861,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string" - }, - "oidc_issuer_url": { - "type": "string", - "nullable": true - }, - "jwks_url": { - "type": "string", - "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"] + "$ref": "#/components/schemas/ThirdPartyAuth" } } } @@ -13613,9 +5879,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_read"] } ], "summary": "Get a third-party integration", @@ -13627,6 +5890,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -13665,9 +5929,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Pauses the given project", @@ -13679,6 +5940,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -13717,9 +5979,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Restarts the given project", @@ -13731,6 +5990,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -13758,30 +6018,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "available_versions": { - "type": "array", - "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"] + "$ref": "#/components/schemas/GetProjectAvailableRestoreVersionsResponse" } } } @@ -13799,9 +6036,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "Lists available restore versions for the given project", @@ -13813,6 +6047,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_read"]], "x-oauth-scope": "projects:read" }, "post": { @@ -13849,9 +6084,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Restores the given project", @@ -13863,6 +6095,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -13901,9 +6134,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Cancels the given project restoration", @@ -13915,6 +6145,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["project_admin_write"]], "x-oauth-scope": "projects:write" } }, @@ -13943,234 +6174,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "selected_addons": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "custom_domain", - "compute_instance", - "pitr", - "ipv4", - "auth_mfa_phone", - "auth_mfa_web_authn", - "log_drain", - "etl_pipeline" - ] - }, - "variant": { - "type": "object", - "properties": { - "id": { - "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"] - }, - { - "type": "string", - "enum": ["auth_mfa_phone_default"] - }, - { - "type": "string", - "enum": ["auth_mfa_web_authn_default"] - }, - { - "type": "string", - "enum": ["log_drain_default"] - }, - { - "type": "string", - "enum": ["etl_pipeline_default"] - } - ] - }, - "name": { - "type": "string" - }, - "price": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["fixed", "usage"] - }, - "interval": { - "type": "string", - "enum": ["monthly", "hourly"] - }, - "amount": { - "type": "number" - } - }, - "required": ["description", "type", "interval", "amount"] - }, - "meta": { - "description": "Any JSON-serializable value" - } - }, - "required": ["id", "name", "price"] - } - }, - "required": ["type", "variant"] - } - }, - "available_addons": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "custom_domain", - "compute_instance", - "pitr", - "ipv4", - "auth_mfa_phone", - "auth_mfa_web_authn", - "log_drain", - "etl_pipeline" - ] - }, - "name": { - "type": "string" - }, - "variants": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "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"] - }, - { - "type": "string", - "enum": ["auth_mfa_phone_default"] - }, - { - "type": "string", - "enum": ["auth_mfa_web_authn_default"] - }, - { - "type": "string", - "enum": ["log_drain_default"] - }, - { - "type": "string", - "enum": ["etl_pipeline_default"] - } - ] - }, - "name": { - "type": "string" - }, - "price": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["fixed", "usage"] - }, - "interval": { - "type": "string", - "enum": ["monthly", "hourly"] - }, - "amount": { - "type": "number" - } - }, - "required": ["description", "type", "interval", "amount"] - }, - "meta": { - "description": "Any JSON-serializable value" - } - }, - "required": ["id", "name", "price"] - } - } - }, - "required": ["type", "name", "variants"] - } - } - }, - "required": ["selected_addons", "available_addons"] + "$ref": "#/components/schemas/ListProjectAddonsResponse" } } } @@ -14191,14 +6195,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_add_ons_read"] } ], "summary": "List billing addons and compute instance selections", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_read"]] }, "patch": { "description": "Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project.", @@ -14223,66 +6225,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "addon_variant": { - "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"] - } - ] - }, - "addon_type": { - "type": "string", - "enum": [ - "custom_domain", - "compute_instance", - "pitr", - "ipv4", - "auth_mfa_phone", - "auth_mfa_web_authn", - "log_drain", - "etl_pipeline" - ] - } - }, - "required": ["addon_variant", "addon_type"], - "example": { - "addon_variant": "pitr_7", - "addon_type": "pitr" - } + "$ref": "#/components/schemas/ApplyProjectAddonBody" } } } @@ -14307,14 +6250,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_add_ons_write"] } ], "summary": "Apply or update billing addons, including compute instance size", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_write"]] } }, "/v1/projects/{ref}/billing/addons/{addon_variant}": { @@ -14341,7 +6282,7 @@ "in": "path", "schema": { "example": "pitr_7", - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -14401,14 +6342,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_add_ons_write"] } ], "summary": "Remove billing addons or revert compute instance sizing", "tags": ["Billing"], - "x-endpoint-owners": ["billing"] + "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["infra_add_ons_write"]] } }, "/v1/projects/{ref}/claim-token": { @@ -14435,23 +6374,7 @@ "content": { "application/json": { "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"] + "$ref": "#/components/schemas/ProjectClaimTokenResponse" } } } @@ -14469,14 +6392,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "Gets project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]], "x-internal": true }, "post": { @@ -14502,26 +6423,7 @@ "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"] + "$ref": "#/components/schemas/CreateProjectClaimTokenResponse" } } } @@ -14539,14 +6441,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write", "project_admin_write"] } ], "summary": "Creates project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]], "x-internal": true }, "delete": { @@ -14583,14 +6483,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write", "project_admin_write"] } ], "summary": "Revokes project claim token", "tags": ["Projects"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write", "project_admin_write"]], "x-internal": true } }, @@ -14620,127 +6518,7 @@ "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", - "vulnerable_postgres_version" - ] - }, - "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"] + "$ref": "#/components/schemas/V1ProjectAdvisorsResponse" } } } @@ -14758,9 +6536,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["advisors_read"] } ], "summary": "Gets project performance advisors.", @@ -14772,6 +6547,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["advisors_read"]], "x-oauth-scope": "database:read" } }, @@ -14811,127 +6587,7 @@ "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", - "vulnerable_postgres_version" - ] - }, - "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"] + "$ref": "#/components/schemas/V1ProjectAdvisorsResponse" } } } @@ -14949,9 +6605,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["advisors_read"] } ], "summary": "Gets project security advisors.", @@ -14963,6 +6616,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["advisors_read"]], "x-oauth-scope": "database:read" } }, @@ -14991,6 +6645,7 @@ "in": "query", "description": "Custom SQL query to execute on the logs. See [querying logs](/docs/guides/telemetry/logs?queryGroups=product&product=postgres&queryGroups=source&source=edge_logs#querying-with-the-logs-explorer) for more details.", "schema": { + "example": "select event_message from edge_logs limit 10", "type": "string" } }, @@ -15000,6 +6655,7 @@ "in": "query", "schema": { "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "example": "2025-03-01T00:00:00Z", "type": "string" } @@ -15010,6 +6666,7 @@ "in": "query", "schema": { "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "example": "2025-03-01T23:59:59Z", "type": "string" } @@ -15021,65 +6678,7 @@ "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"] - } - ] - } - } + "$ref": "#/components/schemas/AnalyticsResponse" } } } @@ -15100,9 +6699,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_logs_read"] } ], "summary": "Gets project's logs", @@ -15114,6 +6710,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], "x-oauth-scope": "analytics:read" } }, @@ -15142,6 +6739,7 @@ "in": "query", "description": "Custom SQL query to execute on the logs. See [querying logs](/docs/guides/telemetry/logs?queryGroups=product&product=postgres&queryGroups=source&source=edge_logs#querying-with-the-logs-explorer) for more details.", "schema": { + "example": "select event_message from edge_logs limit 10", "type": "string" } }, @@ -15151,6 +6749,7 @@ "in": "query", "schema": { "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "example": "2025-03-01T00:00:00Z", "type": "string" } @@ -15161,6 +6760,7 @@ "in": "query", "schema": { "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "example": "2025-03-01T23:59:59Z", "type": "string" } @@ -15172,65 +6772,7 @@ "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"] - } - ] - } - } + "$ref": "#/components/schemas/AnalyticsResponse" } } } @@ -15251,9 +6793,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_logs_read"] } ], "summary": "Gets all project's logs in a single log stream", @@ -15265,6 +6804,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], "x-oauth-scope": "analytics:read" } }, @@ -15302,92 +6842,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "result": { - "type": "array", - "items": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time" - }, - "total_auth_requests": { - "type": "number" - }, - "total_realtime_requests": { - "type": "number" - }, - "total_rest_requests": { - "type": "number" - }, - "total_storage_requests": { - "type": "number" - } - }, - "required": [ - "timestamp", - "total_auth_requests", - "total_realtime_requests", - "total_rest_requests", - "total_storage_requests" - ] - } - }, - "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"] - } - ] - } - } + "$ref": "#/components/schemas/V1GetUsageApiCountResponse" } } } @@ -15408,14 +6863,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_usage_read"] } ], "summary": "Gets project's usage api counts", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] } }, "/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count": { @@ -15442,73 +6895,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "result": { - "type": "array", - "items": { - "type": "object", - "properties": { - "count": { - "type": "number" - } - }, - "required": ["count"] - } - }, - "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"] - } - ] - } - } + "$ref": "#/components/schemas/V1GetUsageApiRequestsCountResponse" } } } @@ -15529,14 +6916,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_usage_read"] } ], "summary": "Gets project's usage api requests count", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] } }, "/v1/projects/{ref}/analytics/endpoints/functions.combined-stats": { @@ -15582,65 +6967,7 @@ "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"] - } - ] - } - } + "$ref": "#/components/schemas/AnalyticsResponse" } } } @@ -15661,14 +6988,78 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_usage_read"] } ], "summary": "Gets a project's function combined statistics", "tags": ["Analytics"], - "x-endpoint-owners": ["analytics"] + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_usage_read"]] + } + }, + "/v1/projects/{ref}/analytics/endpoints/metrics": { + "get": { + "description": "Prometheus scrape endpoint. Returns metrics of a customer project in the Prometheus open exposition format.", + "operationId": "v1-scrape-project-metrics", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Prometheus / OpenMetrics text exposition", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + }, + "application/openmetrics-text": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + }, + "500": { + "description": "Failed to fetch project's metrics" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "Scrape a project's metrics", + "tags": ["Analytics"], + "x-badges": [ + { + "name": "OAuth scope: analytics:read", + "position": "after" + } + ], + "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_logs_read"]], + "x-oauth-scope": "analytics:read" } }, "/v1/projects/{ref}/cli/login-role": { @@ -15694,16 +7085,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "read_only": { - "type": "boolean" - } - }, - "required": ["read_only"], - "example": { - "read_only": true - } + "$ref": "#/components/schemas/CreateRoleBody" } } } @@ -15714,23 +7096,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "password": { - "type": "string", - "minLength": 1 - }, - "ttl_seconds": { - "type": "integer", - "minimum": 1, - "format": "int64" - } - }, - "required": ["role", "password", "ttl_seconds"] + "$ref": "#/components/schemas/CreateRoleResponse" } } } @@ -15751,9 +7117,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_write"] } ], "summary": "[Beta] Create a login role for CLI with temporary password", @@ -15765,6 +7128,7 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_write"]], "x-oauth-scope": "database:write" }, "delete": { @@ -15790,14 +7154,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "enum": ["ok"] - } - }, - "required": ["message"] + "$ref": "#/components/schemas/DeleteRolesResponse" } } } @@ -15818,9 +7175,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_write"] } ], "summary": "[Beta] Delete existing login roles used by CLI", @@ -15832,12 +7186,12 @@ } ], "x-endpoint-owners": ["dev-workflows"], + "x-fga-permissions": [["database_write"]], "x-oauth-scope": "database:write" } }, "/v1/projects/{ref}/database/migrations": { "get": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-list-migration-history", "parameters": [ { @@ -15860,20 +7214,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "version": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string" - } - }, - "required": ["version"] - } + "$ref": "#/components/schemas/V1ListMigrationsResponse" } } } @@ -15894,9 +7235,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_read"] } ], "summary": "List applied migration versions", @@ -15908,10 +7246,10 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_read"]], "x-oauth-scope": "database:read" }, "post": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-apply-a-migration", "parameters": [ { @@ -15942,25 +7280,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string" - }, - "rollback": { - "type": "string" - } - }, - "required": ["query"], - "example": { - "query": "create table public.widgets(id bigint primary key);", - "name": "create_widgets_table", - "rollback": "drop table if exists public.widgets;" - } + "$ref": "#/components/schemas/V1CreateMigrationBody" } } } @@ -15985,9 +7305,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_write"] } ], "summary": "Apply a database migration", @@ -15999,10 +7316,10 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" }, "put": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-upsert-a-migration", "parameters": [ { @@ -16033,25 +7350,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string" - }, - "rollback": { - "type": "string" - } - }, - "required": ["query"], - "example": { - "query": "create table public.widgets(id bigint primary key);", - "name": "create_widgets_table", - "rollback": "drop table if exists public.widgets;" - } + "$ref": "#/components/schemas/V1UpsertMigrationBody" } } } @@ -16076,9 +7375,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_write"] } ], "summary": "Upsert a database migration without applying", @@ -16090,10 +7386,10 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" }, "delete": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-rollback-migrations", "parameters": [ { @@ -16141,9 +7437,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_write"] } ], "summary": "Rollback database migrations and remove them from history table", @@ -16155,12 +7448,12 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" } }, "/v1/projects/{ref}/database/migrations/{version}": { "get": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-get-a-migration", "parameters": [ { @@ -16193,35 +7486,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "version": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string" - }, - "statements": { - "type": "array", - "items": { - "type": "string" - } - }, - "rollback": { - "type": "array", - "items": { - "type": "string" - } - }, - "created_by": { - "type": "string" - }, - "idempotency_key": { - "type": "string" - } - }, - "required": ["version"] + "$ref": "#/components/schemas/V1GetMigrationResponse" } } } @@ -16242,9 +7507,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_read"] } ], "summary": "Fetch an existing entry from migration history", @@ -16256,10 +7518,10 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_read"]], "x-oauth-scope": "database:read" }, "patch": { - "description": "Only available to selected partner OAuth apps", "operationId": "v1-patch-a-migration", "parameters": [ { @@ -16291,19 +7553,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "rollback": { - "type": "string" - } - }, - "example": { - "name": "create_widgets_table", - "rollback": "drop table if exists public.widgets;" - } + "$ref": "#/components/schemas/V1PatchMigrationBody" } } } @@ -16328,9 +7578,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_migrations_write"] } ], "summary": "Patch an existing entry in migration history", @@ -16342,6 +7589,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_migrations_write"]], "x-oauth-scope": "database:write" } }, @@ -16368,25 +7616,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "minLength": 1 - }, - "parameters": { - "type": "array", - "items": {} - }, - "read_only": { - "type": "boolean" - } - }, - "required": ["query"], - "example": { - "query": "select * from pg_stat_activity limit 1;", - "read_only": true - } + "$ref": "#/components/schemas/V1RunQueryBody" } } } @@ -16411,12 +7641,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_write"] - }, - { - "fga_permissions": ["database_read"] } ], "summary": "[Beta] Run sql query", @@ -16428,6 +7652,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"], ["database_write"]], "x-oauth-scope": "database:write" } }, @@ -16455,21 +7680,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "query": { - "type": "string", - "minLength": 1 - }, - "parameters": { - "type": "array", - "items": {} - } - }, - "required": ["query"], - "example": { - "query": "select * from pg_stat_activity limit 1;" - } + "$ref": "#/components/schemas/V1ReadOnlyQueryBody" } } } @@ -16494,9 +7705,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_read"] } ], "summary": "[Beta] Run a sql query as supabase_read_only_user", @@ -16508,6 +7716,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -16549,9 +7758,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_webhooks_config_write"] } ], "summary": "[Beta] Enables Database Webhooks on the project", @@ -16563,6 +7769,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_webhooks_config_write"]], "x-oauth-scope": "database:write" } }, @@ -16592,36 +7799,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "databases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "schemas": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "required": ["name"], - "additionalProperties": true - } - } - }, - "required": ["name", "schemas"], - "additionalProperties": true - } - } - }, - "required": ["databases"] + "$ref": "#/components/schemas/GetProjectDbMetadataResponse" } } } @@ -16639,9 +7817,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_read"] } ], "summary": "Gets database metadata for the given project.", @@ -16653,6 +7828,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "projects:read" } }, @@ -16679,17 +7855,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "password": { - "type": "string", - "minLength": 4 - } - }, - "required": ["password"], - "example": { - "password": "correct-horse-battery-staple" - } + "$ref": "#/components/schemas/V1UpdatePasswordBody" } } } @@ -16700,13 +7866,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": ["message"] + "$ref": "#/components/schemas/V1UpdatePasswordResponse" } } } @@ -16727,9 +7887,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_config_write"] } ], "summary": "Updates the database password", @@ -16741,6 +7898,7 @@ } ], "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["database_config_write"]], "x-oauth-scope": "database:write" } }, @@ -16769,62 +7927,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["user_roles"] + "$ref": "#/components/schemas/JitAccessResponse" } } } @@ -16845,9 +7948,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_read"] } ], "summary": "Get user-id to role mappings for JIT access", @@ -16859,6 +7959,7 @@ } ], "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_read"]], "x-oauth-scope": "database:read" }, "post": { @@ -16884,22 +7985,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "rhost": { - "type": "string", - "minLength": 1 - } - }, - "required": ["role", "rhost"], - "example": { - "role": "postgres", - "rhost": "203.0.113.10" - } + "$ref": "#/components/schemas/AuthorizeJitAccessBody" } } } @@ -16910,59 +7996,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid" - }, - "user_role": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - }, - "required": ["user_id", "user_role"] + "$ref": "#/components/schemas/JitAuthorizeAccessResponse" } } } @@ -16983,9 +8017,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_read"] } ], "summary": "Authorize user-id to role mappings for JIT access", @@ -16997,6 +8028,7 @@ } ], "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -17022,80 +8054,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid", - "minLength": 1 - }, - "roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["user_id", "roles"], - "example": { - "user_id": "55555555-5555-4555-8555-555555555555", - "roles": [ - { - "role": "postgres", - "expires_at": 1740787200, - "allowed_networks": { - "allowed_cidrs": [ - { - "cidr": "203.0.113.0/24" - } - ] - }, - "branches_only": false - } - ] - } + "$ref": "#/components/schemas/UpdateJitAccessBody" } } } @@ -17106,62 +8065,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["user_roles"] + "$ref": "#/components/schemas/JitAccessResponse" } } } @@ -17182,14 +8086,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_write"] } ], "summary": "Updates a user mapping for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/list": { @@ -17217,164 +8119,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid" - }, - "primary_email": { - "type": "string", - "nullable": true - }, - "invite_id": { - "type": "null" - }, - "expires_at": { - "type": "null" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": [ - "user_id", - "primary_email", - "invite_id", - "expires_at", - "user_roles" - ] - }, - { - "type": "object", - "properties": { - "user_id": { - "type": "null" - }, - "primary_email": { - "type": "string" - }, - "invite_id": { - "type": "string", - "format": "uuid" - }, - "expires_at": { - "type": "string" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": [ - "user_id", - "primary_email", - "invite_id", - "expires_at", - "user_roles" - ] - } - ] - } - } - }, - "required": ["items"] + "$ref": "#/components/schemas/JitListAccessResponse" } } } @@ -17395,14 +8140,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_read"] } ], "summary": "List all user-id to role mappings for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/invite": { @@ -17429,80 +8172,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email", - "minLength": 1 - }, - "roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["email", "roles"], - "example": { - "email": "external-user@somedomain.xyz", - "roles": [ - { - "role": "postgres", - "expires_at": 1740787200, - "allowed_networks": { - "allowed_cidrs": [ - { - "cidr": "203.0.113.0/24" - } - ] - }, - "branches_only": false - } - ] - } + "$ref": "#/components/schemas/InviteExternalUserJitAccessBody" } } } @@ -17513,66 +8183,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "invite_id": { - "type": "string", - "format": "uuid" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["email", "invite_id", "user_roles"] + "$ref": "#/components/schemas/InviteExternalUserJitResponse" } } } @@ -17593,14 +8204,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_write"] } ], "summary": "Invites an external user to a database for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/invite/accept": { @@ -17627,23 +8236,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email", - "minLength": 1 - }, - "token": { - "type": "string", - "minLength": 1 - } - }, - "required": ["email", "token"], - "example": { - "email": "external-user@somedomain.xyz", - "token": "" - } + "$ref": "#/components/schemas/AcceptInviteExternalUserJitAccessBody" } } } @@ -17654,62 +8247,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "user_id": { - "type": "string", - "format": "uuid" - }, - "user_roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "role": { - "type": "string", - "minLength": 1 - }, - "expires_at": { - "type": "number" - }, - "allowed_networks": { - "type": "object", - "properties": { - "allowed_cidrs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - }, - "allowed_cidrs_v6": { - "type": "array", - "items": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - } - }, - "required": ["cidr"] - } - } - } - }, - "branches_only": { - "type": "boolean" - } - }, - "required": ["role"] - } - } - }, - "required": ["user_roles"] + "$ref": "#/components/schemas/JitAccessResponse" } } } @@ -17752,6 +8290,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "55555555-5555-4555-8555-555555555555", "type": "string" } @@ -17777,14 +8316,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_write"] } ], "summary": "Deletes the invite for an external user to a database for JIT access", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/jit/{user_id}": { @@ -17811,6 +8348,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "55555555-5555-4555-8555-555555555555", "type": "string" } @@ -17836,14 +8374,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_jit_write"] } ], "summary": "Delete JIT access by user-id", "tags": ["Database"], - "x-endpoint-owners": ["security"] + "x-endpoint-owners": ["security"], + "x-fga-permissions": [["database_jit_write"]] } }, "/v1/projects/{ref}/database/openapi": { @@ -17902,9 +8438,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_read"] } ], "summary": "Get PostgREST OpenAPI spec", @@ -17916,6 +8449,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -17946,57 +8480,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "status", - "version", - "created_at", - "updated_at" - ] + "$ref": "#/components/schemas/FunctionResponse" } } } @@ -18018,9 +8502,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_read"] } ], "summary": "List all functions", @@ -18032,6 +8513,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" }, "post": { @@ -18075,20 +8557,18 @@ "name": "verify_jwt", "required": false, "in": "query", - "description": "Boolean string, true or false", "schema": { "example": true, - "type": "boolean" + "type": "string" } }, { "name": "import_map", "required": false, "in": "query", - "description": "Boolean string, true or false", "schema": { "example": false, - "type": "boolean" + "type": "string" } }, { @@ -18130,29 +8610,7 @@ }, "application/json": { "schema": { - "type": "object", - "properties": { - "slug": { - "type": "string", - "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" - }, - "name": { - "type": "string" - }, - "body": { - "type": "string" - }, - "verify_jwt": { - "type": "boolean" - } - }, - "required": ["slug", "name", "body"], - "example": { - "slug": "hello-world", - "name": "Hello World", - "body": "Deno.serve(() => new Response('Hello, world!'))", - "verify_jwt": true - } + "$ref": "#/components/schemas/V1CreateFunctionBody" } } } @@ -18163,57 +8621,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "status", - "version", - "created_at", - "updated_at" - ] + "$ref": "#/components/schemas/FunctionResponse" } } } @@ -18237,9 +8645,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_write"] } ], "summary": "Create a function", @@ -18251,6 +8656,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" }, "put": { @@ -18276,60 +8682,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string", - "pattern": "^[A-Za-z][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"] - }, - "example": [ - { - "id": "3c078cce-ad70-4148-9f37-4da362789053", - "slug": "hello-world", - "name": "Hello World", - "status": "ACTIVE", - "version": 2, - "verify_jwt": true, - "entrypoint_path": "index.ts" - } - ] + "$ref": "#/components/schemas/BulkUpdateFunctionBody" } } } @@ -18340,66 +8693,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "functions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "status", - "version", - "created_at", - "updated_at" - ] - } - } - }, - "required": ["functions"] + "$ref": "#/components/schemas/BulkUpdateFunctionResponse" } } } @@ -18423,9 +8717,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_write"] } ], "summary": "Bulk update functions", @@ -18437,6 +8728,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -18472,10 +8764,9 @@ "name": "bundleOnly", "required": false, "in": "query", - "description": "Boolean string, true or false", "schema": { "example": false, - "type": "boolean" + "type": "string" } } ], @@ -18484,49 +8775,7 @@ "content": { "multipart/form-data": { "schema": { - "type": "object", - "properties": { - "file": { - "type": "array", - "items": { - "type": "string", - "format": "binary" - } - }, - "metadata": { - "type": "object", - "properties": { - "entrypoint_path": { - "type": "string" - }, - "import_map_path": { - "type": "string" - }, - "static_patterns": { - "type": "array", - "items": { - "type": "string" - } - }, - "verify_jwt": { - "type": "boolean" - }, - "name": { - "type": "string" - } - }, - "required": ["entrypoint_path"] - } - }, - "required": ["metadata"], - "example": { - "file": ["./supabase/functions/hello-world/index.ts"], - "metadata": { - "entrypoint_path": "index.ts", - "verify_jwt": true, - "name": "Hello World" - } - } + "$ref": "#/components/schemas/FunctionDeployBody" } } } @@ -18537,49 +8786,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": ["id", "slug", "name", "status", "version"] + "$ref": "#/components/schemas/DeployFunctionResponse" } } } @@ -18603,9 +8810,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_write"] } ], "summary": "Deploy a function", @@ -18617,6 +8821,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -18656,57 +8861,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "status", - "version", - "created_at", - "updated_at" - ] + "$ref": "#/components/schemas/FunctionSlugResponse" } } } @@ -18727,9 +8882,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_read"] } ], "summary": "Retrieve a function", @@ -18741,6 +8893,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" }, "patch": { @@ -18794,20 +8947,18 @@ "name": "verify_jwt", "required": false, "in": "query", - "description": "Boolean string, true or false", "schema": { "example": true, - "type": "boolean" + "type": "string" } }, { "name": "import_map", "required": false, "in": "query", - "description": "Boolean string, true or false", "schema": { "example": false, - "type": "boolean" + "type": "string" } }, { @@ -18849,23 +9000,7 @@ }, "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "body": { - "type": "string" - }, - "verify_jwt": { - "type": "boolean" - } - }, - "example": { - "name": "Hello World", - "body": "Deno.serve(() => new Response('Hello again!'))", - "verify_jwt": true - } + "$ref": "#/components/schemas/V1UpdateFunctionBody" } } } @@ -18876,57 +9011,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["ACTIVE", "REMOVED", "THROTTLED"] - }, - "version": { - "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" - }, - "ezbr_sha256": { - "type": "string" - } - }, - "required": [ - "id", - "slug", - "name", - "status", - "version", - "created_at", - "updated_at" - ] + "$ref": "#/components/schemas/FunctionResponse" } } } @@ -18947,9 +9032,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_write"] } ], "summary": "Update a function", @@ -18961,6 +9043,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" }, "delete": { @@ -19012,9 +9095,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_write"] } ], "summary": "Delete a function", @@ -19026,6 +9106,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_write"]], "x-oauth-scope": "edge_functions:write" } }, @@ -19065,8 +9146,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": {} + "$ref": "#/components/schemas/StreamableFile" } } } @@ -19087,9 +9167,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["edge_functions_read"] } ], "summary": "Retrieve a function body", @@ -19101,6 +9178,7 @@ } ], "x-endpoint-owners": ["functions"], + "x-fga-permissions": [["edge_functions_read"]], "x-oauth-scope": "edge_functions:read" } }, @@ -19130,28 +9208,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "owner": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "public": { - "type": "boolean" - } - }, - "required": ["id", "name", "owner", "created_at", "updated_at", "public"] + "$ref": "#/components/schemas/V1StorageBucketResponse" } } } @@ -19173,9 +9230,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["storage_read"] } ], "summary": "Lists all buckets", @@ -19187,6 +9241,7 @@ } ], "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_read"]], "x-oauth-scope": "storage:read" } }, @@ -19214,62 +9269,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "attributes": { - "oneOf": [ - { - "type": "object", - "properties": { - "iops": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "size_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "throughput_mibps": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "type": { - "type": "string", - "enum": ["gp3"] - } - }, - "required": ["iops", "size_gb", "type"] - }, - { - "type": "object", - "properties": { - "iops": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "size_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "type": { - "type": "string", - "enum": ["io2"] - } - }, - "required": ["iops", "size_gb", "type"] - } - ] - }, - "last_modified_at": { - "type": "string" - } - }, - "required": ["attributes"] + "$ref": "#/components/schemas/DiskResponse" } } } @@ -19290,14 +9290,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_disk_config_read"] } ], "summary": "Get database disk attributes", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] }, "post": { "operationId": "v1-modify-database-disk", @@ -19321,70 +9319,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "attributes": { - "discriminator": { - "propertyName": "type" - }, - "oneOf": [ - { - "type": "object", - "properties": { - "iops": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "size_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "throughput_mibps": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "type": { - "type": "string", - "enum": ["gp3"] - } - }, - "required": ["iops", "size_gb", "type"] - }, - { - "type": "object", - "properties": { - "iops": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "size_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "type": { - "type": "string", - "enum": ["io2"] - } - }, - "required": ["iops", "size_gb", "type"] - } - ] - } - }, - "required": ["attributes"], - "example": { - "attributes": { - "type": "gp3", - "size_gb": 100, - "iops": 3000, - "throughput_mibps": 125 - } - } + "$ref": "#/components/schemas/DiskRequestBody" } } } @@ -19409,14 +9344,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_disk_config_write"] } ], "summary": "Modify database disk", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_write"]] } }, "/v1/projects/{ref}/config/disk/util": { @@ -19443,28 +9376,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "timestamp": { - "type": "string" - }, - "metrics": { - "type": "object", - "properties": { - "fs_size_bytes": { - "type": "number" - }, - "fs_avail_bytes": { - "type": "number" - }, - "fs_used_bytes": { - "type": "number" - } - }, - "required": ["fs_size_bytes", "fs_avail_bytes", "fs_used_bytes"] - } - }, - "required": ["timestamp", "metrics"] + "$ref": "#/components/schemas/DiskUtilMetricsResponse" } } } @@ -19485,14 +9397,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_disk_config_read"] } ], "summary": "Get disk utilization", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] } }, "/v1/projects/{ref}/config/disk/autoscale": { @@ -19519,31 +9429,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "growth_percent": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Growth percentage for disk autoscaling" - }, - "min_increment_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Minimum increment size for disk autoscaling in GB" - }, - "max_size_gb": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Maximum limit the disk size will grow to in GB" - } - }, - "required": ["growth_percent", "min_increment_gb", "max_size_gb"] + "$ref": "#/components/schemas/DiskAutoscaleConfig" } } } @@ -19564,14 +9450,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["infra_disk_config_read"] } ], "summary": "Gets project disk autoscale config", "tags": ["Projects"], - "x-endpoint-owners": ["management-api", "infra"] + "x-endpoint-owners": ["management-api", "infra"], + "x-fga-permissions": [["infra_disk_config_read"]] } }, "/v1/projects/{ref}/config/storage": { @@ -19598,126 +9482,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "fileSizeLimit": { - "type": "integer", - "format": "int64" - }, - "features": { - "type": "object", - "properties": { - "imageTransformation": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "s3Protocol": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "purgeCache": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "icebergCatalog": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "maxNamespaces": { - "type": "integer", - "minimum": 0 - }, - "maxTables": { - "type": "integer", - "minimum": 0 - }, - "maxCatalogs": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] - }, - "vectorBuckets": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "maxBuckets": { - "type": "integer", - "minimum": 0 - }, - "maxIndexes": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["enabled", "maxBuckets", "maxIndexes"] - } - }, - "required": [ - "imageTransformation", - "s3Protocol", - "purgeCache", - "icebergCatalog", - "vectorBuckets" - ] - }, - "capabilities": { - "type": "object", - "properties": { - "list_v2": { - "type": "boolean" - }, - "iceberg_catalog": { - "type": "boolean" - } - }, - "required": ["list_v2", "iceberg_catalog"] - }, - "external": { - "type": "object", - "properties": { - "upstreamTarget": { - "type": "string", - "enum": ["main", "canary"] - } - }, - "required": ["upstreamTarget"] - }, - "migrationVersion": { - "type": "string" - }, - "databasePoolMode": { - "type": "string" - } - }, - "required": [ - "fileSizeLimit", - "features", - "capabilities", - "external", - "migrationVersion", - "databasePoolMode" - ] + "$ref": "#/components/schemas/StorageConfigResponse" } } } @@ -19738,14 +9503,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["storage_config_read"] } ], "summary": "Gets project's storage config", "tags": ["Storage"], - "x-endpoint-owners": ["storage"] + "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_config_read"]] }, "patch": { "operationId": "v1-update-storage-config", @@ -19769,104 +9532,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "fileSizeLimit": { - "type": "integer", - "minimum": 0, - "maximum": 536870912000, - "format": "int64" - }, - "features": { - "type": "object", - "properties": { - "imageTransformation": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "s3Protocol": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "purgeCache": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - "icebergCatalog": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "maxNamespaces": { - "type": "integer", - "minimum": 0 - }, - "maxTables": { - "type": "integer", - "minimum": 0 - }, - "maxCatalogs": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] - }, - "vectorBuckets": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "maxBuckets": { - "type": "integer", - "minimum": 0 - }, - "maxIndexes": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["enabled", "maxBuckets", "maxIndexes"] - } - } - }, - "external": { - "type": "object", - "properties": { - "upstreamTarget": { - "type": "string", - "enum": ["main", "canary"] - } - }, - "required": ["upstreamTarget"] - } - }, - "additionalProperties": false, - "example": { - "fileSizeLimit": 10485760, - "features": { - "imageTransformation": { - "enabled": true - } - } - } + "$ref": "#/components/schemas/UpdateStorageConfigBody" } } } @@ -19891,14 +9557,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["storage_config_write"] } ], "summary": "Updates project's storage config", "tags": ["Storage"], - "x-endpoint-owners": ["storage"] + "x-endpoint-owners": ["storage"], + "x-fga-permissions": [["storage_config_write"]] } }, "/v1/projects/{ref}/config/database/pgbouncer": { @@ -19925,37 +9589,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "default_pool_size": { - "type": "integer" - }, - "ignore_startup_parameters": { - "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" - } - } + "$ref": "#/components/schemas/V1PgbouncerConfigResponse" } } } @@ -19973,11 +9607,6 @@ "description": "Failed to retrieve project's pgbouncer config" } }, - "security": [ - { - "fga_permissions": ["database_read"] - } - ], "summary": "Get project's pgbouncer config", "tags": ["Database"], "x-badges": [ @@ -19987,6 +9616,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_read"]], "x-oauth-scope": "database:read" } }, @@ -20016,64 +9646,7 @@ "schema": { "type": "array", "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", - "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": [ - "identifier", - "database_type", - "is_using_scram_auth", - "db_user", - "db_host", - "db_port", - "db_name", - "connection_string", - "connectionString", - "default_pool_size", - "max_client_conn", - "pool_mode" - ] + "$ref": "#/components/schemas/SupavisorConfigResponse" } } } @@ -20095,9 +9668,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_pooling_config_read"] } ], "summary": "Gets project's supavisor config", @@ -20109,6 +9679,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_pooling_config_read"]], "x-oauth-scope": "database:read" }, "patch": { @@ -20133,24 +9704,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "default_pool_size": { - "type": "integer", - "minimum": 0, - "maximum": 3000, - "nullable": true - }, - "pool_mode": { - "type": "string", - "enum": ["transaction", "session"], - "description": "Dedicated pooler mode for the project" - } - }, - "example": { - "default_pool_size": 25, - "pool_mode": "transaction" - } + "$ref": "#/components/schemas/UpdateSupavisorConfigBody" } } } @@ -20161,17 +9715,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "default_pool_size": { - "type": "integer", - "nullable": true - }, - "pool_mode": { - "type": "string" - } - }, - "required": ["default_pool_size", "pool_mode"] + "$ref": "#/components/schemas/UpdateSupavisorConfigResponse" } } } @@ -20192,9 +9736,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_pooling_config_write"] } ], "summary": "Updates project's supavisor config", @@ -20206,6 +9747,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["database_pooling_config_write"]], "x-oauth-scope": "database:write" } }, @@ -20233,140 +9775,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "effective_cache_size": { - "type": "string" - }, - "logical_decoding_work_mem": { - "type": "string" - }, - "cron.log_statement": { - "type": "boolean" - }, - "log_autovacuum_min_duration": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_checkpoints": { - "type": "boolean" - }, - "log_connections": { - "type": "boolean" - }, - "log_disconnections": { - "type": "boolean" - }, - "log_duration": { - "type": "boolean" - }, - "log_lock_waits": { - "type": "boolean" - }, - "log_recovery_conflict_waits": { - "type": "boolean" - }, - "log_replication_commands": { - "type": "boolean" - }, - "log_startup_progress_interval": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_temp_files": { - "type": "string" - }, - "maintenance_work_mem": { - "type": "string" - }, - "track_activity_query_size": { - "type": "string" - }, - "max_connections": { - "type": "integer", - "minimum": 1, - "maximum": 262143 - }, - "max_locks_per_transaction": { - "type": "integer", - "minimum": 10, - "maximum": 2147483640 - }, - "max_parallel_maintenance_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers_per_gather": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_replication_slots": { - "type": "integer" - }, - "max_slot_wal_keep_size": { - "type": "string" - }, - "max_standby_archive_delay": { - "type": "string" - }, - "max_standby_streaming_delay": { - "type": "string" - }, - "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", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "track_commit_timestamp": { - "type": "boolean" - }, - "wal_keep_size": { - "type": "string" - }, - "wal_sender_timeout": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "work_mem": { - "type": "string" - }, - "checkpoint_timeout": { - "type": "string", - "description": "Default unit: s", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "hot_standby_feedback": { - "type": "boolean" - } - } + "$ref": "#/components/schemas/PostgresConfigResponse" } } } @@ -20387,9 +9796,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_config_read"] } ], "summary": "Gets project's Postgres config", @@ -20401,6 +9807,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_config_read"]], "x-oauth-scope": "database:read" }, "put": { @@ -20425,150 +9832,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "effective_cache_size": { - "type": "string" - }, - "logical_decoding_work_mem": { - "type": "string" - }, - "cron.log_statement": { - "type": "boolean" - }, - "log_autovacuum_min_duration": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_checkpoints": { - "type": "boolean" - }, - "log_connections": { - "type": "boolean" - }, - "log_disconnections": { - "type": "boolean" - }, - "log_duration": { - "type": "boolean" - }, - "log_lock_waits": { - "type": "boolean" - }, - "log_recovery_conflict_waits": { - "type": "boolean" - }, - "log_replication_commands": { - "type": "boolean" - }, - "log_startup_progress_interval": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_temp_files": { - "type": "string" - }, - "maintenance_work_mem": { - "type": "string" - }, - "track_activity_query_size": { - "type": "string" - }, - "max_connections": { - "type": "integer", - "minimum": 1, - "maximum": 262143 - }, - "max_locks_per_transaction": { - "type": "integer", - "minimum": 10, - "maximum": 2147483640 - }, - "max_parallel_maintenance_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers_per_gather": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_replication_slots": { - "type": "integer" - }, - "max_slot_wal_keep_size": { - "type": "string" - }, - "max_standby_archive_delay": { - "type": "string" - }, - "max_standby_streaming_delay": { - "type": "string" - }, - "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", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "track_commit_timestamp": { - "type": "boolean" - }, - "wal_keep_size": { - "type": "string" - }, - "wal_sender_timeout": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "work_mem": { - "type": "string" - }, - "checkpoint_timeout": { - "type": "string", - "description": "Default unit: s", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "hot_standby_feedback": { - "type": "boolean" - }, - "restart_database": { - "type": "boolean" - } - }, - "additionalProperties": false, - "example": { - "max_connections": 120, - "shared_buffers": "256MB", - "work_mem": "4MB", - "statement_timeout": "60000ms" - } + "$ref": "#/components/schemas/UpdatePostgresConfigBody" } } } @@ -20579,140 +9843,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "effective_cache_size": { - "type": "string" - }, - "logical_decoding_work_mem": { - "type": "string" - }, - "cron.log_statement": { - "type": "boolean" - }, - "log_autovacuum_min_duration": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_checkpoints": { - "type": "boolean" - }, - "log_connections": { - "type": "boolean" - }, - "log_disconnections": { - "type": "boolean" - }, - "log_duration": { - "type": "boolean" - }, - "log_lock_waits": { - "type": "boolean" - }, - "log_recovery_conflict_waits": { - "type": "boolean" - }, - "log_replication_commands": { - "type": "boolean" - }, - "log_startup_progress_interval": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "log_temp_files": { - "type": "string" - }, - "maintenance_work_mem": { - "type": "string" - }, - "track_activity_query_size": { - "type": "string" - }, - "max_connections": { - "type": "integer", - "minimum": 1, - "maximum": 262143 - }, - "max_locks_per_transaction": { - "type": "integer", - "minimum": 10, - "maximum": 2147483640 - }, - "max_parallel_maintenance_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_parallel_workers_per_gather": { - "type": "integer", - "minimum": 0, - "maximum": 1024 - }, - "max_replication_slots": { - "type": "integer" - }, - "max_slot_wal_keep_size": { - "type": "string" - }, - "max_standby_archive_delay": { - "type": "string" - }, - "max_standby_streaming_delay": { - "type": "string" - }, - "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", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "track_commit_timestamp": { - "type": "boolean" - }, - "wal_keep_size": { - "type": "string" - }, - "wal_sender_timeout": { - "type": "string", - "description": "Default unit: ms", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "work_mem": { - "type": "string" - }, - "checkpoint_timeout": { - "type": "string", - "description": "Default unit: s", - "pattern": "^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$" - }, - "hot_standby_feedback": { - "type": "boolean" - } - } + "$ref": "#/components/schemas/PostgresConfigResponse" } } } @@ -20733,9 +9864,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["database_config_write"] } ], "summary": "Updates project's Postgres config", @@ -20747,6 +9875,7 @@ } ], "x-endpoint-owners": ["infra", "management-api"], + "x-fga-permissions": [["database_config_write"]], "x-oauth-scope": "database:write" } }, @@ -20774,92 +9903,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "private_only": { - "type": "boolean", - "nullable": true, - "description": "Whether to only allow private channels" - }, - "connection_pool": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "nullable": true, - "description": "Sets connection pool size for Realtime Authorization" - }, - "max_concurrent_users": { - "type": "integer", - "minimum": 1, - "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of concurrent users rate limit" - }, - "max_events_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of events per second rate per channel limit" - }, - "max_bytes_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 10000000, - "nullable": true, - "description": "Sets maximum number of bytes per second rate per channel limit" - }, - "max_channels_per_client": { - "type": "integer", - "minimum": 1, - "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of channels per client rate limit" - }, - "max_joins_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of joins per second rate limit" - }, - "max_presence_events_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of presence events per second rate limit" - }, - "max_payload_size_in_kb": { - "type": "integer", - "minimum": 1, - "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of payload size in KB rate limit" - }, - "suspend": { - "type": "boolean", - "nullable": true, - "description": "Disables the Realtime service for this project when true. Set to false to re-enable it." - }, - "presence_enabled": { - "type": "boolean", - "description": "Whether to enable presence" - } - }, - "required": [ - "private_only", - "connection_pool", - "max_concurrent_users", - "max_events_per_second", - "max_bytes_per_second", - "max_channels_per_client", - "max_joins_per_second", - "max_presence_events_per_second", - "max_payload_size_in_kb", - "suspend", - "presence_enabled" - ] + "$ref": "#/components/schemas/RealtimeConfigResponse" } } } @@ -20877,14 +9921,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["realtime_config_read"] } ], "summary": "Gets realtime configuration", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_read"]] }, "patch": { "operationId": "v1-update-realtime-config", @@ -20908,75 +9950,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "private_only": { - "type": "boolean", - "description": "Whether to only allow private channels" - }, - "connection_pool": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "description": "Sets connection pool size for Realtime Authorization" - }, - "max_concurrent_users": { - "type": "integer", - "minimum": 1, - "maximum": 50000, - "description": "Sets maximum number of concurrent users rate limit" - }, - "max_events_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 50000, - "description": "Sets maximum number of events per second rate per channel limit" - }, - "max_bytes_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 10000000, - "description": "Sets maximum number of bytes per second rate per channel limit" - }, - "max_channels_per_client": { - "type": "integer", - "minimum": 1, - "maximum": 10000, - "description": "Sets maximum number of channels per client rate limit" - }, - "max_joins_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 5000, - "description": "Sets maximum number of joins per second rate limit" - }, - "max_presence_events_per_second": { - "type": "integer", - "minimum": 1, - "maximum": 5000, - "description": "Sets maximum number of presence events per second rate limit" - }, - "max_payload_size_in_kb": { - "type": "integer", - "minimum": 1, - "maximum": 10000, - "description": "Sets maximum number of payload size in KB rate limit" - }, - "suspend": { - "type": "boolean", - "description": "Disables the Realtime service for this project when true. Set to false to re-enable it." - }, - "presence_enabled": { - "type": "boolean", - "description": "Whether to enable presence" - } - }, - "additionalProperties": false, - "example": { - "private_only": false, - "max_concurrent_users": 1000, - "max_channels_per_client": 100 - } + "$ref": "#/components/schemas/UpdateRealtimeConfigBody" } } } @@ -20998,14 +9972,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["realtime_config_write"] } ], "summary": "Updates realtime configuration", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_write"]] } }, "/v1/projects/{ref}/config/realtime/shutdown": { @@ -21046,14 +10018,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["realtime_config_write"] } ], "summary": "Shutdowns realtime connections for a project", "tags": ["Realtime"], - "x-endpoint-owners": ["realtime"] + "x-endpoint-owners": ["realtime"], + "x-fga-permissions": [["realtime_config_write"]] } }, "/v1/projects/{ref}/config/auth/sso/providers": { @@ -21079,97 +10049,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["saml"], - "description": "What type of provider will be created" - }, - "metadata_xml": { - "type": "string" - }, - "metadata_url": { - "type": "string" - }, - "domains": { - "type": "array", - "items": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "required": ["type"], - "example": { - "type": "saml", - "metadata_url": "https://sso.acme.com/metadata.xml", - "domains": ["acme.com"], - "attribute_mapping": { - "keys": { - "email": { - "name": "email" - }, - "first_name": { - "name": "first_name" - }, - "last_name": { - "name": "last_name" - } - } - } - } + "$ref": "#/components/schemas/CreateProviderBody" } } } @@ -21180,110 +10060,7 @@ "content": { "application/json": { "schema": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "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"] + "$ref": "#/components/schemas/CreateProviderResponse" } } } @@ -21304,9 +10081,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write"] } ], "summary": "Creates a new SSO provider", @@ -21318,6 +10092,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "get": { @@ -21343,119 +10118,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "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"] + "$ref": "#/components/schemas/ListProvidersResponse" } } } @@ -21476,9 +10139,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_read"] } ], "summary": "Lists all SSO providers", @@ -21490,6 +10150,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" } }, @@ -21516,6 +10177,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -21527,110 +10189,7 @@ "content": { "application/json": { "schema": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "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"] + "$ref": "#/components/schemas/GetProviderResponse" } } } @@ -21651,9 +10210,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_read"] } ], "summary": "Gets a SSO provider by its UUID", @@ -21665,6 +10221,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_read"]], "x-oauth-scope": "auth:read" }, "put": { @@ -21689,6 +10246,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -21699,77 +10257,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "metadata_xml": { - "type": "string" - }, - "metadata_url": { - "type": "string" - }, - "domains": { - "type": "array", - "items": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "example": { - "metadata_url": "https://sso.acme.com/metadata.xml", - "domains": ["acme.com", "contractors.acme.com"] - } + "$ref": "#/components/schemas/UpdateProviderBody" } } } @@ -21780,110 +10268,7 @@ "content": { "application/json": { "schema": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "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"] + "$ref": "#/components/schemas/UpdateProviderResponse" } } } @@ -21904,9 +10289,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write"] } ], "summary": "Updates a SSO provider by its UUID", @@ -21918,6 +10300,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" }, "delete": { @@ -21942,6 +10325,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "example": "77777777-7777-4777-8777-777777777777", "type": "string" } @@ -21953,110 +10337,7 @@ "content": { "application/json": { "schema": { - "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"] - }, - "name_id_format": { - "type": "string", - "enum": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" - ] - } - }, - "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"] + "$ref": "#/components/schemas/DeleteProviderResponse" } } } @@ -22077,9 +10358,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["auth_config_write"] } ], "summary": "Removes a SSO provider by its UUID", @@ -22091,6 +10369,7 @@ } ], "x-endpoint-owners": ["auth"], + "x-fga-permissions": [["auth_config_write"]], "x-oauth-scope": "auth:write" } }, @@ -22118,65 +10397,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "region": { - "type": "string" - }, - "walg_enabled": { - "type": "boolean" - }, - "pitr_enabled": { - "type": "boolean" - }, - "backups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "is_physical_backup": { - "type": "boolean" - }, - "status": { - "type": "string", - "enum": [ - "COMPLETED", - "FAILED", - "PENDING", - "REMOVED", - "ARCHIVED", - "CANCELLED" - ] - }, - "inserted_at": { - "type": "string" - } - }, - "required": ["id", "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" - ] + "$ref": "#/components/schemas/V1BackupsResponse" } } } @@ -22197,9 +10418,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_read"] } ], "summary": "Lists all backups", @@ -22211,6 +10429,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-oauth-scope": "database:read" } }, @@ -22237,18 +10456,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "recovery_time_target_unix": { - "type": "integer", - "minimum": 0, - "format": "int64" - } - }, - "required": ["recovery_time_target_unix"], - "example": { - "recovery_time_target_unix": 1740787200 - } + "$ref": "#/components/schemas/V1RestorePitrBody" } } } @@ -22270,9 +10478,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_write"] } ], "summary": "Restores a PITR backup for a database", @@ -22284,6 +10489,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-oauth-scope": "database:write" } }, @@ -22310,17 +10516,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 20 - } - }, - "required": ["name"], - "example": { - "name": "before-upgrade" - } + "$ref": "#/components/schemas/V1RestorePointPostBody" } } } @@ -22331,22 +10527,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["AVAILABLE", "PENDING", "REMOVED", "FAILED"] - }, - "completed_on": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name", "status", "completed_on"] + "$ref": "#/components/schemas/V1RestorePointResponse" } } } @@ -22364,9 +10545,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_write"] } ], "summary": "Initiates a creation of a restore point for a database", @@ -22378,6 +10556,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" }, @@ -22413,22 +10592,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["AVAILABLE", "PENDING", "REMOVED", "FAILED"] - }, - "completed_on": { - "type": "string", - "format": "date-time", - "nullable": true - } - }, - "required": ["name", "status", "completed_on"] + "$ref": "#/components/schemas/V1RestorePointResponse" } } } @@ -22449,9 +10613,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_read"] } ], "summary": "Get restore points for project", @@ -22463,6 +10624,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-internal": true, "x-oauth-scope": "database:read" } @@ -22490,16 +10652,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "integer" - } - }, - "required": ["id"], - "example": { - "id": 12345 - } + "$ref": "#/components/schemas/V1RestoreBackupBody" } } } @@ -22521,9 +10674,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_write"] } ], "summary": "Restores a physical backup for a database", @@ -22535,6 +10685,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" } @@ -22563,21 +10714,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "schedule_for": { - "type": "string", - "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", - "example": "04:00:00" - }, - "updated_at": { - "type": "string", - "format": "date-time", - "description": "Timestamp of when the backup schedule was last updated.", - "example": "2026-05-04T14:40:44+00:00" - } - }, - "required": ["schedule_for", "updated_at"] + "$ref": "#/components/schemas/V1BackupScheduleResponse" } } } @@ -22586,7 +10723,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Enterprise organization plan." + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "403": { "description": "Forbidden action" @@ -22604,9 +10748,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_read"] } ], "summary": "Gets the backup schedule for a project", @@ -22623,6 +10764,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_read"]], "x-oauth-scope": "database:read" }, "patch": { @@ -22648,18 +10790,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "schedule_for": { - "type": "string", - "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", - "example": "04:00:00" - } - }, - "required": ["schedule_for"], - "example": { - "schedule_for": "04:00:00" - } + "$ref": "#/components/schemas/V1UpdateBackupScheduleBody" } } } @@ -22670,21 +10801,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "schedule_for": { - "type": "string", - "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", - "example": "04:00:00" - }, - "updated_at": { - "type": "string", - "format": "date-time", - "description": "Timestamp of when the backup schedule was last updated.", - "example": "2026-05-04T14:40:44+00:00" - } - }, - "required": ["schedule_for", "updated_at"] + "$ref": "#/components/schemas/V1BackupScheduleResponse" } } } @@ -22696,7 +10813,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Enterprise organization plan." + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBody" + } + } + } }, "403": { "description": "Forbidden action" @@ -22714,9 +10838,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_write"] } ], "summary": "Updates the backup schedule time for a project", @@ -22733,6 +10854,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-oauth-scope": "database:write" } }, @@ -22759,17 +10881,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 20 - } - }, - "required": ["name"], - "example": { - "name": "before-upgrade" - } + "$ref": "#/components/schemas/V1UndoBody" } } } @@ -22791,9 +10903,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["backups_write"] } ], "summary": "Initiates an undo to a given restore point", @@ -22805,6 +10914,7 @@ } ], "x-endpoint-owners": ["infra"], + "x-fga-permissions": [["backups_write"]], "x-internal": true, "x-oauth-scope": "database:write" } @@ -22832,150 +10942,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "entitlements": { - "type": "array", - "items": { - "type": "object", - "properties": { - "feature": { - "type": "object", - "properties": { - "key": { - "type": "string", - "enum": [ - "instances.compute_update_available_sizes", - "instances.read_replicas", - "instances.disk_modifications", - "instances.high_availability", - "instances.orioledb", - "replication.etl", - "storage.max_file_size", - "storage.max_file_size.configurable", - "storage.image_transformations", - "storage.vector_buckets", - "storage.iceberg_catalog", - "storage.purge_cache", - "security.audit_logs_days", - "security.questionnaire", - "security.soc2_report", - "security.iso27001_certificate", - "security.private_link", - "security.enforce_mfa", - "log.retention_days", - "custom_domain", - "vanity_subdomain", - "ipv4", - "pitr.available_variants", - "log_drains", - "audit_log_drains", - "branching_limit", - "branching_persistent", - "auth.mfa_phone", - "auth.mfa_web_authn", - "auth.mfa_enhanced_security", - "auth.hooks", - "auth.platform.sso", - "auth.custom_jwt_template", - "auth.saml_2", - "auth.user_sessions", - "auth.leaked_password_protection", - "auth.advanced_auth_settings", - "auth.performance_settings", - "auth.password_hibp", - "auth.custom_oauth.max_providers", - "backup.retention_days", - "backup.restore_to_new_project", - "backup.schedule", - "function.max_count", - "function.size_limit_mb", - "realtime.max_concurrent_users", - "realtime.max_events_per_second", - "realtime.max_joins_per_second", - "realtime.max_channels_per_client", - "realtime.max_bytes_per_second", - "realtime.max_presence_events_per_second", - "realtime.max_payload_size_in_kb", - "project_scoped_roles", - "security.member_roles", - "project_pausing", - "project_cloning", - "project_restore_after_expiry", - "assistant.advance_model", - "integrations.github_connections", - "dedicated_pooler", - "observability.dashboard_advanced_metrics", - "api.members.invitations", - "api.members.roles" - ] - }, - "type": { - "type": "string", - "enum": ["boolean", "numeric", "set"] - } - }, - "required": ["key", "type"] - }, - "hasAccess": { - "type": "boolean" - }, - "type": { - "type": "string", - "enum": ["boolean", "numeric", "set"] - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": ["enabled"] - }, - { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "value": { - "type": "number" - }, - "unlimited": { - "type": "boolean" - }, - "unit": { - "type": "string" - } - }, - "required": ["enabled", "value", "unlimited", "unit"] - }, - { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "set": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["enabled", "set"] - } - ] - } - }, - "required": ["feature", "hasAccess", "type", "config"] - } - } - }, - "required": ["entitlements"] + "$ref": "#/components/schemas/V1ListEntitlementsResponse" } } } @@ -22993,9 +10960,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_read"] } ], "summary": "Get entitlements for an organization", @@ -23007,6 +10971,7 @@ } ], "x-endpoint-owners": ["billing"], + "x-fga-permissions": [["organization_admin_read"]], "x-oauth-scope": "organizations:read" } }, @@ -23034,29 +10999,7 @@ "schema": { "type": "array", "items": { - "type": "object", - "properties": { - "user_id": { - "type": "string" - }, - "user_name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "role_name": { - "type": "string" - }, - "mfa_enabled": { - "type": "boolean" - }, - "avatar_url": { - "type": "string", - "nullable": true - } - }, - "required": ["user_id", "user_name", "role_name", "mfa_enabled", "avatar_url"] + "$ref": "#/components/schemas/V1OrganizationMemberResponse" } } } @@ -23066,9 +11009,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["members_read"] } ], "summary": "List members of an organization", @@ -23080,6 +11020,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -23105,38 +11046,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "plan": { - "type": "string", - "enum": ["free", "pro", "team", "enterprise", "platform"] - }, - "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"] + "$ref": "#/components/schemas/V1OrganizationSlugResponse" } } } @@ -23154,9 +11064,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_read"] } ], "summary": "Gets information about the organization", @@ -23168,6 +11075,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_read"]], "x-oauth-scope": "organizations:read" } }, @@ -23202,118 +11110,7 @@ "content": { "application/json": { "schema": { - "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"] - } - }, - "source_subscription_plan": { - "type": "string", - "enum": ["free", "pro", "team", "enterprise", "platform"] - }, - "target_subscription_plan": { - "type": "string", - "enum": ["free", "pro", "team", "enterprise", "platform"], - "nullable": true - } - }, - "required": [ - "valid", - "warnings", - "errors", - "info", - "members_exceeding_free_project_limit", - "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"] + "$ref": "#/components/schemas/OrganizationProjectClaimResponse" } } } @@ -23331,14 +11128,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write"] } ], "summary": "Gets project details for the specified organization and claim token", "tags": ["Organizations"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]], "x-internal": true }, "post": { @@ -23382,14 +11177,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write"] } ], "summary": "Claims project for the specified organization", "tags": ["Organizations"], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]], "x-internal": true } }, @@ -23416,6 +11209,7 @@ "description": "Number of projects to skip", "schema": { "minimum": 0, + "maximum": 9007199254740991, "default": 0, "example": 0, "type": "integer" @@ -23473,167 +11267,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "projects": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ref": { - "type": "string" - }, - "name": { - "type": "string" - }, - "cloud_provider": { - "type": "string" - }, - "region": { - "type": "string" - }, - "is_branch": { - "type": "boolean" - }, - "status": { - "type": "string", - "enum": [ - "INACTIVE", - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "UNKNOWN", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UPGRADING", - "PAUSING", - "RESTORE_FAILED", - "RESTARTING", - "PAUSE_FAILED", - "RESIZING" - ] - }, - "inserted_at": { - "type": "string" - }, - "databases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "infra_compute_size": { - "type": "string", - "enum": [ - "pico", - "nano", - "micro", - "small", - "medium", - "large", - "xlarge", - "2xlarge", - "4xlarge", - "8xlarge", - "12xlarge", - "16xlarge", - "24xlarge", - "24xlarge_optimized_memory", - "24xlarge_optimized_cpu", - "24xlarge_high_memory", - "48xlarge", - "48xlarge_optimized_memory", - "48xlarge_optimized_cpu", - "48xlarge_high_memory" - ] - }, - "region": { - "type": "string" - }, - "status": { - "type": "string", - "enum": [ - "ACTIVE_HEALTHY", - "ACTIVE_UNHEALTHY", - "COMING_UP", - "GOING_DOWN", - "INIT_FAILED", - "REMOVED", - "RESTORING", - "UNKNOWN", - "INIT_READ_REPLICA", - "INIT_READ_REPLICA_FAILED", - "RESTARTING", - "RESIZING" - ] - }, - "cloud_provider": { - "type": "string" - }, - "identifier": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["PRIMARY", "READ_REPLICA"] - }, - "disk_volume_size_gb": { - "type": "number" - }, - "disk_type": { - "type": "string", - "enum": ["gp3", "io2"] - }, - "disk_throughput_mbps": { - "type": "number" - }, - "disk_last_modified_at": { - "type": "string" - } - }, - "required": [ - "region", - "status", - "cloud_provider", - "identifier", - "type" - ] - } - } - }, - "required": [ - "ref", - "name", - "cloud_provider", - "region", - "is_branch", - "status", - "inserted_at", - "databases" - ] - } - }, - "pagination": { - "type": "object", - "properties": { - "count": { - "type": "number", - "description": "Total number of projects. Use this to calculate the total number of pages." - }, - "limit": { - "type": "number", - "description": "Maximum number of projects per page" - }, - "offset": { - "type": "number", - "description": "Number of projects skipped in this response" - } - }, - "required": ["count", "limit", "offset"] - } - }, - "required": ["projects", "pagination"] + "$ref": "#/components/schemas/OrganizationProjectsResponse" } } } @@ -23654,9 +11288,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_projects_read"] } ], "summary": "Gets all projects for the given organization", @@ -23668,6 +11299,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_projects_read"]], "x-oauth-scope": "projects:read" } } @@ -23721,8 +11353,9 @@ }, "db_port": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "db_user": { "type": "string" @@ -23754,9 +11387,9 @@ "type": "string" }, "reset_on_push": { - "type": "boolean", "description": "This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead.", - "deprecated": true + "deprecated": true, + "type": "boolean" }, "persistent": { "type": "boolean" @@ -23794,7 +11427,8 @@ "properties": { "id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "name": { "type": "string" @@ -23813,12 +11447,14 @@ }, "pr_number": { "type": "integer", - "format": "int32" + "format": "int32", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "latest_check_run_id": { - "type": "number", "description": "This field is deprecated and will not be populated.", - "deprecated": true + "deprecated": true, + "type": "number" }, "persistent": { "type": "boolean" @@ -23838,15 +11474,18 @@ }, "created_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updated_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "review_requested_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "with_data": { "type": "boolean" @@ -23857,7 +11496,8 @@ }, "deletion_scheduled_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "preview_project_status": { "type": "string", @@ -24044,9 +11684,9 @@ "description": "Name of your project" }, "organization_id": { - "type": "string", + "deprecated": true, "description": "Deprecated: Use `organization_slug` instead.", - "deprecated": true + "type": "string" }, "organization_slug": { "type": "string", @@ -24055,13 +11695,12 @@ "example": "tsrqponmlkjihgfedcba" }, "plan": { - "type": "string", - "enum": ["free", "pro"], "deprecated": true, - "description": "Subscription Plan is now set on organization level and is ignored in this request" + "description": "Subscription Plan is now set on organization level and is ignored in this request", + "type": "string", + "enum": ["free", "pro"] }, "region": { - "type": "string", "description": "Region you want your server to reside in. Use region_selection instead.", "deprecated": true, "enum": [ @@ -24083,12 +11722,11 @@ "ca-central-1", "ap-south-1", "sa-east-1" - ] + ], + "type": "string" }, "region_selection": { - "discriminator": { - "propertyName": "type" - }, + "description": "Region selection. Only one of region or region_selection can be specified.", "oneOf": [ { "type": "object", @@ -24139,13 +11777,12 @@ }, "required": ["type", "code"] } - ], - "description": "Region selection. Only one of region or region_selection can be specified." + ] }, "kps_enabled": { - "type": "boolean", "deprecated": true, - "description": "This field is deprecated and is ignored in this request" + "description": "This field is deprecated and is ignored in this request", + "type": "boolean" }, "desired_instance_size": { "description": "Desired instance size. Omit this field to always default to the smallest possible size.", @@ -24173,24 +11810,31 @@ ] }, "template_url": { + "description": "Template URL used to create the project from the CLI.", "type": "string", - "format": "uri", - "description": "Template URL used to create the project from the CLI." + "format": "uri" + }, + "release_channel": { + "deprecated": true, + "type": "null" + }, + "postgres_engine": { + "deprecated": true, + "type": "null" }, "high_availability": { - "type": "boolean", - "description": "[Experimental] Whether to enable high availability for the project." + "description": "[Experimental] Whether to enable high availability for the project.", + "type": "boolean" } }, "required": ["db_pass", "name", "organization_slug"], - "additionalProperties": false, - "hideDefinitions": ["release_channel", "postgres_engine"], "example": { "db_pass": "correct-horse-battery-staple", "name": "acme-prod", "organization_slug": "tsrqponmlkjihgfedcba", "region": "us-east-1" - } + }, + "additionalProperties": false }, "V1ProjectResponse": { "type": "object", @@ -24441,10 +12085,10 @@ } }, "required": ["name"], - "additionalProperties": false, "example": { "name": "Acme" - } + }, + "additionalProperties": false }, "OAuthTokenBody": { "type": "object", @@ -24459,7 +12103,8 @@ }, "client_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "client_secret": { "type": "string" @@ -24477,19 +12122,18 @@ "type": "string" }, "assertion": { - "type": "string", - "description": "IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only." + "description": "IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only.", + "type": "string" }, "resource": { + "description": "Resource indicator for MCP (Model Context Protocol) clients", "type": "string", - "format": "uri", - "description": "Resource indicator for MCP (Model Context Protocol) clients" + "format": "uri" }, "scope": { "type": "string" } }, - "additionalProperties": false, "example": { "grant_type": "authorization_code", "client_id": "66666666-6666-4666-8666-666666666666", @@ -24498,7 +12142,8 @@ "code_verifier": "qW0Z6d9pQnW0mL1dK1q9wFq6Yz2nV5rA8jT3mP7sH4c", "redirect_uri": "https://app.acme.com/auth/callback", "scope": "projects:read projects:write" - } + }, + "additionalProperties": false }, "OAuthTokenResponse": { "type": "object", @@ -24507,11 +12152,13 @@ "type": "string" }, "refresh_token": { - "type": "string", - "description": "The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`." + "description": "The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`.", + "type": "string" }, "expires_in": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "token_type": { "type": "string", @@ -24526,7 +12173,8 @@ "properties": { "client_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "client_secret": { "type": "string" @@ -24536,12 +12184,12 @@ } }, "required": ["client_id", "client_secret", "refresh_token"], - "additionalProperties": false, "example": { "client_id": "66666666-6666-4666-8666-666666666666", "client_secret": "sb_secret_live_example_9f4d3a206b2e4a7e8c91", "refresh_token": "oauth_refresh_9f4d3a206b2e4a7e8c91" - } + }, + "additionalProperties": false }, "SnippetList": { "type": "object", @@ -24706,9 +12354,9 @@ "type": "object", "properties": { "favorite": { - "type": "boolean", "deprecated": true, - "description": "Deprecated: Rely on root-level favorite property instead." + "description": "Deprecated: Rely on root-level favorite property instead.", + "type": "boolean" }, "schema_version": { "type": "string" @@ -24951,7 +12599,7 @@ }, "type": { "type": "string", - "enum": ["legacy", "publishable", "secret"], + "enum": ["legacy", "publishable", "secret", null], "nullable": true }, "prefix": { @@ -24971,17 +12619,22 @@ }, "secret_jwt_template": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {}, "nullable": true }, "inserted_at": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "nullable": true }, "updated_at": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "nullable": true } }, @@ -25015,6 +12668,9 @@ }, "secret_jwt_template": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {}, "nullable": true } @@ -25041,6 +12697,9 @@ }, "secret_jwt_template": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {}, "nullable": true } @@ -25128,6 +12787,37 @@ "notify_url": "https://example.com/webhooks/branches" } }, + "UpdateCustomHostnameResponseJsonValue": { + "description": "Any JSON-serializable value", + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ], + "nullable": true + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" + } + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" + } + } + ] + }, "UpdateCustomHostnameResponse": { "type": "object", "properties": { @@ -25153,13 +12843,13 @@ "errors": { "type": "array", "items": { - "description": "Any JSON-serializable value" + "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" } }, "messages": { "type": "array", "items": { - "description": "Any JSON-serializable value" + "$ref": "#/components/schemas/UpdateCustomHostnameResponseJsonValue" } }, "result": { @@ -25255,8 +12945,8 @@ "properties": { "custom_hostname": { "type": "string", - "maxLength": 253, - "minLength": 1 + "minLength": 1, + "maxLength": 253 } }, "required": ["custom_hostname"], @@ -25264,40 +12954,6 @@ "custom_hostname": "docs.example.com" } }, - "JitStateResponse": { - "discriminator": { - "propertyName": "state" - }, - "oneOf": [ - { - "type": "object", - "properties": { - "state": { - "type": "string", - "enum": ["enabled", "disabled"] - }, - "appliedSuccessfully": { - "type": "boolean" - } - }, - "required": ["state"] - }, - { - "type": "object", - "properties": { - "state": { - "type": "string", - "enum": ["unavailable"] - }, - "unavailableReason": { - "type": "string", - "enum": ["postgres_upgrade_required", "temporarily_unavailable"] - } - }, - "required": ["state", "unavailableReason"] - } - ] - }, "JitAccessRequestRequest": { "type": "object", "properties": { @@ -25359,8 +13015,8 @@ }, "requester_ip": { "default": false, - "type": "boolean", - "description": "Include requester's public IP in the list of addresses to unban." + "description": "Include requester's public IP in the list of addresses to unban.", + "type": "boolean" }, "identifier": { "type": "string" @@ -25395,9 +13051,14 @@ } } }, + "example": { + "dbAllowedCidrs": ["203.0.113.0/24"], + "dbAllowedCidrsV6": ["2001:db8::/32"] + }, "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." }, "old_config": { + "description": "Populated when a new config has been received, but not registered as successfully applied to a project.", "type": "object", "properties": { "dbAllowedCidrs": { @@ -25416,8 +13077,7 @@ "example": { "dbAllowedCidrs": ["203.0.113.0/24"], "dbAllowedCidrsV6": ["2001:db8::/32"] - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." + } }, "status": { "type": "string", @@ -25425,11 +13085,13 @@ }, "updated_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "applied_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" } }, "required": ["entitlement", "config", "status"] @@ -25532,6 +13194,7 @@ "description": "At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`." }, "old_config": { + "description": "Populated when a new config has been received, but not registered as successfully applied to a project.", "type": "object", "properties": { "dbAllowedCidrs": { @@ -25550,16 +13213,17 @@ "required": ["address", "type"] } } - }, - "description": "Populated when a new config has been received, but not registered as successfully applied to a project." + } }, "updated_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "applied_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "status": { "type": "string", @@ -25572,21 +13236,26 @@ "type": "object", "properties": { "root_key": { - "type": "string" + "type": "string", + "description": "The pgsodium root key: 32 bytes, hex-encoded (64 characters)." } }, - "required": ["root_key"] + "required": ["root_key"], + "example": { + "root_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + } }, "UpdatePgsodiumConfigBody": { "type": "object", "properties": { "root_key": { - "type": "string" + "type": "string", + "description": "The pgsodium root key: 32 bytes, hex-encoded (64 characters)." } }, "required": ["root_key"], "example": { - "root_key": "MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=" + "root_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" } }, "PostgrestConfigWithJWTSecretResponse": { @@ -25596,20 +13265,26 @@ "type": "string" }, "max_rows": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "db_extra_search_path": { "type": "string" }, "db_pool": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured based on compute size.", + "nullable": true }, "db_pool_acquisition_timeout": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured to 10.", + "nullable": true }, "jwt_secret": { "type": "string" @@ -25661,20 +13336,26 @@ "type": "string" }, "max_rows": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "db_extra_search_path": { "type": "string" }, "db_pool": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured based on compute size." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured based on compute size.", + "nullable": true }, "db_pool_acquisition_timeout": { "type": "integer", - "nullable": true, - "description": "If `null`, the value is automatically configured to 10." + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "If `null`, the value is automatically configured to 10.", + "nullable": true } }, "required": [ @@ -25689,7 +13370,9 @@ "type": "object", "properties": { "id": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "ref": { "type": "string" @@ -25730,6 +13413,7 @@ "required": ["name", "value"] }, "CreateSecretBody": { + "maxItems": 100, "type": "array", "items": { "type": "object", @@ -25826,6 +13510,36 @@ }, "required": ["status"] }, + "PlanGateErrorBody": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human-readable explanation of the plan gate" + }, + "error": { + "description": "Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message.", + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Machine-readable marker for plan-gated denials", + "enum": ["entitlement_required"] + }, + "feature": { + "type": "string", + "description": "Entitlement feature key that failed the check" + }, + "upgrade_url": { + "description": "Billing page URL for the organization, present when the org is resolvable", + "type": "string" + } + }, + "required": ["code", "feature"] + } + }, + "required": ["message"] + }, "VanitySubdomainBody": { "type": "object", "properties": { @@ -25955,7 +13669,7 @@ "validation_errors": { "type": "array", "items": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -26066,8 +13780,16 @@ "enum": ["user_defined_objects_in_internal_schemas"] }, "obj_type": { - "type": "string", - "enum": ["table", "function"] + "anyOf": [ + { + "type": "string", + "enum": ["table"] + }, + { + "type": "string", + "enum": ["function"] + } + ] }, "schema_name": { "type": "string" @@ -26117,9 +13839,6 @@ "warnings": { "type": "array", "items": { - "discriminator": { - "propertyName": "type" - }, "oneOf": [ { "type": "object", @@ -26311,7 +14030,7 @@ "enum": ["COMING_UP", "ACTIVE_HEALTHY", "UNHEALTHY"] }, "info": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -26343,7 +14062,9 @@ "type": "boolean" }, "connected_cluster": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 } }, "required": [ @@ -26375,7 +14096,8 @@ "properties": { "id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "algorithm": { "type": "string", @@ -26390,14 +14112,16 @@ }, "created_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updated_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" } }, - "required": ["id", "algorithm", "status", "created_at", "updated_at"], + "required": ["id", "algorithm", "status", "public_jwk", "created_at", "updated_at"], "additionalProperties": false }, "CreateSigningKeyBody": { @@ -26412,29 +14136,27 @@ "enum": ["in_use", "standby"] }, "private_jwk": { - "discriminator": { - "propertyName": "kty" - }, "oneOf": [ { "type": "object", "properties": { "kid": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { + "minItems": 2, + "maxItems": 2, "type": "array", "items": { "type": "string", "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 + } }, "ext": { "type": "boolean", @@ -26482,20 +14204,21 @@ "properties": { "kid": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { + "minItems": 2, + "maxItems": 2, "type": "array", "items": { "type": "string", "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 + } }, "ext": { "type": "boolean", @@ -26531,20 +14254,21 @@ "properties": { "kid": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { + "minItems": 2, + "maxItems": 2, "type": "array", "items": { "type": "string", "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 + } }, "ext": { "type": "boolean", @@ -26577,20 +14301,21 @@ "properties": { "kid": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "use": { "type": "string", "enum": ["sig"] }, "key_ops": { + "minItems": 2, + "maxItems": 2, "type": "array", "items": { "type": "string", "enum": ["sign", "verify"] - }, - "minItems": 2, - "maxItems": 2 + } }, "ext": { "type": "boolean", @@ -26616,11 +14341,11 @@ } }, "required": ["algorithm"], - "additionalProperties": false, "example": { "algorithm": "RS256", "status": "standby" - } + }, + "additionalProperties": false }, "SigningKeysResponse": { "type": "object", @@ -26632,7 +14357,8 @@ "properties": { "id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "algorithm": { "type": "string", @@ -26647,14 +14373,16 @@ }, "created_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updated_at": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" } }, - "required": ["id", "algorithm", "status", "created_at", "updated_at"], + "required": ["id", "algorithm", "status", "public_jwk", "created_at", "updated_at"], "additionalProperties": false } } @@ -26671,25 +14399,29 @@ } }, "required": ["status"], - "additionalProperties": false, "example": { "status": "standby" - } + }, + "additionalProperties": false }, "AuthConfigResponse": { "type": "object", "properties": { "api_max_request_duration": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "db_max_pool_size": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "db_max_pool_size_unit": { "type": "string", - "enum": ["connections", "percent"], + "enum": ["connections", "percent", null], "nullable": true }, "disable_signup": { @@ -27162,6 +14894,8 @@ }, "jwt_exp": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "mailer_allow_unverified_email_sign_ins": { @@ -27173,10 +14907,14 @@ "nullable": true }, "mailer_otp_exp": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "mailer_otp_length": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "mailer_secure_email_change_enabled": { @@ -27317,6 +15055,8 @@ }, "mfa_max_enrolled_factors": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "mfa_totp_enroll_enabled": { @@ -27359,7 +15099,9 @@ "nullable": true }, "mfa_phone_otp_length": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "mfa_phone_template": { "type": "string", @@ -27367,6 +15109,8 @@ }, "mfa_phone_max_frequency": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "nimbus_oauth_client_id": { @@ -27387,6 +15131,8 @@ }, "password_min_length": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "password_required_characters": { @@ -27395,36 +15141,51 @@ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~", - "" + "", + null ], "nullable": true }, "rate_limit_anonymous_users": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_email_sent": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_sms_sent": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_token_refresh": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_verify": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_otp": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "rate_limit_web3": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "refresh_token_rotation_enabled": { @@ -27453,7 +15214,7 @@ }, "security_captcha_provider": { "type": "string", - "enum": ["turnstile", "hcaptcha"], + "enum": ["turnstile", "hcaptcha", null], "nullable": true }, "security_captcha_secret": { @@ -27466,6 +15227,8 @@ }, "security_refresh_token_reuse_interval": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "security_update_password_require_reauthentication": { @@ -27498,6 +15261,8 @@ }, "sms_max_frequency": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "sms_messagebird_access_key": { @@ -27510,14 +15275,18 @@ }, "sms_otp_exp": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "sms_otp_length": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "sms_provider": { "type": "string", - "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"], + "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage", null], "nullable": true }, "sms_template": { @@ -27531,6 +15300,7 @@ "sms_test_otp_valid_until": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "nullable": true }, "sms_textlocal_api_key": { @@ -27584,6 +15354,7 @@ "smtp_admin_email": { "type": "string", "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "nullable": true }, "smtp_host": { @@ -27592,6 +15363,8 @@ }, "smtp_max_frequency": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "smtp_pass": { @@ -27628,7 +15401,9 @@ "type": "boolean" }, "custom_oauth_max_providers": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 } }, "required": [ @@ -27892,6 +15667,7 @@ "smtp_admin_email": { "type": "string", "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "nullable": true }, "smtp_host": { @@ -28101,7 +15877,7 @@ }, "security_captcha_provider": { "type": "string", - "enum": ["turnstile", "hcaptcha"], + "enum": ["turnstile", "hcaptcha", null], "nullable": true }, "security_captcha_secret": { @@ -28193,7 +15969,8 @@ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789", "abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~", - "" + "", + null ], "nullable": true }, @@ -28245,7 +16022,7 @@ }, "sms_provider": { "type": "string", - "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage"], + "enum": ["messagebird", "textlocal", "twilio", "twilio_verify", "vonage", null], "nullable": true }, "sms_messagebird_access_key": { @@ -28264,6 +16041,7 @@ "sms_test_otp_valid_until": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "nullable": true }, "sms_textlocal_api_key": { @@ -28772,15 +16550,19 @@ }, "db_max_pool_size": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "db_max_pool_size_unit": { "type": "string", - "enum": ["connections", "percent"], + "enum": ["connections", "percent", null], "nullable": true }, "api_max_request_duration": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "mfa_totp_enroll_enabled": { @@ -28889,7 +16671,8 @@ "properties": { "id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "type": { "type": "string" @@ -28947,6 +16730,37 @@ }, "required": ["available_versions"] }, + "ListProjectAddonsResponseJsonValue": { + "description": "Any JSON-serializable value", + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ], + "nullable": true + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" + } + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" + } + } + ] + }, "ListProjectAddonsResponse": { "type": "object", "properties": { @@ -28972,7 +16786,7 @@ "type": "object", "properties": { "id": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -29050,7 +16864,7 @@ "required": ["description", "type", "interval", "amount"] }, "meta": { - "description": "Any JSON-serializable value" + "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" } }, "required": ["id", "name", "price"] @@ -29086,7 +16900,7 @@ "type": "object", "properties": { "id": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -29164,7 +16978,7 @@ "required": ["description", "type", "interval", "amount"] }, "meta": { - "description": "Any JSON-serializable value" + "$ref": "#/components/schemas/ListProjectAddonsResponseJsonValue" } }, "required": ["id", "name", "price"] @@ -29181,7 +16995,7 @@ "type": "object", "properties": { "addon_variant": { - "oneOf": [ + "anyOf": [ { "type": "string", "enum": [ @@ -29253,7 +17067,8 @@ }, "created_by": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "required": ["token_alias", "expires_at", "created_at", "created_by"] @@ -29275,7 +17090,8 @@ }, "created_by": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "required": ["token", "token_alias", "expires_at", "created_at", "created_by"] @@ -29289,7 +17105,6 @@ "type": "object", "properties": { "name": { - "type": "string", "enum": [ "unindexed_foreign_keys", "auth_users_exposed", @@ -29320,7 +17135,8 @@ "leaked_service_key", "no_backup_admin", "vulnerable_postgres_version" - ] + ], + "type": "string" }, "title": { "type": "string" @@ -29404,7 +17220,7 @@ "items": {} }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, @@ -29461,7 +17277,8 @@ "properties": { "timestamp": { "type": "string", - "format": "date-time" + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" }, "total_auth_requests": { "type": "number" @@ -29486,7 +17303,7 @@ } }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, @@ -29549,7 +17366,7 @@ } }, "error": { - "oneOf": [ + "anyOf": [ { "type": "string" }, @@ -29622,6 +17439,7 @@ "ttl_seconds": { "type": "integer", "minimum": 1, + "maximum": 9007199254740991, "format": "int64" } }, @@ -29800,12 +17618,12 @@ } }, "required": ["name"], - "additionalProperties": true + "additionalProperties": {} } } }, "required": ["name", "schemas"], - "additionalProperties": true + "additionalProperties": {} } } }, @@ -29838,7 +17656,8 @@ "properties": { "user_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "user_roles": { "type": "array", @@ -29861,7 +17680,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -29873,7 +17694,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -29899,8 +17722,18 @@ "minLength": 1 }, "rhost": { - "type": "string", - "minLength": 1 + "anyOf": [ + { + "type": "string", + "format": "ipv4", + "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$" + }, + { + "type": "string", + "format": "ipv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$" + } + ] } }, "required": ["role", "rhost"], @@ -29914,7 +17747,8 @@ "properties": { "user_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "user_role": { "type": "object", @@ -29935,7 +17769,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -29947,7 +17783,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -29970,13 +17808,14 @@ "items": { "type": "array", "items": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { "user_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "primary_email": { "type": "string", @@ -30009,7 +17848,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -30021,7 +17862,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -30050,7 +17893,8 @@ }, "invite_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "expires_at": { "type": "string" @@ -30076,7 +17920,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -30088,7 +17934,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -30117,8 +17965,9 @@ "properties": { "user_id": { "type": "string", + "minLength": 1, "format": "uuid", - "minLength": 1 + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "roles": { "type": "array", @@ -30141,7 +17990,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -30153,7 +18004,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -30193,8 +18046,9 @@ "properties": { "email": { "type": "string", + "minLength": 1, "format": "email", - "minLength": 1 + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "roles": { "type": "array", @@ -30217,7 +18071,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -30229,7 +18085,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -30269,11 +18127,13 @@ "properties": { "email": { "type": "string", - "format": "email" + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "invite_id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "user_roles": { "type": "array", @@ -30296,7 +18156,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv4", + "pattern": "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$" } }, "required": ["cidr"] @@ -30308,7 +18170,9 @@ "type": "object", "properties": { "cidr": { - "type": "string" + "type": "string", + "format": "cidrv6", + "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$" } }, "required": ["cidr"] @@ -30331,8 +18195,9 @@ "properties": { "email": { "type": "string", + "minLength": 1, "format": "email", - "minLength": 1 + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "token": { "type": "string", @@ -30362,14 +18227,20 @@ "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, "version": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "created_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "updated_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "verify_jwt": { @@ -30435,11 +18306,15 @@ "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, "version": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "created_at": { "type": "integer", - "format": "int64" + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "verify_jwt": { "type": "boolean" @@ -30493,14 +18368,20 @@ "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, "version": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "created_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "updated_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "verify_jwt": { @@ -30560,7 +18441,7 @@ "required": ["entrypoint_path"] } }, - "required": ["metadata"], + "required": ["file", "metadata"], "example": { "file": ["./supabase/functions/hello-world/index.ts"], "metadata": { @@ -30587,15 +18468,21 @@ "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, "version": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "created_at": { "type": "integer", - "format": "int64" + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "updated_at": { "type": "integer", - "format": "int64" + "format": "int64", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "verify_jwt": { "type": "boolean" @@ -30632,14 +18519,20 @@ "enum": ["ACTIVE", "REMOVED", "THROTTLED"] }, "version": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "created_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "updated_at": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "verify_jwt": { @@ -30711,24 +18604,27 @@ "type": "object", "properties": { "attributes": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { "iops": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "throughput_mibps": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "type": { "type": "string", @@ -30742,13 +18638,15 @@ "properties": { "iops": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "type": { "type": "string", @@ -30769,27 +18667,27 @@ "type": "object", "properties": { "attributes": { - "discriminator": { - "propertyName": "type" - }, "oneOf": [ { "type": "object", "properties": { "iops": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "throughput_mibps": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "type": { "type": "string", @@ -30803,13 +18701,15 @@ "properties": { "iops": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true + "exclusiveMinimum": true, + "maximum": 9007199254740991, + "minimum": 0 }, "type": { "type": "string", @@ -30860,24 +18760,24 @@ "properties": { "growth_percent": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Growth percentage for disk autoscaling" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Growth percentage for disk autoscaling", + "nullable": true }, "min_increment_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Minimum increment size for disk autoscaling in GB" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Minimum increment size for disk autoscaling in GB", + "nullable": true }, "max_size_gb": { "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "nullable": true, - "description": "Maximum limit the disk size will grow to in GB" + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "description": "Maximum limit the disk size will grow to in GB", + "nullable": true } }, "required": ["growth_percent", "min_increment_gb", "max_size_gb"] @@ -30887,6 +18787,8 @@ "properties": { "fileSizeLimit": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "format": "int64" }, "features": { @@ -30927,15 +18829,18 @@ }, "maxNamespaces": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxTables": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxCatalogs": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] @@ -30948,11 +18853,13 @@ }, "maxBuckets": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxIndexes": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": ["enabled", "maxBuckets", "maxIndexes"] @@ -31009,9 +18916,9 @@ "properties": { "fileSizeLimit": { "type": "integer", + "format": "int64", "minimum": 0, - "maximum": 536870912000, - "format": "int64" + "maximum": 536870912000 }, "features": { "type": "object", @@ -31051,15 +18958,18 @@ }, "maxNamespaces": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxTables": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxCatalogs": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"] @@ -31072,11 +18982,13 @@ }, "maxBuckets": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "maxIndexes": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": ["enabled", "maxBuckets", "maxIndexes"] @@ -31094,7 +19006,6 @@ "required": ["upstreamTarget"] } }, - "additionalProperties": false, "example": { "fileSizeLimit": 10485760, "features": { @@ -31102,19 +19013,24 @@ "enabled": true } } - } + }, + "additionalProperties": false }, "V1PgbouncerConfigResponse": { "type": "object", "properties": { "default_pool_size": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "ignore_startup_parameters": { "type": "string" }, "max_client_conn": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "pool_mode": { "type": "string", @@ -31124,16 +19040,24 @@ "type": "string" }, "server_idle_timeout": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "server_lifetime": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "query_wait_timeout": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "reserve_pool_size": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 } } }, @@ -31157,7 +19081,9 @@ "type": "string" }, "db_port": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "db_name": { "type": "string" @@ -31171,10 +19097,14 @@ }, "default_pool_size": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "max_client_conn": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "pool_mode": { @@ -31207,9 +19137,9 @@ "nullable": true }, "pool_mode": { + "description": "Dedicated pooler mode for the project", "type": "string", - "enum": ["transaction", "session"], - "description": "Dedicated pooler mode for the project" + "enum": ["transaction", "session"] } }, "example": { @@ -31222,6 +19152,8 @@ "properties": { "default_pool_size": { "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, "nullable": true }, "pool_mode": { @@ -31292,6 +19224,11 @@ "minimum": 10, "maximum": 2147483640 }, + "max_logical_replication_workers": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, @@ -31308,7 +19245,9 @@ "maximum": 1024 }, "max_replication_slots": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "max_slot_wal_keep_size": { "type": "string" @@ -31319,11 +19258,18 @@ "max_standby_streaming_delay": { "type": "string" }, + "max_sync_workers_per_subscription": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_wal_size": { "type": "string" }, "max_wal_senders": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "max_worker_processes": { "type": "integer", @@ -31428,6 +19374,11 @@ "minimum": 10, "maximum": 2147483640 }, + "max_logical_replication_workers": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_parallel_maintenance_workers": { "type": "integer", "minimum": 0, @@ -31444,7 +19395,9 @@ "maximum": 1024 }, "max_replication_slots": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "max_slot_wal_keep_size": { "type": "string" @@ -31455,11 +19408,18 @@ "max_standby_streaming_delay": { "type": "string" }, + "max_sync_workers_per_subscription": { + "type": "integer", + "minimum": 0, + "maximum": 262143 + }, "max_wal_size": { "type": "string" }, "max_wal_senders": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "max_worker_processes": { "type": "integer", @@ -31504,82 +19464,82 @@ "type": "boolean" } }, - "additionalProperties": false, "example": { "max_connections": 120, "shared_buffers": "256MB", "work_mem": "4MB", "statement_timeout": "60000ms" - } + }, + "additionalProperties": false }, "RealtimeConfigResponse": { "type": "object", "properties": { "private_only": { "type": "boolean", - "nullable": true, - "description": "Whether to only allow private channels" + "description": "Whether to only allow private channels", + "nullable": true }, "connection_pool": { "type": "integer", "minimum": 1, "maximum": 100, - "nullable": true, - "description": "Sets connection pool size for Realtime Authorization" + "description": "Sets connection pool size for Realtime Authorization", + "nullable": true }, "max_concurrent_users": { "type": "integer", "minimum": 1, "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of concurrent users rate limit" + "description": "Sets maximum number of concurrent users rate limit", + "nullable": true }, "max_events_per_second": { "type": "integer", "minimum": 1, "maximum": 50000, - "nullable": true, - "description": "Sets maximum number of events per second rate per channel limit" + "description": "Sets maximum number of events per second rate per channel limit", + "nullable": true }, "max_bytes_per_second": { "type": "integer", "minimum": 1, "maximum": 10000000, - "nullable": true, - "description": "Sets maximum number of bytes per second rate per channel limit" + "description": "Sets maximum number of bytes per second rate per channel limit", + "nullable": true }, "max_channels_per_client": { "type": "integer", "minimum": 1, "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of channels per client rate limit" + "description": "Sets maximum number of channels per client rate limit", + "nullable": true }, "max_joins_per_second": { "type": "integer", "minimum": 1, "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of joins per second rate limit" + "description": "Sets maximum number of joins per second rate limit", + "nullable": true }, "max_presence_events_per_second": { "type": "integer", "minimum": 1, "maximum": 5000, - "nullable": true, - "description": "Sets maximum number of presence events per second rate limit" + "description": "Sets maximum number of presence events per second rate limit", + "nullable": true }, "max_payload_size_in_kb": { "type": "integer", "minimum": 1, "maximum": 10000, - "nullable": true, - "description": "Sets maximum number of payload size in KB rate limit" + "description": "Sets maximum number of payload size in KB rate limit", + "nullable": true }, "suspend": { "type": "boolean", - "nullable": true, - "description": "Disables the Realtime service for this project when true. Set to false to re-enable it." + "description": "Disables the Realtime service for this project when true. Set to false to re-enable it.", + "nullable": true }, "presence_enabled": { "type": "boolean", @@ -31664,12 +19624,12 @@ "description": "Whether to enable presence" } }, - "additionalProperties": false, "example": { "private_only": false, "max_concurrent_users": 1000, "max_channels_per_client": 100 - } + }, + "additionalProperties": false }, "CreateProviderBody": { "type": "object", @@ -31709,7 +19669,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -31773,9 +19733,6 @@ "saml": { "type": "object", "properties": { - "id": { - "type": "string" - }, "entity_id": { "type": "string" }, @@ -31803,7 +19760,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -31838,16 +19795,13 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["entity_id"] }, "domains": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "string" - }, "domain": { "type": "string" }, @@ -31857,8 +19811,7 @@ "updated_at": { "type": "string" } - }, - "required": ["id"] + } } }, "created_at": { @@ -31884,9 +19837,6 @@ "saml": { "type": "object", "properties": { - "id": { - "type": "string" - }, "entity_id": { "type": "string" }, @@ -31914,7 +19864,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -31949,16 +19899,13 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["entity_id"] }, "domains": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "string" - }, "domain": { "type": "string" }, @@ -31968,8 +19915,7 @@ "updated_at": { "type": "string" } - }, - "required": ["id"] + } } }, "created_at": { @@ -31994,9 +19940,6 @@ "saml": { "type": "object", "properties": { - "id": { - "type": "string" - }, "entity_id": { "type": "string" }, @@ -32024,7 +19967,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -32059,16 +20002,13 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["entity_id"] }, "domains": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "string" - }, "domain": { "type": "string" }, @@ -32078,8 +20018,7 @@ "updated_at": { "type": "string" } - }, - "required": ["id"] + } } }, "created_at": { @@ -32124,7 +20063,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -32173,9 +20112,6 @@ "saml": { "type": "object", "properties": { - "id": { - "type": "string" - }, "entity_id": { "type": "string" }, @@ -32203,7 +20139,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -32238,16 +20174,13 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["entity_id"] }, "domains": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "string" - }, "domain": { "type": "string" }, @@ -32257,8 +20190,7 @@ "updated_at": { "type": "string" } - }, - "required": ["id"] + } } }, "created_at": { @@ -32279,9 +20211,6 @@ "saml": { "type": "object", "properties": { - "id": { - "type": "string" - }, "entity_id": { "type": "string" }, @@ -32309,7 +20238,7 @@ } }, "default": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": {} @@ -32344,16 +20273,13 @@ ] } }, - "required": ["id", "entity_id"] + "required": ["entity_id"] }, "domains": { "type": "array", "items": { "type": "object", "properties": { - "id": { - "type": "string" - }, "domain": { "type": "string" }, @@ -32363,8 +20289,7 @@ "updated_at": { "type": "string" } - }, - "required": ["id"] + } } }, "created_at": { @@ -32394,7 +20319,9 @@ "type": "object", "properties": { "id": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "is_physical_backup": { "type": "boolean" @@ -32414,10 +20341,14 @@ "type": "object", "properties": { "earliest_physical_backup_date_unix": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "latest_physical_backup_date_unix": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 } } } @@ -32430,6 +20361,7 @@ "recovery_time_target_unix": { "type": "integer", "minimum": 0, + "maximum": 9007199254740991, "format": "int64" } }, @@ -32464,6 +20396,7 @@ "completed_on": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "nullable": true } }, @@ -32473,7 +20406,9 @@ "type": "object", "properties": { "id": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 } }, "required": ["id"], @@ -32486,12 +20421,14 @@ "properties": { "schedule_for": { "type": "string", + "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$", "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", "example": "04:00:00" }, "updated_at": { "type": "string", "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "description": "Timestamp of when the backup schedule was last updated.", "example": "2026-05-04T14:40:44+00:00" } @@ -32503,6 +20440,7 @@ "properties": { "schedule_for": { "type": "string", + "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$", "description": "Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.", "example": "04:00:00" } @@ -32619,7 +20557,7 @@ "enum": ["boolean", "numeric", "set"] }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -32712,7 +20650,6 @@ "opt_in_tags": { "type": "array", "items": { - "type": "string", "enum": [ "AI_SQL_GENERATOR_OPT_IN", "AI_DATA_GENERATOR_OPT_IN", @@ -32817,7 +20754,7 @@ }, "target_subscription_plan": { "type": "string", - "enum": ["free", "pro", "team", "enterprise", "platform"], + "enum": ["free", "pro", "team", "enterprise", "platform", null], "nullable": true } }, @@ -32839,7 +20776,8 @@ }, "created_by": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "required": ["project", "preview", "expires_at", "created_at", "created_by"] diff --git a/apps/docs/spec/transforms/api_v2_openapi_deparsed.json b/apps/docs/spec/transforms/api_v2_openapi_deparsed.json index 7b21a0596db..5e43a87b163 100644 --- a/apps/docs/spec/transforms/api_v2_openapi_deparsed.json +++ b/apps/docs/spec/transforms/api_v2_openapi_deparsed.json @@ -33,222 +33,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["log_drain"], - "description": "Resource type." - }, - "id": { - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true - }, - "schema": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "port": { - "type": "number", - "nullable": true - }, - "hostname": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "postgres" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "http": { - "type": "string", - "enum": ["http1", "http2"] - }, - "gzip": { - "type": "boolean" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "webhook" - }, - { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "dataset_id": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "bigquery" - }, - { - "type": "object", - "properties": { - "api_key": { - "type": "string" - }, - "region": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "datadog" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "loki" - }, - { - "type": "object", - "properties": { - "dsn": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "sentry" - }, - { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "api_token": { - "type": "string" - }, - "dataset_name": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "axiom" - }, - { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "tls": { - "default": false, - "type": "boolean" - }, - "structured_data": { - "type": "string" - }, - "cipher_key": { - "type": "string" - }, - "ca_cert": { - "type": "string" - }, - "client_cert": { - "type": "string" - }, - "client_key": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "syslog" - } - ] - }, - "backend_type": { - "type": "string", - "enum": [ - "postgres", - "bigquery", - "clickhouse", - "webhook", - "datadog", - "loki", - "sentry", - "s3", - "axiom", - "last9", - "otlp", - "syslog" - ] - } - }, - "required": ["name", "config", "backend_type"] - } - }, - "required": ["type", "id", "attributes"] - } - } - }, - "required": ["data"] + "$ref": "#/components/schemas/ListLogDrainsResponse" } } } @@ -269,9 +54,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_config_read"] } ], "summary": "List project log drains", @@ -283,6 +65,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_read"]], "x-oauth-scope": "analytics_config:read" }, "post": { @@ -307,216 +90,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["log_drain"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true - }, - "schema": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "port": { - "type": "number", - "nullable": true - }, - "hostname": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "postgres" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "http": { - "type": "string", - "enum": ["http1", "http2"] - }, - "gzip": { - "type": "boolean" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "webhook" - }, - { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "dataset_id": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "bigquery" - }, - { - "type": "object", - "properties": { - "api_key": { - "type": "string" - }, - "region": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "datadog" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "loki" - }, - { - "type": "object", - "properties": { - "dsn": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "sentry" - }, - { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "api_token": { - "type": "string" - }, - "dataset_name": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "axiom" - }, - { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "tls": { - "default": false, - "type": "boolean" - }, - "structured_data": { - "type": "string" - }, - "cipher_key": { - "type": "string" - }, - "ca_cert": { - "type": "string" - }, - "client_cert": { - "type": "string" - }, - "client_key": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "syslog" - } - ] - }, - "backend_type": { - "type": "string", - "enum": [ - "postgres", - "bigquery", - "clickhouse", - "webhook", - "datadog", - "loki", - "sentry", - "s3", - "axiom", - "last9", - "otlp", - "syslog" - ] - } - }, - "required": ["name", "config", "backend_type"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/CreateLogDrainRequestOpenApi" } } } @@ -527,219 +101,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["log_drain"], - "description": "Resource type." - }, - "id": { - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true - }, - "schema": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "port": { - "type": "number", - "nullable": true - }, - "hostname": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "postgres" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "http": { - "type": "string", - "enum": ["http1", "http2"] - }, - "gzip": { - "type": "boolean" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "webhook" - }, - { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "dataset_id": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "bigquery" - }, - { - "type": "object", - "properties": { - "api_key": { - "type": "string" - }, - "region": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "datadog" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "loki" - }, - { - "type": "object", - "properties": { - "dsn": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "sentry" - }, - { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "api_token": { - "type": "string" - }, - "dataset_name": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "axiom" - }, - { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "tls": { - "default": false, - "type": "boolean" - }, - "structured_data": { - "type": "string" - }, - "cipher_key": { - "type": "string" - }, - "ca_cert": { - "type": "string" - }, - "client_cert": { - "type": "string" - }, - "client_key": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "syslog" - } - ] - }, - "backend_type": { - "type": "string", - "enum": [ - "postgres", - "bigquery", - "clickhouse", - "webhook", - "datadog", - "loki", - "sentry", - "s3", - "axiom", - "last9", - "otlp", - "syslog" - ] - } - }, - "required": ["name", "config", "backend_type"] - } - }, - "required": ["type", "id", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/LogDrainResponse" } } } @@ -748,7 +110,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Pro, Team, or Enterprise organization plan." + "description": "This feature requires the Pro, Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBodyV2" + } + } + } }, "403": { "description": "Forbidden action" @@ -763,9 +132,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_config_write"] } ], "summary": "Create a log drain for a project", @@ -782,6 +148,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" } }, @@ -809,6 +176,7 @@ "description": "Log drains identifier", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "type": "string" } } @@ -818,216 +186,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["log_drain"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true - }, - "schema": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "port": { - "type": "number", - "nullable": true - }, - "hostname": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "postgres" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "http": { - "type": "string", - "enum": ["http1", "http2"] - }, - "gzip": { - "type": "boolean" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "webhook" - }, - { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "dataset_id": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "bigquery" - }, - { - "type": "object", - "properties": { - "api_key": { - "type": "string" - }, - "region": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "datadog" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "loki" - }, - { - "type": "object", - "properties": { - "dsn": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "sentry" - }, - { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "api_token": { - "type": "string" - }, - "dataset_name": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "axiom" - }, - { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "tls": { - "default": false, - "type": "boolean" - }, - "structured_data": { - "type": "string" - }, - "cipher_key": { - "type": "string" - }, - "ca_cert": { - "type": "string" - }, - "client_cert": { - "type": "string" - }, - "client_key": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "syslog" - } - ] - }, - "backend_type": { - "type": "string", - "enum": [ - "postgres", - "bigquery", - "clickhouse", - "webhook", - "datadog", - "loki", - "sentry", - "s3", - "axiom", - "last9", - "otlp", - "syslog" - ] - } - }, - "required": ["backend_type"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/UpdateLogDrainRequestOpenApi" } } } @@ -1038,219 +197,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["log_drain"], - "description": "Resource type." - }, - "id": { - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "config": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true - }, - "schema": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "port": { - "type": "number", - "nullable": true - }, - "hostname": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "postgres" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "http": { - "type": "string", - "enum": ["http1", "http2"] - }, - "gzip": { - "type": "boolean" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "webhook" - }, - { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "dataset_id": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "bigquery" - }, - { - "type": "object", - "properties": { - "api_key": { - "type": "string" - }, - "region": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "datadog" - }, - { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "username": { - "type": "string", - "nullable": true - }, - "password": { - "type": "string", - "nullable": true - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "title": "loki" - }, - { - "type": "object", - "properties": { - "dsn": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "sentry" - }, - { - "type": "object", - "properties": { - "domain": { - "type": "string" - }, - "api_token": { - "type": "string" - }, - "dataset_name": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "axiom" - }, - { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "tls": { - "default": false, - "type": "boolean" - }, - "structured_data": { - "type": "string" - }, - "cipher_key": { - "type": "string" - }, - "ca_cert": { - "type": "string" - }, - "client_cert": { - "type": "string" - }, - "client_key": { - "type": "string" - } - }, - "additionalProperties": false, - "title": "syslog" - } - ] - }, - "backend_type": { - "type": "string", - "enum": [ - "postgres", - "bigquery", - "clickhouse", - "webhook", - "datadog", - "loki", - "sentry", - "s3", - "axiom", - "last9", - "otlp", - "syslog" - ] - } - }, - "required": ["name", "config", "backend_type"] - } - }, - "required": ["type", "id", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/LogDrainResponse" } } } @@ -1271,9 +218,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_config_write"] } ], "summary": "Update a project log drain", @@ -1285,6 +229,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" }, "delete": { @@ -1310,6 +255,7 @@ "description": "Log drains identifier", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "type": "string" } } @@ -1334,9 +280,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["analytics_config_write"] } ], "summary": "Delete a project log drain", @@ -1348,6 +291,7 @@ } ], "x-endpoint-owners": ["analytics"], + "x-fga-permissions": [["analytics_config_write"]], "x-oauth-scope": "analytics_config:write" } }, @@ -1374,30 +318,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["project_transfer_input"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "target_organization_slug": { - "type": "string" - } - }, - "required": ["target_organization_slug"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2TransferProjectBody" } } } @@ -1408,75 +329,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["project_transfer_result"], - "description": "Resource type." - }, - "attributes": { - "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"] - } - } - }, - "required": ["valid", "warnings", "errors", "info"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2PreviewProjectTransferResponse" } } } @@ -1494,14 +347,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "Previews transferring a project to a different organizations, shows eligibility and impact", "tags": ["Projects"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["project_admin_read"]] } }, "/v2/projects/{ref}/transfers": { @@ -1527,30 +378,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["project_transfer_input"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "target_organization_slug": { - "type": "string" - } - }, - "required": ["target_organization_slug"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2TransferProjectBody" } } } @@ -1572,14 +400,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write"] } ], "summary": "Transfers a project to a different organization", "tags": ["Projects"], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]] } }, "/v2/projects/{ref}/private-link/associations": { @@ -1606,62 +432,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." - }, - "id": { - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "aws_account_id": { - "type": "string", - "minLength": 12, - "maxLength": 12, - "pattern": "^\\d{12}$", - "description": "The AWS account ID this PrivateLink share is associated with." - }, - "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." - }, - "status": { - "type": "string", - "enum": [ - "CREATING", - "READY", - "ASSOCIATION_REQUEST_EXPIRED", - "ASSOCIATION_ACCEPTED", - "CREATION_FAILED", - "DELETING" - ], - "description": "\n - `CREATING`: The PrivateLink resources and the Association are in the process of being created. The PrivateLink Share cannot be accepted yet.\n - `READY`: The PrivateLink resources have been created and the PrivateLink Share can be accepted for the duration of 12h after sharing. See `shared_at`.\n - `ASSOCIATION_REQUEST_EXPIRED`: The PrivateLink Share has not been accepted within the 12h time limit. This association can now be deleted.\n - `ASSOCIATION_ACCEPTED`: The PrivateLink Share was successfully accepted.\n - `CREATION_FAILED`: The PrivateLink resources failed to create. This likely means something went wrong on Supabase's and and support should be contacted.\n - `DELETING`: The PrivateLink resources and the Association are in the process of being deleted. The PrivateLink Share cannot be accepted yet.\n" - }, - "shared_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." - } - }, - "required": ["aws_account_id", "status", "shared_at"] - } - }, - "required": ["type", "id", "attributes"] - } - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2ListPrivateLinkAssociationsResponse" } } } @@ -1682,14 +453,12 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_read"] } ], "summary": "List AWS accounts attached to the project PrivateLink share", "tags": ["Projects"], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_read"]] }, "post": { "description": "Adds an AWS account to the project's PrivateLink configuration and schedules the AWS resources to be created.", @@ -1714,39 +483,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "aws_account_id": { - "type": "string", - "minLength": 12, - "maxLength": 12, - "pattern": "^\\d{12}$", - "description": "The AWS account ID to add to the project PrivateLink share." - }, - "account_name": { - "type": "string", - "maxLength": 128, - "description": "Optional human-readable name for the AWS account." - } - }, - "required": ["aws_account_id"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2CreatePrivateLinkAssociationRequest" } } } @@ -1757,59 +494,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." - }, - "id": { - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "aws_account_id": { - "type": "string", - "minLength": 12, - "maxLength": 12, - "pattern": "^\\d{12}$", - "description": "The AWS account ID this PrivateLink share is associated with." - }, - "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." - }, - "status": { - "type": "string", - "enum": [ - "CREATING", - "READY", - "ASSOCIATION_REQUEST_EXPIRED", - "ASSOCIATION_ACCEPTED", - "CREATION_FAILED", - "DELETING" - ], - "description": "\n - `CREATING`: The PrivateLink resources and the Association are in the process of being created. The PrivateLink Share cannot be accepted yet.\n - `READY`: The PrivateLink resources have been created and the PrivateLink Share can be accepted for the duration of 12h after sharing. See `shared_at`.\n - `ASSOCIATION_REQUEST_EXPIRED`: The PrivateLink Share has not been accepted within the 12h time limit. This association can now be deleted.\n - `ASSOCIATION_ACCEPTED`: The PrivateLink Share was successfully accepted.\n - `CREATION_FAILED`: The PrivateLink resources failed to create. This likely means something went wrong on Supabase's and and support should be contacted.\n - `DELETING`: The PrivateLink resources and the Association are in the process of being deleted. The PrivateLink Share cannot be accepted yet.\n" - }, - "shared_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." - } - }, - "required": ["aws_account_id", "status", "shared_at"] - } - }, - "required": ["type", "id", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2PrivateLinkAssociationResponse" } } } @@ -1818,7 +503,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Team, or Enterprise organization plan." + "description": "This feature requires the Team, or Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBodyV2" + } + } + } }, "403": { "description": "Forbidden action" @@ -1833,9 +525,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Add an AWS account to the project PrivateLink share", @@ -1847,12 +536,13 @@ "position": "before" } ], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] } }, "/v2/projects/{ref}/private-link/associations/aws-account/{aws_account_id}": { "delete": { - "description": "Removes an AWS account from the project's PrivateLink configuration. Cleans up the associated AWS resources.", + "description": "Removes an AWS account from the project's PrivateLink configuration (targeting the primary database). Cleans up the associated AWS resources.", "operationId": "v2-delete-private-link-association", "parameters": [ { @@ -1870,7 +560,7 @@ }, { "name": "aws_account_id", - "required": false, + "required": true, "in": "path", "description": "AWS account ID used in PrivateLink association", "schema": { @@ -1898,14 +588,77 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["project_admin_write"] } ], "summary": "Remove an AWS account from the project PrivateLink share", "tags": ["Projects"], - "x-endpoint-owners": ["platform-networking", "management-api"] + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] + } + }, + "/v2/projects/{ref}/private-link/associations/aws-account/{aws_account_id}/database/{database_identifier}": { + "delete": { + "description": "Removes an AWS account from the project's PrivateLink configuration for the given read replica. Cleans up the associated AWS resources.", + "operationId": "v2-delete-private-link-association-for-database", + "parameters": [ + { + "name": "ref", + "required": true, + "in": "path", + "description": "Project ref", + "schema": { + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst", + "type": "string" + } + }, + { + "name": "aws_account_id", + "required": true, + "in": "path", + "description": "AWS account ID used in PrivateLink association", + "schema": { + "type": "string" + } + }, + { + "name": "database_identifier", + "required": true, + "in": "path", + "description": "Identifier of the read replica this PrivateLink association targets", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + }, + "500": { + "description": "Failed to remove AWS account from PrivateLink share" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "Remove an AWS account from a specific database PrivateLink share", + "tags": ["Projects"], + "x-endpoint-owners": ["platform-networking", "management-api"], + "x-fga-permissions": [["project_admin_write"]] } }, "/v2/organizations/{slug}/members": { @@ -1933,22 +686,22 @@ "size": { "type": "integer", "minimum": 1, - "maximum": 100, - "required": false + "maximum": 100 }, "after": { "type": "string", "format": "uuid", - "required": false + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "before": { "type": "string", "format": "uuid", - "required": false + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "type": "object" - } + }, + "style": "deepObject" }, { "name": "filter", @@ -1957,17 +710,17 @@ "schema": { "properties": { "username": { - "type": "string", - "required": false + "type": "string" }, "primary_email": { "type": "string", "format": "email", - "required": false + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" } }, "type": "object" - } + }, + "style": "deepObject" } ], "responses": { @@ -1976,130 +729,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["organization_member"], - "description": "Resource type." - }, - "id": { - "type": "string", - "format": "uuid" - }, - "attributes": { - "type": "object", - "properties": { - "username": { - "type": "string", - "nullable": true, - "description": "Member's username" - }, - "primary_email": { - "type": "string", - "nullable": true, - "description": "Member's primary email" - }, - "mfa_enabled": { - "type": "boolean", - "description": "Whether Multi-Factor Authentication is enabled for this member" - }, - "is_sso_user": { - "type": "boolean", - "description": "Whether this member is a Single Sign-On user" - }, - "avatar_url": { - "type": "string", - "nullable": true, - "description": "Member's avatar URL" - }, - "roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Role name. For project-scoped roles this is the base role name.", - "example": "developer" - }, - "scope": { - "type": "string", - "enum": ["organization", "project"], - "description": "Whether this role applies org-wide or is scoped to specific projects for the user." - }, - "projects": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ref": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": ["ref", "name"] - }, - "description": "Project refs this role is scoped to. Empty array for org-level roles." - } - }, - "required": ["name", "scope", "projects"] - }, - "description": "Roles assigned to this member. Includes both org-level and project-scoped roles." - } - }, - "required": [ - "username", - "primary_email", - "mfa_enabled", - "is_sso_user", - "avatar_url", - "roles" - ] - } - }, - "required": ["type", "id", "attributes"] - } - }, - "links": { - "type": "object", - "properties": { - "first": { - "type": "string", - "nullable": true, - "description": "URL path to the first page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10" - }, - "prev": { - "type": "string", - "nullable": true, - "description": "URL path to the previous page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" - }, - "next": { - "type": "string", - "nullable": true, - "description": "URL path to the next page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" - }, - "last": { - "type": "string", - "nullable": true, - "description": "URL path to the last page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295" - } - }, - "required": ["prev", "next"] - } - }, - "required": ["data", "links"] + "$ref": "#/components/schemas/V2ListMembersResponse" } } } @@ -2117,9 +747,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["members_read"] } ], "summary": "List members of an organization", @@ -2131,6 +758,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -2156,6 +784,7 @@ "in": "path", "schema": { "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "type": "string" } } @@ -2165,49 +794,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "role": { - "type": "string", - "enum": ["owner", "administrator", "developer", "read-only"], - "description": "Role name to assign. Must be one of: owner, administrator, developer, read-only. Must be on a Team or Enterprise plan to use the read-only role.", - "example": "developer" - }, - "projects": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ref": { - "type": "string", - "description": "Project ref", - "example": "abcjuqabhgwjjutfvtpa" - } - }, - "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to assign a project-scoped role for. If omitted, assigns an org-wide role." - } - }, - "required": ["role"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2AssignOrganizationMemberRoleRequest" } } } @@ -2218,53 +805,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Role name. For project-scoped assignments this is the base role name.", - "example": "developer" - }, - "scope": { - "type": "string", - "enum": ["organization", "project"], - "description": "Whether this role applies org-wide or is scoped to specific projects for the user." - }, - "projects": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ref": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": ["ref", "name"] - }, - "description": "Project refs this role is scoped to. Empty array for org-level roles." - } - }, - "required": ["name", "scope", "projects"] - } - }, - "required": ["type", "attributes"] - } - }, - "required": ["data"] + "$ref": "#/components/schemas/OrganizationMemberRoleResponse" } } } @@ -2273,7 +814,14 @@ "description": "Unauthorized" }, "402": { - "description": "This feature requires the Enterprise organization plan." + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBodyV2" + } + } + } }, "403": { "description": "Forbidden action" @@ -2288,9 +836,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["organization_admin_write"] } ], "summary": "Assign or change an organization member role", @@ -2302,7 +847,8 @@ "position": "before" } ], - "x-endpoint-owners": ["management-api"] + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_admin_write"]] } }, "/v2/organizations/{slug}/roles": { @@ -2328,36 +874,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["organization_role"], - "description": "Resource type." - }, - "id": {}, - "attributes": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Role name.", - "example": "developer" - } - }, - "required": ["name"] - } - }, - "required": ["type", "attributes"] - } - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2ListRolesResponse" } } } @@ -2375,9 +892,6 @@ "security": [ { "bearer": [] - }, - { - "fga_permissions": ["members_read"] } ], "summary": "List roles of an organization", @@ -2389,6 +903,7 @@ } ], "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_read"]], "x-oauth-scope": "organizations:read" } }, @@ -2414,61 +929,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["organization_invitation"], - "description": "Resource type." - }, - "attributes": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "role": { - "type": "string", - "enum": ["owner", "administrator", "developer", "read-only"], - "description": "Role name to assign. Must be on a Team or Enterprise plan to use the read-only role.", - "example": "developer" - }, - "projects": { - "type": "array", - "items": { - "type": "object", - "properties": { - "ref": { - "type": "string", - "description": "Project ref", - "example": "abcjuqabhgwjjutfvtpa" - } - }, - "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to limit a user to. If omitted, user will have org-wide access with the provided role." - }, - "require_sso": { - "type": "boolean" - } - }, - "required": ["email", "role"] - } - }, - "required": ["type", "attributes"] - }, - "minItems": 1, - "maxItems": 50 - } - }, - "required": ["data"] + "$ref": "#/components/schemas/V2CreateInvitationsRequest" } } } @@ -2476,6 +937,767 @@ "responses": { "201": { "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2CreateInvitationsResponse" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBodyV2" + } + } + } + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "Creates organization invitations", + "tags": ["Organizations Members Invitations"], + "x-allowed-plans": ["Enterprise"], + "x-badges": [ + { + "name": "OAuth scope: organizations:write", + "position": "after" + }, + { + "name": "Only available on Enterprise", + "position": "before" + } + ], + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_write"]], + "x-oauth-scope": "organizations:write" + }, + "delete": { + "description": "Bulk delete member invitations for an organization by email address.", + "operationId": "v2-delete-organization-invitations", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2DeleteInvitationsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2DeleteInvitationsResponse" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "402": { + "description": "This feature requires the Enterprise organization plan.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanGateErrorBodyV2" + } + } + } + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "Deletes organization invitations by email", + "tags": ["Organizations Members Invitations"], + "x-allowed-plans": ["Enterprise"], + "x-badges": [ + { + "name": "OAuth scope: organizations:write", + "position": "after" + }, + { + "name": "Only available on Enterprise", + "position": "before" + } + ], + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["members_write"]], + "x-oauth-scope": "organizations:write" + } + }, + "/v2/organizations/{slug}/projects": { + "get": { + "description": "Returns a cursor-paginated list of projects for the specified organization, including their databases.\n\nUse `page[after]` and `page[before]` to navigate pages and `page[size]` to control the number of projects returned per page.", + "operationId": "v2-list-organization-projects", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "properties": { + "size": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "after": { + "type": "string", + "minLength": 1 + }, + "before": { + "type": "string", + "minLength": 1 + } + }, + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "sort", + "required": false, + "in": "query", + "description": "Sort order by creation time: `inserted_at` (oldest first) or `-inserted_at` (newest first). Defaults to `inserted_at`.", + "schema": { + "example": "-inserted_at", + "type": "string", + "enum": ["inserted_at", "-inserted_at"] + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "Case-insensitive substring match on the project name.", + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ListProjectsResponse" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "List projects of an organization", + "tags": ["Organizations"], + "x-badges": [ + { + "name": "OAuth scope: projects:read", + "position": "after" + } + ], + "x-endpoint-owners": ["management-api"], + "x-fga-permissions": [["organization_projects_read"]], + "x-oauth-scope": "projects:read" + } + }, + "/v2/organizations/{slug}/integrations/github/connections": { + "get": { + "description": "Returns a cursor-paginated list of the GitHub connections of the organization's projects.\n\nUse `page[after]` and `page[before]` to navigate pages and `page[size]` to control the page size.\nPaging walks the organization projects, so a page holds at most `page[size]` connections and can hold fewer (or none) when some of its projects are not connected.\nFollow `links.next` until it is `null` rather than stopping on a short page.\n\nUse `filter[project_ref]` to narrow the list down to a single project.", + "operationId": "v2-list-organization-github-connections", + "parameters": [ + { + "name": "slug", + "required": true, + "in": "path", + "description": "Organization slug", + "schema": { + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba", + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "properties": { + "size": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "after": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "before": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + } + }, + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "filter", + "required": false, + "in": "query", + "schema": { + "properties": { + "project_ref": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + } + }, + "type": "object" + }, + "style": "deepObject" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/V2ListGitHubConnectionsResponse" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden action" + }, + "429": { + "description": "Rate limit exceeded" + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "List GitHub connections of an organization", + "tags": ["Organizations"], + "x-badges": [ + { + "name": "OAuth scope: projects:read", + "position": "after" + } + ], + "x-endpoint-owners": ["management-api", "dev-workflows"], + "x-fga-permissions": [["organization_projects_read"]], + "x-oauth-scope": "projects:read" + } + }, + "/v2/projects/{ref}/webhooks/endpoints": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "query", + "name": "page[offset]", + "schema": { + "default": "0", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Offset for offset-based pagination.\n\nOffset should be dividable by `page[limit]` without a reminder (`offset % limit === 0`), otherwise it will cause weird behavior when used on a frontend." + }, + { + "in": "query", + "name": "page[limit]", + "schema": { + "default": "20", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Up to how many records to return." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Collection of endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the previous page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0" + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the next page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=20" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=30", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", "content": { "application/json": { "schema": { @@ -2488,16 +1710,21 @@ "type": "string" }, "code": { - "type": "string" + "type": "string", + "const": "unauthorized" }, "message": { - "type": "string" + "type": "string", + "const": "Unauthorized" }, "description": { "type": "string" }, "links": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": { "type": "object", "properties": { @@ -2518,6 +1745,9 @@ }, "meta": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {} } }, @@ -2526,70 +1756,1558 @@ }, "meta": { "type": "object", + "propertyNames": { + "type": "string" + }, "additionalProperties": {} }, "issues": { "type": "array", "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "code": { - "type": "string" - }, - "message": { - "type": "string" - }, - "description": { - "type": "string" - }, - "links": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "href": { - "type": "string" - }, - "rel": { - "type": "string" - }, - "title": { - "type": "string" - }, - "type": { - "type": "string" - }, - "describedby": { - "type": "string" - }, - "meta": { - "type": "object", - "additionalProperties": {} - } - }, - "required": ["href"] - } - }, - "meta": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - } - }, - "required": ["email"] - } - }, - "required": ["code", "message", "meta"] + "$ref": "#/components/schemas/APIErrorObject" } } }, "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List endpoints", + "description": "List all Webhook endpoints based on a project's ref or an organization's slug." + }, + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + } + ], + "tags": ["Project webhooks"], + "responses": { + "201": { + "description": "Created endpoint", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Create endpoint", + "description": "Create new endpoint configuration to subscribe to specific webhook events.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "default": true, + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + }, + "required": ["url", "event_types", "signing_secret"] + } }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Deleted endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "data": { "type": "array", "items": { @@ -2597,22 +3315,135 @@ "properties": { "type": { "type": "string", - "enum": ["organization_invitation"], + "const": "endpoint", "description": "Resource type." }, - "id": {}, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, "attributes": { "type": "object", "properties": { - "email": { + "id": { "type": "string", - "format": "email" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." } }, - "required": ["email"] + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] } }, - "required": ["type", "attributes"] + "required": ["type", "id", "attributes"] } } }, @@ -2621,42 +3452,18231 @@ } } }, - "401": { - "description": "Unauthorized" + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } }, - "402": { - "description": "This feature requires the Enterprise organization plan." + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } }, "403": { - "description": "Forbidden action" + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } }, "429": { - "description": "Rate limit exceeded" + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } } }, - "security": [ + "summary": "Delete all endpoints", + "description": "Delete all endpoints including all events and deliveries.\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ { - "bearer": [] + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" }, { - "fga_permissions": ["members_write"] + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." } ], - "summary": "Creates organization invitations", - "tags": ["Organizations Members Invitations"], - "x-allowed-plans": ["Enterprise"], - "x-badges": [ + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get endpoint", + "description": "Get details of a specific endpoint." + }, + "patch": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ { - "name": "OAuth scope: organizations:write", - "position": "after" + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" }, { - "name": "Only available on Enterprise", - "position": "before" + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." } ], - "x-endpoint-owners": ["management-api"], - "x-oauth-scope": "organizations:write" + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Updated endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Update endpoint", + "description": "Update endpoint's configuration.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + } + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Deleted endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete endpoint", + "description": "Delete the endpoint including all events and deliveries\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}/deliveries": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + }, + { + "in": "query", + "name": "page[before]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records before (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[after]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records after (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[size]", + "schema": { + "default": "20", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Up to how many records to return." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "List of deliveries", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { + "type": "null" + } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the previous page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the next page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List deliveries", + "description": "List all deliveries for a specific endpoint in descending order (newest first).\n\nDeliveries which has expired are no longer available and will not be listed." + } + }, + "/v2/projects/{ref}/webhooks/endpoints/{id}/test": { + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "201": { + "description": "Event published", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.disabled" + }, + "message": { + "type": "string", + "const": "Bad Request: Endpoint is disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "EndpointTestDisabled" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.wrong_event_type" + }, + "message": { + "type": "string", + "const": "Bad Request: Provided event type is not subscribed to by the endpoint" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "EndpointTestWrongEventType" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "EndpointTestDisabled": { + "value": { + "error": { + "code": "bad_request.endpoint.test.disabled", + "message": "Bad Request: Endpoint is disabled", + "description": "Endpoint is disabled, to send test event endpoint must first be enabled." + } + } + }, + "EndpointTestWrongEventType": { + "value": { + "error": { + "code": "bad_request.endpoint.test.wrong_event_type", + "message": "Bad Request: Provided event type is not subscribed to by the endpoint", + "description": "Only event types that the endpoint is subscribed to can be specified." + } + } + }, + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Send test event", + "description": "Publish a test event to verify the endpoint is working.\n\nWhich event type to use can be specified in the request body, otherwise\nit will use any matching type the endpoint is listening for.\n\nThe event will contain `is_test: true` in it's payload.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + } + }, + "required": ["type"] + } + }, + "required": ["type", "attributes"] + } + } + } + } + } + } + } + }, + "/v2/projects/{ref}/webhooks/deliveries/{id}": { + "get": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { + "type": "null" + } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + }, + "event": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + }, + "payload": { + "type": "object", + "properties": { + "organization_slug": { + "type": "string", + "pattern": "^[\\w-]+$", + "description": "Organization slug", + "example": "tsrqponmlkjihgfedcba" + }, + "project_ref": { + "anyOf": [ + { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + { + "type": "null" + } + ] + } + }, + "required": ["organization_slug", "project_ref"], + "additionalProperties": {}, + "description": "Final data sent to the consumer." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of event publication." + } + }, + "required": ["type", "payload", "timestamp"] + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp", + "event" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.delivery" + }, + "message": { + "type": "string", + "const": "Not Found: Delivery not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get delivery", + "description": "Get details of a specific delivery attempt." + } + }, + "/v2/projects/{ref}/webhooks/deliveries/{id}/retry": { + "post": { + "operationId": "allV2ProjectsByRefWebhooks", + "parameters": [ + { + "in": "path", + "name": "ref", + "schema": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "example": "abcdefghijklmnopqrst" + }, + "required": true, + "description": "Project ref" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Project webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.delivery" + }, + "message": { + "type": "string", + "const": "Not Found: Delivery not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Retry delivery", + "description": "Retry delivering the same event again.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "query", + "name": "page[offset]", + "schema": { + "default": "0", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Offset for offset-based pagination.\n\nOffset should be dividable by `page[limit]` without a reminder (`offset % limit === 0`), otherwise it will cause weird behavior when used on a frontend." + }, + { + "in": "query", + "name": "page[limit]", + "schema": { + "default": "20", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Up to how many records to return." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Collection of endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the previous page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=0" + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the next page.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=20" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organization/slug/webhooks/endpoints?page[limit]=10&page[offset]=30", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List endpoints", + "description": "List all Webhook endpoints based on a project's ref or an organization's slug." + }, + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + } + ], + "tags": ["Organization webhooks"], + "responses": { + "201": { + "description": "Created endpoint", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Create endpoint", + "description": "Create new endpoint configuration to subscribe to specific webhook events.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "default": true, + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + }, + "required": ["url", "event_types", "signing_secret"] + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Deleted endpoints", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete all endpoints", + "description": "Delete all endpoints including all events and deliveries.\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get endpoint", + "description": "Get details of a specific endpoint." + }, + "patch": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Updated endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Update endpoint", + "description": "Update endpoint's configuration.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "signing_secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "description": "Secret key to use when signing. All events will be signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification." + } + } + } + }, + "required": ["type", "attributes"] + } + }, + "required": ["data"] + } + } + } + } + }, + "delete": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Deleted endpoint details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "endpoint", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an endpoint (UUID v7)." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Publicly available URL where to send the events, must use a domain and be resolvable to a non-reserved IP address.", + "example": "https://mydomain.com/path/to/handler" + }, + "enabled": { + "type": "boolean", + "description": "Whether the endpoint is enabled or not - disabled endpoints won't emit any events." + }, + "description": { + "anyOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "null" + } + ], + "description": "Optional description for the endpoint." + }, + "event_types": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "*" + ], + "description": "Webhook event type." + } + }, + "required": ["type"] + }, + "description": "List of subscribed events for which to receive the webhook event.", + "example": [ + { + "type": "v1.project.paused" + } + ] + }, + "custom_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-zA-Z0-9-]+$" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "Additional request headers to pass when performing HTTP request location defined by `url`. Both keys and values must be strings and a valid HTTP headers.", + "example": { + "Authorization": "Bearer example_token" + } + }, + "created_by": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "ID of the user who created the endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of endpoint's creation." + } + }, + "required": [ + "id", + "url", + "enabled", + "description", + "event_types", + "created_by", + "created_at" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Delete endpoint", + "description": "Delete the endpoint including all events and deliveries\n\nAny in-flight webhooks will result in a no-op." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}/deliveries": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + }, + { + "in": "query", + "name": "page[before]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records before (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[after]", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "description": "Cursor in cursor-based pagination to return up to `page[size]` records after (exclusive) the entry specified by this query param." + }, + { + "in": "query", + "name": "page[size]", + "schema": { + "default": "20", + "type": "string", + "pattern": "^\\d+$" + }, + "description": "Up to how many records to return." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "List of deliveries", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { + "type": "null" + } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "description": "URL path to the first page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the previous page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "URL path to the next page.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + }, + "last": { + "description": "URL path to the last page if available.", + "example": "/v2/organizations/slug/webhooks/endpoints/{id}/deliveries?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "List deliveries", + "description": "List all deliveries for a specific endpoint in descending order (newest first).\n\nDeliveries which has expired are no longer available and will not be listed." + } + }, + "/v2/organizations/{slug}/webhooks/endpoints/{id}/test": { + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of an endpoint (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "201": { + "description": "Event published", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.disabled" + }, + "message": { + "type": "string", + "const": "Bad Request: Endpoint is disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "EndpointTestDisabled" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.endpoint.test.wrong_event_type" + }, + "message": { + "type": "string", + "const": "Bad Request: Provided event type is not subscribed to by the endpoint" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "EndpointTestWrongEventType" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "EndpointTestDisabled": { + "value": { + "error": { + "code": "bad_request.endpoint.test.disabled", + "message": "Bad Request: Endpoint is disabled", + "description": "Endpoint is disabled, to send test event endpoint must first be enabled." + } + } + }, + "EndpointTestWrongEventType": { + "value": { + "error": { + "code": "bad_request.endpoint.test.wrong_event_type", + "message": "Bad Request: Provided event type is not subscribed to by the endpoint", + "description": "Only event types that the endpoint is subscribed to can be specified." + } + } + }, + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "EndpointNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.endpoint" + }, + "message": { + "type": "string", + "const": "Not Found: Endpoint not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.endpoint", + "message": "Not Found: Endpoint not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Send test event", + "description": "Publish a test event to verify the endpoint is working.\n\nWhich event type to use can be specified in the request body, otherwise\nit will use any matching type the endpoint is listening for.\n\nThe event will contain `is_test: true` in it's payload.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "attributes": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + } + }, + "required": ["type"] + } + }, + "required": ["type", "attributes"] + } + } + } + } + } + } + } + }, + "/v2/organizations/{slug}/webhooks/deliveries/{id}": { + "get": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "delivery", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "attributes": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of a delivery (UUID v7)." + }, + "event_id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of the event, which triggered the delivery (UUID v7)." + }, + "status": { + "type": "string", + "enum": ["pending", "success", "failure", "skipped"], + "description": "Status of the delivery attempt." + }, + "response_code": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991, + "description": "HTTP status code of the response, `0` if unavailable." + }, + "response_headers": { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "description": "HTTP headers of the response, `{}` if unavailable." + }, + "response_body": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + }, + "description": "Parsed JSON representation of an HTTP body of the response, `{}` if unavailable." + }, + { + "type": "string", + "description": "String representation of an HTTP body of the response." + } + ] + }, + { + "type": "null" + } + ] + }, + "attempt_timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of the attempt." + }, + "event": { + "type": "object", + "properties": { + "type": { + "description": "Webhook event type.", + "type": "string", + "enum": [ + "v1.project.paused", + "v1.project.created", + "v1.project.restored", + "v1.project.transferred", + "v1.project.removed", + "v1.project.restarted", + "v1.project.status.changed", + "v1.project.backup.started", + "v1.project.branch.created", + "v1.project.branch.updated", + "v1.project.branch.removed", + "v1.organization.member.invitation.created", + "v1.organization.member.invitation.canceled", + "v1.organization.member.added", + "v1.organization.member.removed", + "v1.organization.member.role.assigned", + "v1.organization.member.role.removed", + "v1.organization.member.role.updated", + "v1.organization.billing.plan.upgraded", + "v1.organization.billing.plan.downgraded", + "project.v1.paused", + "project.v1.created", + "project.v1.restored", + "project.v1.transferred", + "project.v1.removed", + "project.v1.restarted", + "project.v1.status.changed", + "project.v1.backup.started", + "project.v1.branch.created", + "project.v1.branch.updated", + "project.v1.branch.removed", + "organization.v1.member.invitation.created", + "organization.v1.member.invitation.canceled", + "organization.v1.member.added", + "organization.v1.member.removed", + "organization.v1.member.role.assigned", + "organization.v1.member.role.removed", + "organization.v1.member.role.updated", + "organization.v1.billing.plan.upgraded", + "organization.v1.billing.plan.downgraded", + "project.v1.branch.deleted" + ] + }, + "payload": { + "type": "object", + "properties": { + "organization_slug": { + "type": "string", + "pattern": "^[\\w-]+$", + "description": "Organization slug", + "example": "tsrqponmlkjihgfedcba" + }, + "project_ref": { + "anyOf": [ + { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + { + "type": "null" + } + ] + } + }, + "required": ["organization_slug", "project_ref"], + "additionalProperties": {}, + "description": "Final data sent to the consumer." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "Timestamp of event publication." + } + }, + "required": ["type", "payload", "timestamp"] + } + }, + "required": [ + "id", + "event_id", + "status", + "response_code", + "response_headers", + "response_body", + "attempt_timestamp", + "event" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.delivery" + }, + "message": { + "type": "string", + "const": "Not Found: Delivery not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Get delivery", + "description": "Get details of a specific delivery attempt." + } + }, + "/v2/organizations/{slug}/webhooks/deliveries/{id}/retry": { + "post": { + "operationId": "allV2OrganizationsBySlugWebhooks", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$", + "example": "tsrqponmlkjihgfedcba" + }, + "required": true, + "description": "Organization slug" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" + }, + "required": true, + "description": "Identifier of a delivery (UUID v7)." + } + ], + "tags": ["Organization webhooks"], + "responses": { + "200": { + "description": "Delivery details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "event", + "description": "Resource type." + }, + "id": { + "type": "string", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "description": "Identifier of an event (UUID v7)." + } + }, + "required": ["type", "id"] + } + }, + "required": ["data"] + } + } + } + }, + "400": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_slug" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid organization slug" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidSlug" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "bad_request.invalid_ref" + }, + "message": { + "type": "string", + "const": "Bad Request: Invalid project ref" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "InvalidRef" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "InvalidSlug": { + "value": { + "error": { + "code": "bad_request.invalid_slug", + "message": "Bad Request: Invalid organization slug" + } + } + }, + "InvalidRef": { + "value": { + "error": { + "code": "bad_request.invalid_ref", + "message": "Bad Request: Invalid project ref" + } + } + } + } + } + } + }, + "401": { + "description": "GenericUnauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "unauthorized" + }, + "message": { + "type": "string", + "const": "Unauthorized" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "unauthorized", + "message": "Unauthorized" + } + } + } + } + } + } + }, + "403": { + "description": "Multiple error responses", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.permission_denied" + }, + "message": { + "type": "string", + "const": "Forbidden: Permission denied" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "PermissionDenied" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "forbidden.access_disabled" + }, + "message": { + "type": "string", + "const": "Forbidden: Access disabled" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"], + "title": "AccessDisabled" + } + ] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "PermissionDenied": { + "value": { + "error": { + "code": "forbidden.permission_denied", + "message": "Forbidden: Permission denied" + } + } + }, + "AccessDisabled": { + "value": { + "error": { + "code": "forbidden.access_disabled", + "message": "Forbidden: Access disabled" + } + } + } + } + } + } + }, + "404": { + "description": "DeliveryNotFound", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "not_found.delivery" + }, + "message": { + "type": "string", + "const": "Not Found: Delivery not found" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "not_found.delivery", + "message": "Not Found: Delivery not found" + } + } + } + } + } + } + }, + "408": { + "description": "GenericRequestTimeout", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "request_timeout" + }, + "message": { + "type": "string", + "const": "Request Timeout" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "request_timeout", + "message": "Request Timeout" + } + } + } + } + } + } + }, + "429": { + "description": "GenericTooManyRequests", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "too_many_requests" + }, + "message": { + "type": "string", + "const": "Too Many Requests" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "too_many_requests", + "message": "Too Many Requests" + } + } + } + } + } + } + }, + "500": { + "description": "GenericInternalServerError", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string", + "const": "internal_server_error" + }, + "message": { + "type": "string", + "const": "Internal Server Error" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] + } + }, + "required": ["error"], + "$defs": { + "APIErrorObject": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "examples": { + "Default example": { + "value": { + "error": { + "code": "internal_server_error", + "message": "Internal Server Error" + } + } + } + } + } + } + } + }, + "summary": "Retry delivery", + "description": "Retry delivering the same event again.\n\nThis endpoint is heavy rate-limited to allow for 10 request within 60 seconds." } } }, @@ -2679,8 +21699,8 @@ "properties": { "type": { "type": "string", - "enum": ["log_drain"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["log_drain"] }, "id": { "type": "string" @@ -2695,7 +21715,7 @@ "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -2895,8 +21915,8 @@ "properties": { "type": { "type": "string", - "enum": ["log_drain"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["log_drain"] }, "attributes": { "type": "object", @@ -2908,7 +21928,7 @@ "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -3107,8 +22127,8 @@ "properties": { "type": { "type": "string", - "enum": ["log_drain"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["log_drain"] }, "id": { "type": "string" @@ -3123,7 +22143,7 @@ "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -3314,6 +22334,27 @@ }, "required": ["data"] }, + "PlanGateErrorBodyV2": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "HTTP status-derived error code, e.g. \"payment_required\"" + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the plan gate" + } + }, + "required": ["code", "message"], + "description": "Plan-gate error object" + } + }, + "required": ["error"] + }, "UpdateLogDrainRequestOpenApi": { "type": "object", "properties": { @@ -3322,8 +22363,8 @@ "properties": { "type": { "type": "string", - "enum": ["log_drain"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["log_drain"] }, "attributes": { "type": "object", @@ -3335,7 +22376,7 @@ "type": "string" }, "config": { - "oneOf": [ + "anyOf": [ { "type": "object", "properties": { @@ -3534,8 +22575,8 @@ "properties": { "type": { "type": "string", - "enum": ["project_transfer_input"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["project_transfer_input"] }, "attributes": { "type": "object", @@ -3560,8 +22601,8 @@ "properties": { "type": { "type": "string", - "enum": ["project_transfer_result"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["project_transfer_result"] }, "attributes": { "type": "object", @@ -3633,8 +22674,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "id": { "type": "string" @@ -3650,8 +22691,8 @@ "description": "The AWS account ID this PrivateLink share is associated with." }, "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." + "description": "Human-readable name for the AWS account.", + "type": "string" }, "status": { "type": "string", @@ -3668,11 +22709,27 @@ "shared_at": { "type": "string", "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending.", + "nullable": true + }, + "database_type": { + "type": "string", + "enum": ["PRIMARY", "READ_REPLICA"], + "description": "Whether this PrivateLink share targets the primary database or a read replica." + }, + "database_identifier": { + "type": "string", + "description": "Identifier of the database this PrivateLink share targets - the project ref for the primary, or the read replica identifier." } }, - "required": ["aws_account_id", "status", "shared_at"] + "required": [ + "aws_account_id", + "status", + "shared_at", + "database_type", + "database_identifier" + ] } }, "required": ["type", "id", "attributes"] @@ -3689,8 +22746,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "attributes": { "type": "object", @@ -3703,9 +22760,13 @@ "description": "The AWS account ID to add to the project PrivateLink share." }, "account_name": { + "description": "Optional human-readable name for the AWS account.", "type": "string", - "maxLength": 128, - "description": "Optional human-readable name for the AWS account." + "maxLength": 128 + }, + "database_identifier": { + "description": "Identifier of the read replica this PrivateLink share should target. Omit to target the primary database.", + "type": "string" } }, "required": ["aws_account_id"] @@ -3724,8 +22785,8 @@ "properties": { "type": { "type": "string", - "enum": ["private_link_association"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["private_link_association"] }, "id": { "type": "string" @@ -3741,8 +22802,8 @@ "description": "The AWS account ID this PrivateLink share is associated with." }, "account_name": { - "type": "string", - "description": "Human-readable name for the AWS account." + "description": "Human-readable name for the AWS account.", + "type": "string" }, "status": { "type": "string", @@ -3759,11 +22820,27 @@ "shared_at": { "type": "string", "format": "date-time", - "nullable": true, - "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending." + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "description": "The time and date at which the AWS Resource Share Association was requested from Supabase. `null` means that the association was not yet requested while the PrivateLink Association is pending.", + "nullable": true + }, + "database_type": { + "type": "string", + "enum": ["PRIMARY", "READ_REPLICA"], + "description": "Whether this PrivateLink share targets the primary database or a read replica." + }, + "database_identifier": { + "type": "string", + "description": "Identifier of the database this PrivateLink share targets - the project ref for the primary, or the read replica identifier." } }, - "required": ["aws_account_id", "status", "shared_at"] + "required": [ + "aws_account_id", + "status", + "shared_at", + "database_type", + "database_identifier" + ] } }, "required": ["type", "id", "attributes"] @@ -3781,25 +22858,26 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member"] }, "id": { "type": "string", - "format": "uuid" + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$" }, "attributes": { "type": "object", "properties": { "username": { "type": "string", - "nullable": true, - "description": "Member's username" + "description": "Member's username", + "nullable": true }, "primary_email": { "type": "string", - "nullable": true, - "description": "Member's primary email" + "description": "Member's primary email", + "nullable": true }, "mfa_enabled": { "type": "boolean", @@ -3811,8 +22889,8 @@ }, "avatar_url": { "type": "string", - "nullable": true, - "description": "Member's avatar URL" + "description": "Member's avatar URL", + "nullable": true }, "roles": { "type": "array", @@ -3869,27 +22947,27 @@ "properties": { "first": { "type": "string", - "nullable": true, "description": "URL path to the first page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10" + "example": "/v2/organizations/my-org/members?page[size]=10", + "nullable": true }, "prev": { "type": "string", - "nullable": true, "description": "URL path to the previous page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7" + "example": "/v2/organizations/my-org/members?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true }, "next": { "type": "string", - "nullable": true, "description": "URL path to the next page.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4" + "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true }, "last": { "type": "string", - "nullable": true, "description": "URL path to the last page if available.", - "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295" + "example": "/v2/organizations/my-org/members?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true } }, "required": ["prev", "next"] @@ -3905,8 +22983,8 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member_role"] }, "attributes": { "type": "object", @@ -3918,6 +22996,8 @@ "example": "developer" }, "projects": { + "description": "The projects to assign a project-scoped role for. If omitted, assigns an org-wide role.", + "minItems": 1, "type": "array", "items": { "type": "object", @@ -3929,9 +23009,7 @@ } }, "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to assign a project-scoped role for. If omitted, assigns an org-wide role." + } } }, "required": ["role"] @@ -3950,8 +23028,8 @@ "properties": { "type": { "type": "string", - "enum": ["organization_member_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_member_role"] }, "attributes": { "type": "object", @@ -4001,10 +23079,9 @@ "properties": { "type": { "type": "string", - "enum": ["organization_role"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_role"] }, - "id": {}, "attributes": { "type": "object", "properties": { @@ -4027,21 +23104,24 @@ "type": "object", "properties": { "data": { + "minItems": 1, + "maxItems": 50, "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["organization_invitation"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_invitation"] }, "attributes": { "type": "object", "properties": { "email": { "type": "string", - "format": "email" + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "role": { "type": "string", @@ -4050,6 +23130,8 @@ "example": "developer" }, "projects": { + "description": "The projects to limit a user to. If omitted, user will have org-wide access with the provided role.", + "minItems": 1, "type": "array", "items": { "type": "object", @@ -4061,9 +23143,7 @@ } }, "required": ["ref"] - }, - "minItems": 1, - "description": "The projects to limit a user to. If omitted, user will have org-wide access with the provided role." + } }, "require_sso": { "type": "boolean" @@ -4073,9 +23153,7 @@ } }, "required": ["type", "attributes"] - }, - "minItems": 1, - "maxItems": 50 + } } }, "required": ["data"] @@ -4180,7 +23258,8 @@ "properties": { "email": { "type": "string", - "format": "email" + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" } }, "required": ["email"] @@ -4199,16 +23278,16 @@ "properties": { "type": { "type": "string", - "enum": ["organization_invitation"], - "description": "Resource type." + "description": "Resource type.", + "enum": ["organization_invitation"] }, - "id": {}, "attributes": { "type": "object", "properties": { "email": { "type": "string", - "format": "email" + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" } }, "required": ["email"] @@ -4219,6 +23298,474 @@ } }, "required": ["data"] + }, + "V2DeleteInvitationsRequest": { + "type": "object", + "properties": { + "data": { + "minItems": 1, + "maxItems": 100, + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["organization_invitation"] + }, + "attributes": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, + "required": ["email"] + } + }, + "required": ["type", "attributes"] + } + } + }, + "required": ["data"] + }, + "V2DeleteInvitationsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["organization_invitation"] + }, + "attributes": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + } + }, + "required": ["email"] + } + }, + "required": ["type", "attributes"] + } + } + }, + "required": ["data"] + }, + "V2ListProjectsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["project"] + }, + "id": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "attributes": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Project name" + }, + "status": { + "type": "string", + "enum": [ + "INACTIVE", + "ACTIVE_HEALTHY", + "ACTIVE_UNHEALTHY", + "COMING_UP", + "UNKNOWN", + "GOING_DOWN", + "INIT_FAILED", + "REMOVED", + "RESTORING", + "UPGRADING", + "PAUSING", + "RESTORE_FAILED", + "RESTARTING", + "PAUSE_FAILED", + "RESIZING" + ], + "description": "Project status" + }, + "cloud_provider": { + "type": "string", + "description": "Cloud provider hosting the project" + }, + "region": { + "type": "string", + "description": "Region the project is hosted in" + }, + "inserted_at": { + "type": "string", + "description": "When the project was created" + }, + "databases": { + "type": "array", + "items": { + "type": "object", + "properties": { + "cloud_provider": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "region": { + "type": "string", + "nullable": true + }, + "status": { + "type": "string", + "enum": [ + "ACTIVE_HEALTHY", + "ACTIVE_UNHEALTHY", + "COMING_UP", + "GOING_DOWN", + "INIT_FAILED", + "REMOVED", + "RESTORING", + "UNKNOWN", + "INIT_READ_REPLICA", + "INIT_READ_REPLICA_FAILED", + "RESTARTING", + "RESIZING" + ] + }, + "type": { + "type": "string", + "enum": ["PRIMARY", "READ_REPLICA"] + }, + "infra_compute_size": { + "type": "string", + "enum": [ + "pico", + "nano", + "micro", + "small", + "medium", + "large", + "xlarge", + "2xlarge", + "4xlarge", + "8xlarge", + "12xlarge", + "16xlarge", + "24xlarge", + "24xlarge_optimized_memory", + "24xlarge_optimized_cpu", + "24xlarge_high_memory", + "48xlarge", + "48xlarge_optimized_memory", + "48xlarge_optimized_cpu", + "48xlarge_high_memory" + ] + }, + "disk_volume_size_gb": { + "type": "number" + }, + "disk_type": { + "type": "string", + "enum": ["gp3", "io2"] + }, + "disk_throughput_mbps": { + "type": "number" + }, + "disk_last_modified_at": { + "type": "string" + } + }, + "required": ["cloud_provider", "identifier", "region", "status", "type"] + }, + "description": "The project's databases including compute and disk attributes." + } + }, + "required": [ + "name", + "status", + "cloud_provider", + "region", + "inserted_at", + "databases" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": "string", + "description": "URL path to the first page if available.", + "example": "/v2/organizations/my-org/projects?page[size]=10", + "nullable": true + }, + "prev": { + "type": "string", + "description": "URL path to the previous page.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true + }, + "next": { + "type": "string", + "description": "URL path to the next page.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true + }, + "last": { + "type": "string", + "description": "URL path to the last page if available.", + "example": "/v2/organizations/my-org/projects?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + }, + "V2ListGitHubConnectionsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Resource type.", + "enum": ["github_connection"] + }, + "id": { + "type": "string", + "description": "Connection id.", + "example": "7" + }, + "attributes": { + "type": "object", + "properties": { + "inserted_at": { + "type": "string", + "description": "When the connection was created" + }, + "updated_at": { + "type": "string", + "description": "When the connection was last updated" + }, + "installation_id": { + "type": "number", + "description": "GitHub App installation id" + }, + "workdir": { + "type": "string", + "description": "Directory within the repository the project lives in" + }, + "supabase_changes_only": { + "type": "boolean", + "description": "Whether branches are only created for changes under `supabase/`" + }, + "branch_limit": { + "type": "number", + "description": "Maximum number of preview branches" + }, + "new_branch_per_pr": { + "type": "boolean", + "description": "Whether a preview branch is created for every pull request" + }, + "project": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "ref": { + "type": "string", + "minLength": 20, + "maxLength": 20, + "pattern": "^[a-z]+$", + "description": "Project ref", + "example": "abcdefghijklmnopqrst" + }, + "name": { + "type": "string" + } + }, + "required": ["id", "ref", "name"], + "description": "The connected Supabase project" + }, + "repository": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": ["id", "name"], + "description": "The connected GitHub repository" + }, + "user": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "username": { + "type": "string" + }, + "primary_email": { + "type": "string", + "nullable": true + } + }, + "required": ["id", "username", "primary_email"], + "description": "The user who created the connection, if still known", + "nullable": true + } + }, + "required": [ + "inserted_at", + "updated_at", + "installation_id", + "workdir", + "supabase_changes_only", + "branch_limit", + "new_branch_per_pr", + "project", + "repository", + "user" + ] + } + }, + "required": ["type", "id", "attributes"] + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": "string", + "description": "URL path to the first page if available.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10", + "nullable": true + }, + "prev": { + "type": "string", + "description": "URL path to the previous page.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[before]=019adf7d-4513-74c5-bb9a-f1bc0f7a95d7", + "nullable": true + }, + "next": { + "type": "string", + "description": "URL path to the next page.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[after]=019adf7d-4513-7062-b292-78b86cc470a4", + "nullable": true + }, + "last": { + "type": "string", + "description": "URL path to the last page if available.", + "example": "/v2/organizations/my-org/integrations/github/connections?page[size]=10&page[after]=019adf7d-4513-71ba-b264-21900edb4295", + "nullable": true + } + }, + "required": ["prev", "next"] + } + }, + "required": ["data", "links"] + }, + "APIErrorObject": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "description": { + "type": "string" + }, + "links": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "describedby": { + "type": "string" + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["href"] + } + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIErrorObject" + } + } + }, + "required": ["code", "message"] } } }