diff --git a/AGENTS.md b/AGENTS.md index fbeb8e204..645ce37c3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,6 +60,64 @@ The shortest way to spot a missing step: TypeScript compile errors in `web/src/` that say "Module ... has no exported member ...". That means the SDK is stale. +## Never overwrite `apps/temps-cli/openapi.json` with the raw server response + +The CLI's SDK is generated from a **committed** copy of the spec at +`apps/temps-cli/openapi.json`. That file is ~92,000 lines of formatted +JSON; the server serves the same document minified on one line, with +keys in whatever order serde produced. + +So `curl .../openapi.json > apps/temps-cli/openapi.json` turns a +92,000-line file into a 1-line file, and the pull request reports +**-92,000 deletions** — burying the actual change and making the diff +unreviewable. Pretty-printing alone is not enough either: key order is +not stable between builds, so an unsorted dump reorders huge blocks for +no reason. + +Use the script, which fetches, sorts keys recursively, indents by two +and keeps the trailing newline: + +```bash +cd apps/temps-cli +TEMPS_API_KEY=tk_... bun run spec:update --url http://localhost:8080/api/api-docs/openapi.json +bun run generate:api # regenerate the client from the file +bun run scripts/generate-docs.ts --output docs/CLI.md +bun run scripts/generate-docs.ts --format mdx --output docs/CLI.mdx +``` + +Sanity check before committing — a few new endpoints should be a few +hundred changed lines, never tens of thousands: + +```bash +git diff --numstat -- apps/temps-cli/openapi.json +``` + +`web/src/api/client/` has no committed spec; it is generated straight +from the live server by `bun run openapi-ts` (see above), so it does not +have this failure mode. + +## Resolving merge conflicts in generated clients + +Conflicts in `web/src/api/client/**`, `apps/temps-cli/src/api/**` or +`apps/temps-cli/openapi.json` are conflicts in **build output**. Do not +hand-merge them, and do not hand-pick hunks — the result is a client +that matches neither side's spec. + +Take either side to clear the conflict, then regenerate from a server +built off the merged source: + +```bash +git checkout --ours -- web/src/api/client apps/temps-cli/src/api apps/temps-cli/openapi.json +git add web/src/api/client apps/temps-cli/src/api apps/temps-cli/openapi.json +# build + start the merged server, then: +cd apps/temps-cli && bun run spec:update --url /api/api-docs/openapi.json && bun run generate:api +cd ../../web && bun run openapi-ts +``` + +Then `bun run typecheck` (or `npx tsc --noEmit`) in both `web/` and +`apps/temps-cli/`. A clean typecheck is what proves the regenerated +client still satisfies every caller on both sides of the merge. + ## Scope Docker usage on shared hosts This host may already be running a live Temps instance or other diff --git a/CLAUDE.md b/CLAUDE.md index 5820aa12f..5675d0194 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,6 +21,7 @@ Guidance for Claude Code when working with the Temps codebase. - Leave the project in non-compilable state - Use `#[tokio::main]` when integrating with pingora - Use plain text logging -- ALWAYS use structured JSONL logging +- Overwrite `apps/temps-cli/openapi.json` with the raw server response (`curl ... > openapi.json`) -- the committed file is ~92,000 lines of sorted, indented JSON and the server serves it minified on one line, so a direct write reports **-92,000 deletions** and buries the real change. ALWAYS use `cd apps/temps-cli && bun run spec:update` (see [Regenerating the OpenAPI clients](#regenerating-the-openapi-clients)) - Create markdown documentation files unless explicitly requested - Mark Docker tests with `#[ignore]` -- they MUST skip gracefully at runtime instead - Create error types with generic messages -- ALWAYS include IDs, names, and operation context @@ -731,6 +732,36 @@ async fn create_backup( - Convert entities to response DTOs via `From` trait - Register all handlers in `ApiDoc` with `#[openapi(...)]` +### Regenerating the OpenAPI clients + +Two generated clients consume the spec, and they are refreshed differently: + +| Client | Source of truth | Refresh with | +|---|---|---| +| `web/src/api/client/` | the **live server** | `cd web && bun run openapi-ts` | +| `apps/temps-cli/src/api/` | the **committed** `apps/temps-cli/openapi.json` | `cd apps/temps-cli && bun run spec:update && bun run generate:api` | + +After any change to handlers, request/response shapes, schemas or routes: +restart `temps serve`, then refresh both. Commit the regenerated files -- +they are tracked so reviewers see the API delta. + +`apps/temps-cli/openapi.json` must stay in its canonical shape: **keys sorted +recursively, two-space indent, trailing newline**. `bun run spec:update` is the +only supported way to write it. Sorting is what keeps a diff proportional to +the API change instead of to serde's iteration order, which is not stable +between builds. + +Verify before committing -- adding a few endpoints is a few hundred changed +lines, never tens of thousands: + +```bash +git diff --numstat -- apps/temps-cli/openapi.json +``` + +Merge conflicts in either client are conflicts in build output. Never +hand-merge them: take one side to clear the conflict, then regenerate from a +server built off the merged source and typecheck both packages. + ### Permission System ```rust diff --git a/apps/temps-cli/docs/CLI.md b/apps/temps-cli/docs/CLI.md index 251c617f1..58fd71b47 100644 --- a/apps/temps-cli/docs/CLI.md +++ b/apps/temps-cli/docs/CLI.md @@ -2,7 +2,7 @@ > Auto-generated documentation for the Temps CLI. > -> Generated on: 2026-08-04 +> Generated on: 2026-08-07 ## Installation @@ -235,6 +235,20 @@ Delete a project | `-f, --force` | Skip confirmation | - | No | | `-y, --yes` | Skip confirmation (alias for --force) | - | No | +## `drop` + +Detect and deploy a local source directory or ZIP without Git + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--name ` | Project name (slugified automatically) | - | Yes | +| `--preset ` | Select a detected preset | - | Yes | +| `--directory ` | Select a detected project root | - | Yes | +| `--no-wait` | Do not wait for deployment to complete | - | No | +| `--timeout ` | Deployment timeout | `600` | Yes | + ## `deploy` Deploy a project from git @@ -695,7 +709,7 @@ Set an environment variable | `-e, --environments ` | Comma-separated environment names (interactive if not provided) | - | Yes | | `--no-preview` | Exclude from preview environments | - | No | | `--update` | Update existing variable instead of creating new | - | No | -| `--secret` | Store as a secret: the value is masked in the UI and never returned by the API. One-way — a secret cannot later be made non-secret | - | No | +| `--secret` | Store as a secret: the value is masked in the UI and never returned by the API. One-way — to make a secret readable again you must delete the variable and create it anew | - | No | #### `environments vars delete` (alias: `rm`, `unset`) @@ -1973,6 +1987,99 @@ Set the preview domain pattern |------|-------------|---------|----------| | `--domain ` | Preview domain pattern | - | Yes | +## `platform` (alias: `plat`) + +View platform and server information + +**Subcommands:** + +- `info` - Get platform information +- `access` - Get access and networking information +- `private-ip` - Get the server private IP address +- `public-ip` - Get the server public IP address +- `update` - Check for and apply temps releases on the server + +### `platform info` + +Get platform information + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +### `platform access` + +Get access and networking information + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +### `platform private-ip` + +Get the server private IP address + +### `platform public-ip` + +Get the server public IP address + +### `platform update` + +Check for and apply temps releases on the server + +**Subcommands:** + +- `status` - Show the available release and whether it can be applied from here +- `check` - Ask the release API for the newest version on this channel now +- `channel` - Show or set the release channel: stable, beta, nightly, or "auto" to follow the installed version +- `apply` - Install a release on the server and restart it + +#### `platform update status` + +Show the available release and whether it can be applied from here + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update check` + +Ask the release API for the newest version on this channel now + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update channel` + +Show or set the release channel: stable, beta, nightly, or "auto" to follow the installed version + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update apply` + +Install a release on the server and restart it + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--version ` | Release tag to install (default: newest on this channel) | - | Yes | +| `-y, --yes` | Skip the confirmation prompt | - | No | +| `--json` | Output in JSON format | - | No | + ## `users` Manage platform users diff --git a/apps/temps-cli/docs/CLI.mdx b/apps/temps-cli/docs/CLI.mdx index be787e998..2e8e8b1f6 100644 --- a/apps/temps-cli/docs/CLI.mdx +++ b/apps/temps-cli/docs/CLI.mdx @@ -7,7 +7,7 @@ export const metadata = { > Auto-generated documentation for the Temps CLI. > -> Generated on: 2026-08-04 +> Generated on: 2026-08-07 ## Installation @@ -240,6 +240,20 @@ Delete a project | `-f, --force` | Skip confirmation | - | No | | `-y, --yes` | Skip confirmation (alias for --force) | - | No | +## `drop` + +Detect and deploy a local source directory or ZIP without Git + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--name ` | Project name (slugified automatically) | - | Yes | +| `--preset ` | Select a detected preset | - | Yes | +| `--directory ` | Select a detected project root | - | Yes | +| `--no-wait` | Do not wait for deployment to complete | - | No | +| `--timeout ` | Deployment timeout | `600` | Yes | + ## `deploy` Deploy a project from git @@ -700,7 +714,7 @@ Set an environment variable | `-e, --environments ` | Comma-separated environment names (interactive if not provided) | - | Yes | | `--no-preview` | Exclude from preview environments | - | No | | `--update` | Update existing variable instead of creating new | - | No | -| `--secret` | Store as a secret: the value is masked in the UI and never returned by the API. One-way — a secret cannot later be made non-secret | - | No | +| `--secret` | Store as a secret: the value is masked in the UI and never returned by the API. One-way — to make a secret readable again you must delete the variable and create it anew | - | No | #### `environments vars delete` (alias: `rm`, `unset`) @@ -1978,6 +1992,99 @@ Set the preview domain pattern |------|-------------|---------|----------| | `--domain ` | Preview domain pattern | - | Yes | +## `platform` (alias: `plat`) + +View platform and server information + +**Subcommands:** + +- `info` - Get platform information +- `access` - Get access and networking information +- `private-ip` - Get the server private IP address +- `public-ip` - Get the server public IP address +- `update` - Check for and apply temps releases on the server + +### `platform info` + +Get platform information + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +### `platform access` + +Get access and networking information + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +### `platform private-ip` + +Get the server private IP address + +### `platform public-ip` + +Get the server public IP address + +### `platform update` + +Check for and apply temps releases on the server + +**Subcommands:** + +- `status` - Show the available release and whether it can be applied from here +- `check` - Ask the release API for the newest version on this channel now +- `channel` - Show or set the release channel: stable, beta, nightly, or "auto" to follow the installed version +- `apply` - Install a release on the server and restart it + +#### `platform update status` + +Show the available release and whether it can be applied from here + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update check` + +Ask the release API for the newest version on this channel now + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update channel` + +Show or set the release channel: stable, beta, nightly, or "auto" to follow the installed version + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--json` | Output in JSON format | - | No | + +#### `platform update apply` + +Install a release on the server and restart it + +**Options:** + +| Flag | Description | Default | Required | +|------|-------------|---------|----------| +| `--version ` | Release tag to install (default: newest on this channel) | - | Yes | +| `-y, --yes` | Skip the confirmation prompt | - | No | +| `--json` | Output in JSON format | - | No | + ## `users` Manage platform users diff --git a/apps/temps-cli/openapi.json b/apps/temps-cli/openapi.json index e6bcca25c..0f0cc9519 100644 --- a/apps/temps-cli/openapi.json +++ b/apps/temps-cli/openapi.json @@ -2,17 +2,6 @@ "components": { "schemas": { "AcmeOrderResponse": { - "type": "object", - "required": [ - "id", - "order_url", - "domain_id", - "email", - "status", - "identifiers", - "created_at", - "updated_at" - ], "properties": { "authorizations": {}, "certificate_url": { @@ -33,12 +22,12 @@ ] }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "domain_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "email": { "type": "string" @@ -56,11 +45,11 @@ ] }, "expires_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "finalize_url": { "type": [ @@ -69,8 +58,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "identifiers": {}, "order_url": { @@ -80,33 +69,34 @@ "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ActivateProviderResponse": { - "type": "object", + }, "required": [ - "default_provider" + "id", + "order_url", + "domain_id", + "email", + "status", + "identifiers", + "created_at", + "updated_at" ], + "type": "object" + }, + "ActivateProviderResponse": { "properties": { "default_provider": { "type": "string" } - } - }, - "ActiveVisitor": { - "type": "object", + }, "required": [ - "session_id", - "session_start", - "last_activity", - "page_count", - "event_count", - "duration_seconds", - "is_active" + "default_provider" ], + "type": "object" + }, + "ActiveVisitor": { "properties": { "current_page": { "type": [ @@ -115,12 +105,12 @@ ] }, "duration_seconds": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "event_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -129,8 +119,8 @@ "type": "string" }, "page_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "session_id": { "type": "string" @@ -144,293 +134,298 @@ "null" ] } - } + }, + "required": [ + "session_id", + "session_start", + "last_activity", + "page_count", + "event_count", + "duration_seconds", + "is_active" + ], + "type": "object" }, "ActiveVisitorsQuery": { - "type": "object", "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "ActiveVisitorsResponse": { - "type": "object", - "required": [ - "active_visitors", - "window_minutes" - ], "properties": { "active_visitors": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "window_minutes": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "active_visitors", + "window_minutes" + ], + "type": "object" }, "ActivityDay": { - "type": "object", "description": "Daily activity count for a single day", - "required": [ - "date", - "count", - "level" - ], "properties": { "count": { - "type": "integer", + "description": "Number of deployments on this day", "format": "int64", - "description": "Number of deployments on this day" + "type": "integer" }, "date": { - "type": "string", "description": "Date in YYYY-MM-DD format", - "example": "2024-06-15" + "example": "2024-06-15", + "type": "string" }, "level": { - "type": "integer", - "format": "int32", "description": "Intensity level (0-4) for visualization\n0: No activity, 1: Low (1-2), 2: Medium (3-5), 3: High (6-10), 4: Very High (11+)", - "example": 2 + "example": 2, + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "date", + "count", + "level" + ], + "type": "object" }, "ActivityEvent": { - "type": "object", "description": "A single activity event for the real-time activity feed", - "required": [ - "id", - "timestamp", - "event_type", - "page_path", - "is_crawler" - ], "properties": { "browser": { + "description": "Browser", "type": [ "string", "null" - ], - "description": "Browser" + ] }, "city": { + "description": "Visitor's city (from ip_geolocations)", "type": [ "string", "null" - ], - "description": "Visitor's city (from ip_geolocations)" + ] }, "country": { + "description": "Visitor's country (from ip_geolocations)", "type": [ "string", "null" - ], - "description": "Visitor's country (from ip_geolocations)" + ] }, "country_code": { + "description": "Visitor's country code (from ip_geolocations)", "type": [ "string", "null" - ], - "description": "Visitor's country code (from ip_geolocations)" + ] }, "device_type": { + "description": "Device type", "type": [ "string", "null" - ], - "description": "Device type" + ] }, "event_name": { + "description": "Event name (for custom events)", "type": [ "string", "null" - ], - "description": "Event name (for custom events)" + ] }, "event_type": { - "type": "string", - "description": "Event type: \"page_view\", \"custom\", etc." + "description": "Event type: \"page_view\", \"custom\", etc.", + "type": "string" }, "id": { - "type": "integer", + "description": "Event ID", "format": "int64", - "description": "Event ID" + "type": "integer" }, "is_crawler": { - "type": "boolean", - "description": "Whether this event was from a crawler" + "description": "Whether this event was from a crawler", + "type": "boolean" }, "latitude": { + "description": "Latitude", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Latitude" + ] }, "longitude": { + "description": "Longitude", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Longitude" + ] }, "operating_system": { + "description": "Operating system", "type": [ "string", "null" - ], - "description": "Operating system" + ] }, "page_path": { - "type": "string", - "description": "Page path where the event happened" + "description": "Page path where the event happened", + "type": "string" }, "page_title": { + "description": "Page title", "type": [ "string", "null" - ], - "description": "Page title" + ] }, "referrer": { + "description": "Referrer", "type": [ "string", "null" - ], - "description": "Referrer" + ] }, "timestamp": { - "type": "string", + "description": "When the event occurred", "format": "date-time", - "description": "When the event occurred" + "type": "string" }, "visitor_id": { + "description": "Visitor numeric ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Visitor numeric ID" + ] } - } + }, + "required": [ + "id", + "timestamp", + "event_type", + "page_path", + "is_crawler" + ], + "type": "object" }, "ActivityGraphQuery": { - "type": "object", "description": "Query parameters for activity graph endpoint", "properties": { "days": { - "type": "integer", + "description": "Number of days to include (default: 365 for last year)", "format": "int32", - "description": "Number of days to include (default: 365 for last year)" + "type": "integer" }, "environment_id": { + "description": "Optional environment ID to filter activity", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment ID to filter activity" + ] }, "project_id": { + "description": "Optional project ID to filter activity", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional project ID to filter activity" + ] } - } + }, + "type": "object" }, "ActivityGraphResponse": { - "type": "object", "description": "Response for activity graph showing daily deployment activity", - "required": [ - "days", - "total_count", - "start_date", - "end_date" - ], "properties": { "days": { - "type": "array", + "description": "Array of daily activity counts", "items": { "$ref": "#/components/schemas/ActivityDay" }, - "description": "Array of daily activity counts" + "type": "array" }, "end_date": { - "type": "string", "description": "Date range end (YYYY-MM-DD)", - "example": "2024-12-31" + "example": "2024-12-31", + "type": "string" }, "start_date": { - "type": "string", "description": "Date range start (YYYY-MM-DD)", - "example": "2024-01-01" + "example": "2024-01-01", + "type": "string" }, "total_count": { - "type": "integer", + "description": "Total count of activities across all days", "format": "int64", - "description": "Total count of activities across all days" + "type": "integer" } - } + }, + "required": [ + "days", + "total_count", + "start_date", + "end_date" + ], + "type": "object" }, "AddClusterMemberRequest": { - "type": "object", "description": "Request body for adding a single member to a running cluster.", - "required": [ - "role" - ], "properties": { "node_id": { + "description": "Target worker node ID. Omit or null to run on the control plane.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Target worker node ID. Omit or null to run on the control plane." + ] }, "role": { - "type": "string", - "description": "Member role. Currently only `replica` is accepted at runtime \u2014\nmonitor is a singleton, primary is elected by pg_auto_failover.", - "example": "replica" + "description": "Member role. Currently only `replica` is accepted at runtime —\nmonitor is a singleton, primary is elected by pg_auto_failover.", + "example": "replica", + "type": "string" } - } - }, - "AddContextRequest": { - "type": "object", + }, "required": [ - "message" + "role" ], + "type": "object" + }, + "AddContextRequest": { "properties": { "message": { "type": "string" } - } - }, - "AddEnvironmentDomainRequest": { - "type": "object", + }, "required": [ - "domain", - "is_primary" + "message" ], + "type": "object" + }, + "AddEnvironmentDomainRequest": { "properties": { "domain": { "type": "string" @@ -438,180 +433,165 @@ "is_primary": { "type": "boolean" } - } - }, - "AddEventsRequest": { - "type": "object", + }, "required": [ - "events" + "domain", + "is_primary" ], + "type": "object" + }, + "AddEventsRequest": { "properties": { "events": { "type": "string" } - } - }, - "AddEventsResponse": { - "type": "object", + }, "required": [ - "event_count", - "message" + "events" ], + "type": "object" + }, + "AddEventsResponse": { "properties": { "event_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "message": { "type": "string" } - } + }, + "required": [ + "event_count", + "message" + ], + "type": "object" }, "AddManagedDomainApiRequest": { - "type": "object", "description": "Request to add a managed domain", - "required": [ - "domain" - ], "properties": { "auto_manage": { "type": "boolean" }, "domain": { - "type": "string", - "example": "example.com" + "example": "example.com", + "type": "string" }, "generated_hostname_mode": { + "description": "Generated hostname layout: `\"standard\"` (default) or `\"flat\"`.", "type": [ "string", "null" - ], - "description": "Generated hostname layout: `\"standard\"` (default) or `\"flat\"`." + ] }, "sync_generated_records": { - "type": "boolean", - "description": "Opt in to reconciling generated hostnames into this domain's DNS zone." + "description": "Opt in to reconciling generated hostnames into this domain's DNS zone.", + "type": "boolean" } - } - }, - "AdminGateResponse": { - "type": "object", + }, "required": [ - "allowed_ips", - "allowed_hosts", - "trust_forwarded_for", - "source", - "editable" + "domain" ], + "type": "object" + }, + "AdminGateResponse": { "properties": { "allowed_hosts": { - "type": "array", + "description": "`Host` header values allowed. Empty = any host.", "items": { "type": "string" }, - "description": "`Host` header values allowed. Empty = any host." + "type": "array" }, "allowed_ips": { - "type": "array", + "description": "IPs / CIDRs allowed to reach the admin listener. Empty = any source.", "items": { "type": "string" }, - "description": "IPs / CIDRs allowed to reach the admin listener. Empty = any source." + "type": "array" }, "editable": { - "type": "boolean", - "description": "True when the config is writable through this API. False when env\nvars are dictating the active config." + "description": "True when the config is writable through this API. False when env\nvars are dictating the active config.", + "type": "boolean" }, "source": { "$ref": "#/components/schemas/AdminGateSource", "description": "Where the active config came from." }, "trust_forwarded_for": { - "type": "boolean", - "description": "When true, the gate trusts `X-Forwarded-For` from loopback peers." + "description": "When true, the gate trusts `X-Forwarded-For` from loopback peers.", + "type": "boolean" } - } + }, + "required": [ + "allowed_ips", + "allowed_hosts", + "trust_forwarded_for", + "source", + "editable" + ], + "type": "object" }, "AdminGateSource": { - "type": "string", - "description": "Where the active gate configuration came from. Env-supplied configs are\nfrozen at the process level \u2014 the UI shows them read-only and refuses to\npersist DB writes. DB-supplied configs are editable at runtime.", + "description": "Where the active gate configuration came from. Env-supplied configs are\nfrozen at the process level — the UI shows them read-only and refuses to\npersist DB writes. DB-supplied configs are editable at runtime.", "enum": [ "default", "db", "env" - ] + ], + "type": "string" }, "AgentConfigResponse": { - "type": "object", - "description": "Response DTO for a single agent \u2014 masks the encrypted API key.", - "required": [ - "id", - "project_id", - "slug", - "name", - "source", - "enabled", - "trigger_config", - "ai_provider", - "api_key_set", - "max_turns", - "timeout_seconds", - "daily_budget_cents", - "cooldown_minutes", - "branch_prefix", - "deliverable", - "created_at", - "updated_at" - ], + "description": "Response DTO for a single agent — masks the encrypted API key.", "properties": { "ai_model": { + "description": "Preferred model for the CLI (e.g. \"sonnet\", \"gpt-5-codex\"). `None` means default.", "type": [ "string", "null" - ], - "description": "Preferred model for the CLI (e.g. \"sonnet\", \"gpt-5-codex\"). `None` means default." + ] }, "ai_provider": { "type": "string" }, "ai_provider_key_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "api_key_set": { - "type": "boolean", - "description": "`true` if an API key is set; `false` otherwise." + "description": "`true` if an API key is set; `false` otherwise.", + "type": "boolean" }, "branch_prefix": { "type": "string" }, "config_repo_branch": { + "description": "Branch of the config repo to use.", "type": [ "string", "null" - ], - "description": "Branch of the config repo to use." + ] }, "config_repo_url": { + "description": "Private config repo containing .claude/ directory (skills, MCP, plugins).", "type": [ "string", "null" - ], - "description": "Private config repo containing .claude/ directory (skills, MCP, plugins)." + ] }, "cooldown_minutes": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { "type": "string" }, "daily_budget_cents": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "deliverable": { "type": "string" @@ -626,12 +606,12 @@ "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "max_turns": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "mcp_servers_config": { "description": "MCP servers config (Claude Code settings.json mcpServers format).\nCredential-bearing legacy inline values are write-only and appear as\n`***`. Omit this field on update to preserve their stored values." @@ -640,8 +620,8 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "prompt": { "type": [ @@ -650,11 +630,11 @@ ] }, "sandbox_enabled": { + "description": "None = use global sandbox setting, true = force on, false = force off", "type": [ "boolean", "null" - ], - "description": "None = use global sandbox setting, true = force on, false = force off" + ] }, "skills_config": { "description": "Skills config as JSON array." @@ -666,8 +646,8 @@ "type": "string" }, "timeout_seconds": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "tools_config": { "description": "Tools config as JSON array. Legacy custom-tool webhook URLs and headers\nare write-only and appear as `***`. Omit this field on update to\npreserve their stored values." @@ -677,37 +657,49 @@ "type": "string" }, "webhook_token": { + "description": "Secret token for the `X-Webhook-Token` header. Shown once when created,\nmasked with `***` prefix in subsequent reads.", "type": [ "string", "null" - ], - "description": "Secret token for the `X-Webhook-Token` header. Shown once when created,\nmasked with `***` prefix in subsequent reads." + ] }, "webhook_url": { + "description": "Public webhook URL for triggering this agent externally.\nOnly set when `on: { webhook: true }` is configured.\nUsage: `POST {webhook_url}` with header `X-Webhook-Token: {webhook_token}`", "type": [ "string", "null" - ], - "description": "Public webhook URL for triggering this agent externally.\nOnly set when `on: { webhook: true }` is configured.\nUsage: `POST {webhook_url}` with header `X-Webhook-Token: {webhook_token}`" + ] } - } - }, - "AgentRunLogResponse": { - "type": "object", + }, "required": [ "id", - "run_id", - "level", - "message", - "created_at" + "project_id", + "slug", + "name", + "source", + "enabled", + "trigger_config", + "ai_provider", + "api_key_set", + "max_turns", + "timeout_seconds", + "daily_budget_cents", + "cooldown_minutes", + "branch_prefix", + "deliverable", + "created_at", + "updated_at" ], + "type": "object" + }, + "AgentRunLogResponse": { "properties": { "created_at": { "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "level": { "type": "string" @@ -717,40 +709,34 @@ }, "metadata": {}, "run_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "AgentRunResponse": { - "type": "object", + }, "required": [ "id", - "project_id", - "source", - "trigger_type", - "status", - "tokens_input", - "tokens_output", - "estimated_cost_cents", - "files_changed", - "created_at", - "sandbox_enabled" + "run_id", + "level", + "message", + "created_at" ], + "type": "object" + }, + "AgentRunResponse": { "properties": { "agent_name": { + "description": "Name of the agent that created this run, if available.", "type": [ "string", "null" - ], - "description": "Name of the agent that created this run, if available." + ] }, "agent_slug": { + "description": "Slug of the agent that created this run, if available.", "type": [ "string", "null" - ], - "description": "Slug of the agent that created this run, if available." + ] }, "ai_model": { "type": [ @@ -765,11 +751,11 @@ ] }, "ai_provider": { + "description": "AI provider slug that executed this run (e.g. claude_cli, codex_cli, opencode).", "type": [ "string", "null" - ], - "description": "AI provider slug that executed this run (e.g. claude_cli, codex_cli, opencode)." + ] }, "ai_reasoning": { "type": [ @@ -778,18 +764,18 @@ ] }, "ai_session_id": { + "description": "Claude CLI session UUID for resuming conversations via `--resume`.", "type": [ "string", "null" - ], - "description": "Claude CLI session UUID for resuming conversations via `--resume`." + ] }, "analysis": { + "description": "Report / analysis text produced by the agent (used for report/notification deliverables).", "type": [ "string", "null" - ], - "description": "Report / analysis text produced by the agent (used for report/notification deliverables)." + ] }, "branch_name": { "type": [ @@ -810,22 +796,22 @@ ] }, "config_id": { + "description": "Optional. NULL for ephemeral CLI runs (`source = \"cli_ephemeral\"`) and\nhistorical autofixer runs that pre-date the agent_id column.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional. NULL for ephemeral CLI runs (`source = \"cli_ephemeral\"`) and\nhistorical autofixer runs that pre-date the agent_id column." + ] }, "created_at": { "type": "string" }, "ephemeral_yaml": { + "description": "Full WorkflowYamlConfig as YAML text. Populated only when\n`source = \"cli_ephemeral\"`. Used by the web UI to show a \"View YAML\"\nmodal so the user can see exactly what the executor ran.", "type": [ "string", "null" - ], - "description": "Full WorkflowYamlConfig as YAML text. Populated only when\n`source = \"cli_ephemeral\"`. Used by the web UI to show a \"View YAML\"\nmodal so the user can see exactly what the executor ran." + ] }, "error_message": { "type": [ @@ -834,30 +820,30 @@ ] }, "estimated_cost_cents": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "files_changed": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "phase": { + "description": "Autofixer phase: \"analyzing\", \"analyzed\", \"fixing\", \"fix_ready\", \"no_fix\",\n\"pr_created\", or NULL for non-autofixer runs.", "type": [ "string", "null" - ], - "description": "Autofixer phase: \"analyzing\", \"analyzed\", \"fixing\", \"fix_ready\", \"no_fix\",\n\"pr_created\", or NULL for non-autofixer runs." + ] }, "pr_number": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "pr_url": { "type": [ @@ -872,15 +858,15 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "prompt_text": { + "description": "Final assembled prompt the AI CLI actually saw (trigger context block +\nYAML prompt, with error-group fields interpolated). Captured once per\nrun. `None` for pre-migration rows.", "type": [ "string", "null" - ], - "description": "Final assembled prompt the AI CLI actually saw (trigger context block +\nYAML prompt, with error-group fields interpolated). Captured once per\nrun. `None` for pre-migration rows." + ] }, "run_config": { "oneOf": [ @@ -894,12 +880,12 @@ ] }, "sandbox_enabled": { - "type": "boolean", - "description": "Legacy field \u2014 all runs now execute in a sandbox. Kept for\nbackwards-compatible JSON shape; always `true`." + "description": "Legacy field — all runs now execute in a sandbox. Kept for\nbackwards-compatible JSON shape; always `true`.", + "type": "boolean" }, "source": { - "type": "string", - "description": "`committed` (the run's config lives in `project_agents`) or\n`cli_ephemeral` (the config was uploaded via the CLI for a one-off\ndry run; see `ephemeral_yaml`)." + "description": "`committed` (the run's config lives in `project_agents`) or\n`cli_ephemeral` (the config was uploaded via the CLI for a one-off\ndry run; see `ephemeral_yaml`).", + "type": "string" }, "started_at": { "type": [ @@ -911,19 +897,19 @@ "type": "string" }, "tokens_input": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "tokens_output": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trigger_source_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "trigger_source_type": { "type": [ @@ -935,131 +921,131 @@ "type": "string" }, "user_context": { + "description": "User-provided context for this run (e.g. webhook payload, manual instructions).", "type": [ "string", "null" - ], - "description": "User-provided context for this run (e.g. webhook payload, manual instructions)." + ] } - } - }, - "AgentRunWithLogsResponse": { - "type": "object", + }, "required": [ - "run", - "logs" + "id", + "project_id", + "source", + "trigger_type", + "status", + "tokens_input", + "tokens_output", + "estimated_cost_cents", + "files_changed", + "created_at", + "sandbox_enabled" ], + "type": "object" + }, + "AgentRunWithLogsResponse": { "properties": { "logs": { - "type": "array", "items": { "$ref": "#/components/schemas/AgentRunLogResponse" - } + }, + "type": "array" }, "run": { "$ref": "#/components/schemas/AgentRunResponse" } - } + }, + "required": [ + "run", + "logs" + ], + "type": "object" }, "AgentSandboxSettings": { - "type": "object", "description": "Global agent sandbox settings. Controls whether agent runs are isolated\ninside Docker containers by default. Individual agents can override this.", "properties": { "api_key_encrypted": { + "default": null, + "description": "DEPRECATED: use `providers[default_provider].credentials_encrypted` instead.", "type": [ "string", "null" - ], - "description": "DEPRECATED: use `providers[default_provider].credentials_encrypted` instead.", - "default": null + ] }, "auth_type": { - "type": "string", + "default": "subscription", "description": "DEPRECATED: use `providers[default_provider].auth_type` instead.", - "default": "subscription" + "type": "string" }, "cpu_limit": { - "type": "number", - "format": "double", + "default": 4, "description": "CPU limit in cores for sandbox containers", - "default": 4.0, - "example": 4.0 + "example": 4, + "format": "double", + "type": "number" }, "custom_image": { - "type": "string", - "description": "Custom Docker image (only used when runtime is \"custom\").\nMust have git and claude CLI installed.", "default": "", - "example": "" + "description": "Custom Docker image (only used when runtime is \"custom\").\nMust have git and claude CLI installed.", + "example": "", + "type": "string" }, "default_provider": { - "type": "string", - "description": "Default AI provider for agents: \"claude_cli\", \"opencode\", or \"codex_cli\".\nWorkspaces always use this provider \u2014 no per-session override.", "default": "claude_cli", - "example": "claude_cli" + "description": "Default AI provider for agents: \"claude_cli\", \"opencode\", or \"codex_cli\".\nWorkspaces always use this provider — no per-session override.", + "example": "claude_cli", + "type": "string" }, "enabled": { - "type": "boolean", - "description": "Sandbox is always enabled \u2014 the executor refuses to run any agent\noutside a sandboxed container. Field is retained so existing settings\nrows still deserialize, but it is ignored at runtime.", - "default": true + "default": true, + "description": "Sandbox is always enabled — the executor refuses to run any agent\noutside a sandboxed container. Field is retained so existing settings\nrows still deserialize, but it is ignored at runtime.", + "type": "boolean" }, "memory_limit_mb": { - "type": "integer", - "format": "int64", - "description": "Memory limit in MB for sandbox containers", "default": 8192, + "description": "Memory limit in MB for sandbox containers", "example": 8192, - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "network_mode": { - "type": "string", - "description": "Network access level: \"full\" (unrestricted), \"restricted\" (Temps network only), \"none\" (no network)", "default": "full", - "example": "full" + "description": "Network access level: \"full\" (unrestricted), \"restricted\" (Temps network only), \"none\" (no network)", + "example": "full", + "type": "string" }, "providers": { - "type": "object", - "description": "Per-provider auth + config. Keyed by provider id (e.g. `claude_cli`,\n`codex_cli`, `opencode`). Adding a new provider only requires a new\ncatalog entry on the Rust side \u2014 the JSON column stays migration-free.", - "default": {}, "additionalProperties": { "$ref": "#/components/schemas/ProviderConfig" }, + "default": {}, + "description": "Per-provider auth + config. Keyed by provider id (e.g. `claude_cli`,\n`codex_cli`, `opencode`). Adding a new provider only requires a new\ncatalog entry on the Rust side — the JSON column stays migration-free.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "runtime": { - "type": "string", - "description": "Runtime preset: \"node\", \"bun\", \"python\", \"rust\", \"go\", \"full\", or \"custom\"", "default": "node", - "example": "node" + "description": "Runtime preset: \"node\", \"bun\", \"python\", \"rust\", \"go\", \"full\", or \"custom\"", + "example": "node", + "type": "string" }, "sandbox_backend": { + "default": null, + "description": "Default isolation backend for sandboxes: \"docker\" (default) or\n\"firecracker\" (ADR-029; requires `temps firecracker setup`). Only\nconsulted when the Firecracker backend probes available — otherwise\nDocker is used regardless.", + "example": "docker", "type": [ "string", "null" - ], - "description": "Default isolation backend for sandboxes: \"docker\" (default) or\n\"firecracker\" (ADR-029; requires `temps firecracker setup`). Only\nconsulted when the Firecracker backend probes available \u2014 otherwise\nDocker is used regardless.", - "default": null, - "example": "docker" + ] } - } + }, + "type": "object" }, "AgentSandboxSettingsMasked": { - "type": "object", "description": "Agent sandbox settings with masked per-provider credentials.\nEach provider entry reports only whether a credential is saved, not\nthe encrypted blob itself. Non-sensitive fields (auth_type, default_model,\nextra) are passed through so the UI can render provider-specific state.", - "required": [ - "default_provider", - "providers", - "api_key_saved", - "auth_type", - "enabled", - "runtime", - "custom_image", - "cpu_limit", - "memory_limit_mb", - "network_mode", - "sandbox_backend" - ], "properties": { "api_key_saved": { "type": "boolean" @@ -1068,8 +1054,8 @@ "type": "string" }, "cpu_limit": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "custom_image": { "type": "string" @@ -1081,21 +1067,21 @@ "type": "boolean" }, "memory_limit_mb": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "network_mode": { "type": "string" }, "providers": { - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/ProviderConfigMasked" }, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "runtime": { "type": "string" @@ -1103,76 +1089,83 @@ "sandbox_backend": { "type": "string" } - } - }, - "AggregatedBucketItem": { - "type": "object", + }, "required": [ - "timestamp", - "count" + "default_provider", + "providers", + "api_key_saved", + "auth_type", + "enabled", + "runtime", + "custom_image", + "cpu_limit", + "memory_limit_mb", + "network_mode", + "sandbox_backend" ], + "type": "object" + }, + "AggregatedBucketItem": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "timestamp": { "type": "string" } - } + }, + "required": [ + "timestamp", + "count" + ], + "type": "object" }, "AggregatedBucketsQuery": { - "type": "object", "description": "Query parameters for aggregated metrics by time bucket", - "required": [ - "start_date", - "end_date" - ], "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level: events, sessions, or visitors" }, "bucket_size": { - "type": "string", - "description": "Time bucket size: \"1 hour\", \"1 day\", \"1 week\", etc. (default: \"1 hour\")" + "description": "Time bucket size: \"1 hour\", \"1 day\", \"1 week\", etc. (default: \"1 hour\")", + "type": "string" }, "deployment_id": { + "description": "Optional deployment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional deployment filter" + ] }, "end_date": { - "type": "string", + "description": "End date for the query range", "format": "date-time", - "description": "End date for the query range" + "type": "string" }, "environment_id": { + "description": "Optional environment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment filter" + ] }, "start_date": { - "type": "string", + "description": "Start date for the query range", "format": "date-time", - "description": "Start date for the query range" + "type": "string" } - } - }, - "AggregatedBucketsResponse": { - "type": "object", + }, "required": [ - "bucket_size", - "aggregation_level", - "items", - "total" + "start_date", + "end_date" ], + "type": "object" + }, + "AggregatedBucketsResponse": { "properties": { "aggregation_level": { "type": "string" @@ -1181,78 +1174,77 @@ "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AggregatedBucketItem" - } + }, + "type": "array" }, "total": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "bucket_size", + "aggregation_level", + "items", + "total" + ], + "type": "object" }, "AggregationLevel": { - "type": "string", "enum": [ "events", "sessions", "visitors" - ] + ], + "type": "string" }, "AggregationTemporality": { - "type": "string", "description": "The aggregation temporality of a Sum/Histogram/ExponentialHistogram metric.\n\nMirrors OTel's `AggregationTemporality` proto enum: whether reported values\nare cumulative since the start of the series (Cumulative) or only the delta\nsince the previous report (Delta).", "enum": [ "unspecified", "delta", "cumulative" - ] + ], + "type": "string" }, "AiAgentBreakdownResponse": { - "type": "object", "description": "Response wrapping the AI agent breakdown rows.", - "required": [ - "items", - "start_time", - "end_time" - ], "properties": { "end_time": { "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiAgentBreakdownRow" - } + }, + "type": "array" }, "start_time": { "type": "string" } - } + }, + "required": [ + "items", + "start_time", + "end_time" + ], + "type": "object" }, "AiAgentBreakdownRow": { - "type": "object", "description": "One row in the AI-agent analytics breakdown. `agent` is the canonical\ncrawler name (e.g. `GPTBot`, `Claude-User`), `provider` is the vendor used\nfor grouping + logos. The UI mirrors the browsers card and ranks by\n`request_count`.", - "required": [ - "provider", - "agent", - "purpose", - "request_count", - "unique_ips" - ], "properties": { "agent": { "type": "string" }, "last_seen": { + "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", + "example": "2026-05-29T12:00:00Z", "type": [ "string", "null" - ], - "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", - "example": "2026-05-29T12:00:00Z" + ] }, "provider": { "type": "string" @@ -1261,23 +1253,25 @@ "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "unique_ips": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "AiAgentDescriptor": { - "type": "object", - "description": "Static descriptor for one entry in the known-AI-agents taxonomy.", + }, "required": [ "provider", "agent", - "purpose" + "purpose", + "request_count", + "unique_ips" ], + "type": "object" + }, + "AiAgentDescriptor": { + "description": "Static descriptor for one entry in the known-AI-agents taxonomy.", "properties": { "agent": { "type": "string" @@ -1288,371 +1282,365 @@ "purpose": { "type": "string" } - } + }, + "required": [ + "provider", + "agent", + "purpose" + ], + "type": "object" }, "AiAgentPageRow": { - "type": "object", "description": "One row in the pages-by-agent breakdown. Returned by\n[`ProxyLogService::get_ai_agent_pages`] for a single named agent.\n`unique_ips` counts distinct client IPs that hit this path via that agent\n(same definition as the per-agent unique-IPs in [`AiAgentBreakdownRow`]).", - "required": [ - "path", - "request_count", - "unique_ips" - ], "properties": { "last_seen": { + "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", + "example": "2026-05-29T12:00:00Z", "type": [ "string", "null" - ], - "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", - "example": "2026-05-29T12:00:00Z" + ] }, "path": { "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "unique_ips": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "path", + "request_count", + "unique_ips" + ], + "type": "object" }, "AiAgentPagesResponse": { - "type": "object", "description": "Response wrapping the per-agent pages breakdown rows.", - "required": [ - "agent", - "items", - "start_time", - "end_time" - ], "properties": { "agent": { - "type": "string", - "description": "The agent name this breakdown is scoped to." + "description": "The agent name this breakdown is scoped to.", + "type": "string" }, "end_time": { "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiAgentPageRow" - } + }, + "type": "array" }, "start_time": { "type": "string" } - } - }, - "AiAgentTimelineResponse": { - "type": "object", - "description": "Response wrapping the AI agent timeline rows.", + }, "required": [ + "agent", "items", "start_time", - "end_time", - "bucket", - "group_by" + "end_time" ], + "type": "object" + }, + "AiAgentTimelineResponse": { + "description": "Response wrapping the AI agent timeline rows.", "properties": { "bucket": { - "type": "string", "description": "Bucket interval used for the buckets (so the UI can label the x-axis).", - "example": "1 hour" + "example": "1 hour", + "type": "string" }, "end_time": { "type": "string" }, "group_by": { - "type": "string", "description": "Echoes the grouping dimension actually applied.", - "example": "provider" + "example": "provider", + "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiAgentTimelineRow" - } + }, + "type": "array" }, "start_time": { "type": "string" } - } - }, - "AiAgentTimelineRow": { - "type": "object", - "description": "One point in the AI-agent timeline: the request count for a single\n(`bucket`, `key`) pair, where `key` is a provider or agent name depending on\nthe requested grouping. The UI pivots these into one stacked series per\n`key` across the shared bucket x-axis.", + }, "required": [ + "items", + "start_time", + "end_time", "bucket", - "key", - "request_count" + "group_by" ], + "type": "object" + }, + "AiAgentTimelineRow": { + "description": "One point in the AI-agent timeline: the request count for a single\n(`bucket`, `key`) pair, where `key` is a provider or agent name depending on\nthe requested grouping. The UI pivots these into one stacked series per\n`key` across the shared bucket x-axis.", "properties": { "bucket": { - "type": "string", "description": "Bucket start in RFC3339 format.", - "example": "2026-05-29T12:00:00Z" + "example": "2026-05-29T12:00:00Z", + "type": "string" }, "key": { - "type": "string", "description": "Provider or agent name this count belongs to.", - "example": "OpenAI" + "example": "OpenAI", + "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "bucket", + "key", + "request_count" + ], + "type": "object" }, "AiChatLimitsSettings": { - "type": "object", "description": "Bounds on one AI chat turn.\n\nA turn is bounded by TIME rather than by a number of steps. A step count\nsays nothing about cost or about how long someone has been watching a\nspinner, and it cuts short exactly the long, productive turns the chat\nexists for. The user can already see each tool call and press Stop; the\ndeadline is what guarantees an *unattended* turn still ends.\n\nThe right value is a property of the model, which is why it is configurable\nrather than compiled in: a full alert-suggestion turn takes ~10 minutes\nagainst a slow local model and seconds against a hosted one.", "properties": { "turn_timeout_secs": { - "type": "integer", - "format": "int32", - "description": "How long one turn may run before it is stopped and the partial answer\nreturned, in seconds. The user is told the turn was cut short.\n\nChecked between steps, not mid-call: a model round already in flight\nfinishes, so a turn can overrun by up to one round. Against a slow\nself-hosted model that is a minute or two. Aborting mid-stream would cut\nthe answer off in the middle of a sentence and throw away work already\npaid for, which is worse than a late stop.", "default": 900, + "description": "How long one turn may run before it is stopped and the partial answer\nreturned, in seconds. The user is told the turn was cut short.\n\nChecked between steps, not mid-call: a model round already in flight\nfinishes, so a turn can overrun by up to one round. Against a slow\nself-hosted model that is a minute or two. Aborting mid-stream would cut\nthe answer off in the middle of a sentence and throw away work already\npaid for, which is worse than a late stop.", "example": 900, + "format": "int32", "maximum": 3600, - "minimum": 30 + "minimum": 30, + "type": "integer" } - } + }, + "type": "object" }, "AiConfigSettings": { - "type": "object", "description": "Global AI configuration settings. Controls the default config repo\ncontaining `.claude/` directory (skills, MCP servers, plugins) that\ngets overlaid into every agent sandbox.", "properties": { "config_repo": { - "type": "string", - "description": "Global config repo URL in \"owner/repo\" format (e.g. \"myorg/claude-config\").\nCloned at agent run time and overlaid into the sandbox's `.claude/` directory.", "default": "", - "example": "" + "description": "Global config repo URL in \"owner/repo\" format (e.g. \"myorg/claude-config\").\nCloned at agent run time and overlaid into the sandbox's `.claude/` directory.", + "example": "", + "type": "string" }, "config_repo_branch": { - "type": "string", - "description": "Branch of the config repo to use.", "default": "main", - "example": "main" + "description": "Branch of the config repo to use.", + "example": "main", + "type": "string" } - } + }, + "type": "object" }, "AiDataAccessResponse": { - "type": "object", - "required": [ - "service_id", - "enabled" - ], "properties": { "enabled": { - "type": "boolean", "description": "Whether the AI assistant may read row data from this service", - "example": false + "example": false, + "type": "boolean" }, "service_id": { - "type": "integer", + "description": "Service id", "format": "int32", - "description": "Service id" + "type": "integer" } - } + }, + "required": [ + "service_id", + "enabled" + ], + "type": "object" }, "AiPageBreakdownResponse": { - "type": "object", "description": "Response wrapping the AI page breakdown rows.", - "required": [ - "items", - "start_time", - "end_time" - ], "properties": { "end_time": { "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiPageBreakdownRow" - } + }, + "type": "array" }, "start_time": { "type": "string" } - } + }, + "required": [ + "items", + "start_time", + "end_time" + ], + "type": "object" }, "AiPageBreakdownRow": { - "type": "object", "description": "One row in the AI-crawled-pages breakdown. `agent_count` is the number of\n*distinct* AI agents that hit this path, so the UI can show both how heavily\nand how broadly a page is being crawled.", - "required": [ - "path", - "request_count", - "agent_count" - ], "properties": { "agent_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "last_seen": { + "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", + "example": "2026-05-29T12:00:00Z", "type": [ "string", "null" - ], - "description": "Last-seen timestamp in RFC3339 format, or `None` if no rows matched.", - "example": "2026-05-29T12:00:00Z" + ] }, "path": { "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "path", + "request_count", + "agent_count" + ], + "type": "object" }, "AiStatusBreakdownResponse": { - "type": "object", "description": "Response wrapping the AI status breakdown rows.", - "required": [ - "items", - "start_time", - "end_time" - ], "properties": { "end_time": { "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiStatusBreakdownRow" - } + }, + "type": "array" }, "start_time": { "type": "string" } - } + }, + "required": [ + "items", + "start_time", + "end_time" + ], + "type": "object" }, "AiStatusBreakdownRow": { - "type": "object", "description": "One row in the AI-agent HTTP status breakdown: the request count for a\nstatus class (`2xx`/`3xx`/`4xx`/`5xx`/`other`) across crawler traffic.", - "required": [ - "status_class", - "request_count" - ], "properties": { "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "status_class": { - "type": "string", "description": "Status class label.", - "example": "2xx" + "example": "2xx", + "type": "string" } - } + }, + "required": [ + "status_class", + "request_count" + ], + "type": "object" }, "AlarmListResponse": { - "type": "object", "description": "Paginated list of alarms.", - "required": [ - "items", - "total", - "page", - "page_size" - ], "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AlarmResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "items", + "total", + "page", + "page_size" + ], + "type": "object" }, "AlarmResponse": { - "type": "object", "description": "Full alarm representation returned by list/summary endpoints.", - "required": [ - "id", - "project_id", - "alarm_type", - "severity", - "status", - "title", - "fired_at", - "created_at", - "updated_at" - ], "properties": { "acknowledged_at": { + "description": "ISO-8601 UTC timestamp when the alarm was acknowledged, if any.", "type": [ "string", "null" - ], - "description": "ISO-8601 UTC timestamp when the alarm was acknowledged, if any." + ] }, "acknowledged_by": { + "description": "User ID who acknowledged the alarm, if any.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "User ID who acknowledged the alarm, if any." + ] }, "alarm_type": { "type": "string" }, "container_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "created_at": { - "type": "string", - "description": "ISO-8601 UTC timestamp when the row was created." + "description": "ISO-8601 UTC timestamp when the row was created.", + "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "fired_at": { - "type": "string", - "description": "ISO-8601 UTC timestamp when the alarm fired." + "description": "ISO-8601 UTC timestamp when the alarm fired.", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": [ @@ -1664,22 +1652,22 @@ "description": "Arbitrary JSON metadata attached by the alarm source." }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "resolved_at": { + "description": "ISO-8601 UTC timestamp when the alarm was resolved, if any.", "type": [ "string", "null" - ], - "description": "ISO-8601 UTC timestamp when the alarm was resolved, if any." + ] }, "service_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "severity": { "type": "string" @@ -1691,79 +1679,78 @@ "type": "string" }, "updated_at": { - "type": "string", - "description": "ISO-8601 UTC timestamp when the row was last updated." + "description": "ISO-8601 UTC timestamp when the row was last updated.", + "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "alarm_type", + "severity", + "status", + "title", + "fired_at", + "created_at", + "updated_at" + ], + "type": "object" }, "AlarmSummaryResponse": { - "type": "object", "description": "Re-export AlarmSummary for the OpenAPI schema.", - "required": [ - "total_active", - "firing", - "acknowledged", - "critical", - "warning", - "by_type" - ], "properties": { "acknowledged": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "by_type": { - "type": "object", "additionalProperties": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "critical": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "firing": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_active": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "warning": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "AlertRuleResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "trigger_type", - "trigger_config", - "notification_priority", - "cooldown_minutes", - "enabled", - "created_at", - "updated_at" + "total_active", + "firing", + "acknowledged", + "critical", + "warning", + "by_type" ], + "type": "object" + }, + "AlertRuleResponse": { "properties": { "cooldown_minutes": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { "type": "string" @@ -1772,11 +1759,11 @@ "type": "boolean" }, "environment_filter": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_level_filter": { "type": [ @@ -1785,8 +1772,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -1795,8 +1782,8 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trigger_config": {}, "trigger_type": { @@ -1805,17 +1792,23 @@ "updated_at": { "type": "string" } - } - }, - "AllocEntry": { - "type": "object", - "description": "Wire-format allocation. `null` in the JSON when the node hasn't been\nallocated yet \u2014 workers should treat that as \"single-host mode, do\nnot bring up the overlay\".", + }, "required": [ - "node_id", - "compute_cidr", - "bridge_address", - "underlay_address" + "id", + "project_id", + "name", + "trigger_type", + "trigger_config", + "notification_priority", + "cooldown_minutes", + "enabled", + "created_at", + "updated_at" ], + "type": "object" + }, + "AllocEntry": { + "description": "Wire-format allocation. `null` in the JSON when the node hasn't been\nallocated yet — workers should treat that as \"single-host mode, do\nnot bring up the overlay\".", "properties": { "bridge_address": { "type": "string" @@ -1824,265 +1817,263 @@ "type": "string" }, "node_id": { - "type": "string", - "description": "Stable v5 UUID derived from the database node id." + "description": "Stable v5 UUID derived from the database node id.", + "type": "string" }, "underlay_address": { "type": "string" } - } - }, - "AnalyticsSessionEventsResponse": { - "type": "object", + }, "required": [ - "session_id", - "events", - "total_events" + "node_id", + "compute_cidr", + "bridge_address", + "underlay_address" ], + "type": "object" + }, + "AnalyticsSessionEventsResponse": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionEvent" - } + }, + "type": "array" }, "session_id": { "type": "string" }, "total_events": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "session_id", + "events", + "total_events" + ], + "type": "object" }, "AnnotatedSpan": { - "type": "object", "description": "A single span annotated with the project that originally stored it.\nUsed in `UnifiedTrace` to let the UI colour-code spans by project.", - "required": [ - "project_id", - "project_name", - "span" - ], "properties": { "project_id": { - "type": "integer", + "description": "The project that stored this span (same as `span.project_id`).", "format": "int32", - "description": "The project that stored this span (same as `span.project_id`)." + "type": "integer" }, "project_name": { - "type": "string", - "description": "Human-readable project name for waterfall colour-coding and legend." + "description": "Human-readable project name for waterfall colour-coding and legend.", + "type": "string" }, "span": { "$ref": "#/components/schemas/SpanRecord", "description": "Original span data verbatim from storage." } - } + }, + "required": [ + "project_id", + "project_name", + "span" + ], + "type": "object" }, "AnomalyAlgorithm": { - "type": "string", - "description": "Anomaly baseline algorithm. Adding one (e.g. a new robust variant) is a\ncode-only enum addition \u2014 no migration, since it lives inside the blob.", + "description": "Anomaly baseline algorithm. Adding one (e.g. a new robust variant) is a\ncode-only enum addition — no migration, since it lives inside the blob.", "enum": [ "robust", "basic", "agile", "ewma" - ] + ], + "type": "string" }, "AnomalyParams": { - "type": "object", - "description": "Seasonal anomaly-band detector parameters (stub \u2014 not yet evaluated).", + "description": "Seasonal anomaly-band detector parameters (stub — not yet evaluated).", "properties": { "algorithm": { "$ref": "#/components/schemas/AnomalyAlgorithm", "description": "Baseline model. `robust` is the default (seasonal, stable, flags level\nshifts); `ewma`/`agile` adopt level shifts; `basic` is non-seasonal." }, "baseline_lookback_days": { + "description": "How far back to build the baseline. `None` = an evaluator default.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "How far back to build the baseline. `None` = an evaluator default." + ] }, "deviations": { - "type": "number", + "description": "Band width in robust standard deviations (Datadog's `bounds`).", "format": "double", - "description": "Band width in robust standard deviations (Datadog's `bounds`)." + "type": "number" }, "direction": { "$ref": "#/components/schemas/Direction", "description": "Which side(s) of the band a deviation must be on to count." }, "pct_anomalous": { - "type": "number", + "description": "Fraction (0..=1) of points in the window that must be anomalous to fire.", "format": "double", - "description": "Fraction (0..=1) of points in the window that must be anomalous to fire." + "type": "number" }, "seasonality": { "$ref": "#/components/schemas/Seasonality", "description": "Seasonality model for the baseline." } - } + }, + "type": "object" }, "AnomalyPreviewPointResponse": { - "type": "object", - "required": [ - "bucket", - "value", - "lower", - "upper", - "breaching" - ], "properties": { "breaching": { "type": "boolean" }, "bucket": { - "type": "string", - "example": "2025-10-12T12:15:47Z" + "example": "2025-10-12T12:15:47Z", + "type": "string" }, "lower": { - "type": "number", + "description": "Lower edge of the expected band at this point.", "format": "double", - "description": "Lower edge of the expected band at this point." + "type": "number" }, "upper": { - "type": "number", + "description": "Upper edge of the expected band at this point.", "format": "double", - "description": "Upper edge of the expected band at this point." + "type": "number" }, "value": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "AnomalyPreviewRequest": { - "type": "object", + }, "required": [ - "project_id", - "metric_name", - "aggregation", - "window_secs", - "detection_config" + "bucket", + "value", + "lower", + "upper", + "breaching" ], + "type": "object" + }, + "AnomalyPreviewRequest": { "properties": { "aggregation": { - "type": "string", - "description": "One of `avg|sum|min|max|count|rate|p50|p90|p95|p99`." + "description": "One of `avg|sum|min|max|count|rate|p50|p90|p95|p99`.", + "type": "string" }, "detection_config": { "$ref": "#/components/schemas/DetectionConfig", - "description": "The detector to backtest. `static` and `anomaly` are supported \u2014 the\nkinds the evaluator actually runs." + "description": "The detector to backtest. `static` and `anomaly` are supported — the\nkinds the evaluator actually runs." }, "end_time": { + "description": "RFC 3339; defaults to now.", + "example": "2025-10-12T12:15:47Z", "type": [ "string", "null" - ], - "description": "RFC 3339; defaults to now.", - "example": "2025-10-12T12:15:47Z" + ] }, "metric_name": { "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_time": { + "description": "RFC 3339; defaults to 7 days before `end_time`.", + "example": "2025-10-12T12:15:47Z", "type": [ "string", "null" - ], - "description": "RFC 3339; defaults to 7 days before `end_time`.", - "example": "2025-10-12T12:15:47Z" + ] }, "window_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "AnomalyPreviewResponse": { - "type": "object", + }, "required": [ - "points", - "breach_count", - "baseline_samples", - "sufficient" + "project_id", + "metric_name", + "aggregation", + "window_secs", + "detection_config" ], + "type": "object" + }, + "AnomalyPreviewResponse": { "properties": { "baseline_samples": { - "type": "integer", + "description": "Baseline sample count (drives the `sufficient` flag).", "format": "int64", - "description": "Baseline sample count (drives the `sufficient` flag)." + "type": "integer" }, "breach_count": { - "type": "integer", + "description": "How many points in the range would have fired.", "format": "int64", - "description": "How many points in the range would have fired." + "type": "integer" }, "points": { - "type": "array", "items": { "$ref": "#/components/schemas/AnomalyPreviewPointResponse" - } + }, + "type": "array" }, "sufficient": { - "type": "boolean", - "description": "Whether the baseline had enough history for a trustworthy band." + "description": "Whether the baseline had enough history for a trustworthy band.", + "type": "boolean" } - } - }, - "ApiKeyListResponse": { - "type": "object", + }, "required": [ - "api_keys", - "total" + "points", + "breach_count", + "baseline_samples", + "sufficient" ], + "type": "object" + }, + "ApiKeyListResponse": { "properties": { "api_keys": { - "type": "array", "items": { "$ref": "#/components/schemas/ApiKeyResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ApiKeyResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "key_prefix", - "role_type", - "is_active", - "created_at" + "api_keys", + "total" ], + "type": "object" + }, + "ApiKeyResponse": { "properties": { "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00Z", "format": "date-time", - "example": "2024-01-01T00:00:00Z" + "type": "string" }, "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -2091,375 +2082,369 @@ "type": "string" }, "last_used_at": { + "example": "2024-01-01T00:00:00Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-01-01T00:00:00Z" + ] }, "name": { "type": "string" }, "permissions": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "role_type": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "key_prefix", + "role_type", + "is_active", + "created_at" + ], + "type": "object" }, "AppSettings": { - "type": "object", "description": "Application settings stored in the database\nAll fields have sensible defaults for easy onboarding", "properties": { "agent_sandbox": { - "oneOf": [ - { - "$ref": "#/components/schemas/AgentSandboxSettings" - } - ], "default": { - "default_provider": "claude_cli", - "providers": {}, - "auth_type": "subscription", "api_key_encrypted": null, - "enabled": true, - "runtime": "node", + "auth_type": "subscription", + "cpu_limit": 4, "custom_image": "", - "cpu_limit": 4.0, + "default_provider": "claude_cli", + "enabled": true, "memory_limit_mb": 8192, "network_mode": "full", + "providers": {}, + "runtime": "node", "sandbox_backend": null - } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/AgentSandboxSettings" + } + ] }, "ai_chat_limits": { + "default": { + "turn_timeout_secs": 900 + }, "oneOf": [ { "$ref": "#/components/schemas/AiChatLimitsSettings", "description": "Limits on a single AI chat turn. Operator-tunable because the right\nvalue depends on the model: a turn against a slow self-hosted model can\nlegitimately take ten minutes, while a hosted one finishes in seconds\nand a shorter ceiling keeps costs predictable." } - ], - "default": { - "turn_timeout_secs": 900 - } + ] }, "ai_config": { + "default": { + "config_repo": "", + "config_repo_branch": "main" + }, "oneOf": [ { "$ref": "#/components/schemas/AiConfigSettings" } - ], - "default": { - "config_repo": "", - "config_repo_branch": "main" - } + ] }, "build_limits": { + "default": { + "cpu_limit_cores": 0, + "max_concurrent": 2, + "memory_limit_mb": 0 + }, "oneOf": [ { "$ref": "#/components/schemas/BuildLimitsSettings", "description": "Build-time resource limits applied on the control plane to prevent\n`docker build` from saturating host CPU/RAM. Worker nodes are\nintentionally NOT subject to these limits (each worker is dedicated\nhardware that already has its own per-host headroom)." } - ], - "default": { - "max_concurrent": 2, - "cpu_limit_cores": 0.0, - "memory_limit_mb": 0 - } + ] }, "cluster_dns": { + "default": { + "enabled": false + }, "oneOf": [ { "$ref": "#/components/schemas/ClusterDnsSettings", - "description": "Cluster-DNS resolver settings (ADR-024, experimental beta). Off by\ndefault \u2014 see `ClusterDnsSettings` for the incident background and\ntrade-offs. Must be explicitly enabled by operators who need\n`*.temps.local` service-to-service resolution inside containers." + "description": "Cluster-DNS resolver settings (ADR-024, experimental beta). Off by\ndefault — see `ClusterDnsSettings` for the incident background and\ntrade-offs. Must be explicitly enabled by operators who need\n`*.temps.local` service-to-service resolution inside containers." } - ], - "default": { - "enabled": false - } + ] }, "console_version": { + "default": null, + "description": "Binary version tag (e.g. \"v0.1.0\") of the *console* process\n(`temps serve`, role=all or role=console) that last started. Written\non console startup; read by the standalone `temps proxy` to detect\nversion skew during a rolling upgrade (ADR-017 Phase 3). `None` on\ninstalls that never ran a console build carrying this field.\n\nThis is informational state written by the binary itself — NOT an\noperator-tunable setting. It is intentionally absent from\n`AppSettingsResponse` and the PATCH path so an operator cannot\naccidentally overwrite the self-recorded value.", "type": [ "string", "null" - ], - "description": "Binary version tag (e.g. \"v0.1.0\") of the *console* process\n(`temps serve`, role=all or role=console) that last started. Written\non console startup; read by the standalone `temps proxy` to detect\nversion skew during a rolling upgrade (ADR-017 Phase 3). `None` on\ninstalls that never ran a console build carrying this field.\n\nThis is informational state written by the binary itself \u2014 NOT an\noperator-tunable setting. It is intentionally absent from\n`AppSettingsResponse` and the PATCH path so an operator cannot\naccidentally overwrite the self-recorded value.", - "default": null + ] }, "container_logs": { + "default": { + "max_file": 3, + "max_size": "50m", + "service_max_file": 3, + "service_max_size": "20m" + }, "oneOf": [ { "$ref": "#/components/schemas/ContainerLogSettings" } - ], - "default": { - "max_size": "50m", - "max_file": 3, - "service_max_size": "20m", - "service_max_file": 3 - } + ] }, "disk_space_alert": { + "default": { + "check_interval_seconds": 300, + "enabled": true, + "monitor_path": null, + "threshold_percent": 80 + }, "oneOf": [ { "$ref": "#/components/schemas/DiskSpaceAlertSettings" } - ], - "default": { - "enabled": true, - "threshold_percent": 80, - "check_interval_seconds": 300, - "monitor_path": null - } + ] }, "dns_provider": { + "default": { + "cloudflare_api_key": null, + "provider": "manual" + }, "oneOf": [ { "$ref": "#/components/schemas/DnsProviderSettings" } - ], - "default": { - "provider": "manual", - "cloudflare_api_key": null - } + ] }, "docker_registry": { - "oneOf": [ - { - "$ref": "#/components/schemas/DockerRegistrySettings" - } - ], "default": { + "ca_certificate": null, "enabled": false, - "registry_url": null, - "username": null, "password": null, + "registry_url": null, "tls_verify": true, - "ca_certificate": null - } + "username": null + }, + "oneOf": [ + { + "$ref": "#/components/schemas/DockerRegistrySettings" + } + ] }, "edge_target": { + "default": null, + "description": "Public edge target that generated DNS records point at when a managed\ndomain opts into automatic record sync. An IPv4/IPv6 address produces an\n`A`/`AAAA` record; anything else is treated as a `CNAME` target. `None`\ndisables DNS record sync regardless of per-domain opt-in.", "type": [ "string", "null" - ], - "description": "Public edge target that generated DNS records point at when a managed\ndomain opts into automatic record sync. An IPv4/IPv6 address produces an\n`A`/`AAAA` record; anything else is treated as a `CNAME` target. `None`\ndisables DNS record sync regardless of per-domain opt-in.", - "default": null + ] }, "external_url": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "insecure_tls": { - "type": "boolean", - "description": "Skip TLS certificate verification on outbound HTTP clients built by the\nserver (deployer, agent, remote service client). Strictly opt-in for\noperators running self-signed control plane / worker certs on a trusted\ninternal network. Worker\u2192control-plane traffic that traverses the public\ninternet must keep this `false` \u2014 otherwise a MitM steals the join token.", - "default": false + "default": false, + "description": "Skip TLS certificate verification on outbound HTTP clients built by the\nserver (deployer, agent, remote service client). Strictly opt-in for\noperators running self-signed control plane / worker certs on a trusted\ninternal network. Worker→control-plane traffic that traverses the public\ninternet must keep this `false` — otherwise a MitM steals the join token.", + "type": "boolean" }, "internal_url": { + "default": null, + "description": "URL that service containers use to reach the Temps API from *inside*\nthe Docker network (OTLP metrics ingest, agent callbacks, etc.). On\nDocker Desktop this defaults to `http://host.docker.internal:`;\non Linux it requires the `host.docker.internal:host-gateway` host\nmapping (which Temps adds to provisioned containers). Distinct from\n`external_url`, which is the public-facing address.", "type": [ "string", "null" - ], - "description": "URL that service containers use to reach the Temps API from *inside*\nthe Docker network (OTLP metrics ingest, agent callbacks, etc.). On\nDocker Desktop this defaults to `http://host.docker.internal:`;\non Linux it requires the `host.docker.internal:host-gateway` host\nmapping (which Temps adds to provisioned containers). Distinct from\n`external_url`, which is the public-facing address.", - "default": null + ] }, "letsencrypt": { + "default": { + "email": null, + "environment": "production" + }, "oneOf": [ { "$ref": "#/components/schemas/LetsEncryptSettings" } - ], - "default": { - "email": null, - "environment": "production" - } + ] }, "monitoring": { + "default": { + "clickhouse_url": null, + "enabled": false, + "retention_daily_years": 2, + "retention_hourly_days": 90, + "retention_raw_days": 7, + "scrape_interval_secs": 30, + "store": "timescale_db" + }, "oneOf": [ { "$ref": "#/components/schemas/MonitoringSettings", "description": "Metrics observability settings. Controls the MetricsStore backend,\nscrape interval, and tiered retention windows." } - ], - "default": { - "enabled": false, - "store": "timescale_db", - "scrape_interval_secs": 30, - "retention_raw_days": 7, - "retention_hourly_days": 90, - "retention_daily_years": 2, - "clickhouse_url": null - } + ] }, "multi_node": { + "default": { + "cluster_ca_cert_pem": null, + "cluster_ca_key_encrypted": null, + "join_token_hash": null, + "legacy_shared_token_enabled": true, + "node_cpu_alert_percent": 90, + "node_disk_alert_percent": 90, + "node_memory_alert_percent": 90, + "private_address": null, + "require_mtls": false + }, "oneOf": [ { "$ref": "#/components/schemas/MultiNodeSettings" } - ], - "default": { - "join_token_hash": null, - "private_address": null, - "legacy_shared_token_enabled": true, - "cluster_ca_cert_pem": null, - "cluster_ca_key_encrypted": null, - "require_mtls": false, - "node_cpu_alert_percent": 90.0, - "node_memory_alert_percent": 90.0, - "node_disk_alert_percent": 90.0 - } + ] }, "observability_compression": { + "default": { + "otel_spans_after_hours": 24, + "proxy_logs_after_hours": 24 + }, "oneOf": [ { "$ref": "#/components/schemas/ObservabilityCompressionSettings", "description": "TimescaleDB compression delays for immutable observability data.\nChanges are applied at runtime by the Settings API." } - ], - "default": { - "proxy_logs_after_hours": 24, - "otel_spans_after_hours": 24 - } + ] }, "observability_retention": { + "default": { + "otel_logs_days": 90, + "otel_metrics_days": 90, + "otel_spans_days": 90, + "proxy_logs_days": 30 + }, "oneOf": [ { "$ref": "#/components/schemas/ObservabilityRetentionSettings", "description": "Retention windows for raw proxy and OpenTelemetry telemetry.\nTimescaleDB policies are updated at runtime by the Settings API." } - ], - "default": { - "proxy_logs_days": 30, - "otel_spans_days": 90, - "otel_logs_days": 90, - "otel_metrics_days": 90 - } + ] }, "on_demand_tls": { + "default": { + "deployment_url_mode": "http", + "enabled": false, + "hourly_cap": 10, + "max_concurrent": 3, + "zone": null + }, "oneOf": [ { "$ref": "#/components/schemas/OnDemandTlsSettings" } - ], - "default": { - "enabled": false, - "zone": null, - "max_concurrent": 3, - "hourly_cap": 10, - "deployment_url_mode": "http" - } + ] }, "preview_domain": { - "type": "string", - "default": "localho.st" + "default": "localho.st", + "type": "string" }, "preview_gateway": { + "default": { + "auto_upgrade": true, + "host_port": 8090, + "image": "ghcr.io/gotempsh/temps-preview-gateway:latest" + }, "oneOf": [ { "$ref": "#/components/schemas/PreviewGatewaySettings" } - ], - "default": { - "image": "ghcr.io/gotempsh/temps-preview-gateway:latest", - "host_port": 8090, - "auto_upgrade": true - } + ] }, "rate_limiting": { + "default": { + "blacklist_ips": [], + "enabled": false, + "max_requests_per_hour": 1000, + "max_requests_per_minute": 60, + "whitelist_ips": [] + }, "oneOf": [ { "$ref": "#/components/schemas/RateLimitSettings" } - ], - "default": { - "enabled": false, - "max_requests_per_minute": 60, - "max_requests_per_hour": 1000, - "whitelist_ips": [], - "blacklist_ips": [] - } + ] }, "require_mfa_for_admins": { - "type": "boolean", + "default": false, "description": "When `true`, any user holding the `Admin` role must have MFA enrolled\n(`users.mfa_enabled = true`) to complete a **password** login. Users\nwithout MFA enrolled are rejected with a typed error instructing them\nto enroll before retrying. This only gates the password-login path\n(`AuthService::login`) -- SSO/OIDC logins are handled by a separate\ncode path (`OidcService::resolve_user` + `oidc_handler`) and are\nintentionally unaffected, since federating identity to a\nproperly-hardened IdP is itself an acceptable alternative to local\nTOTP MFA. Modeled as a settings row (not an env var) per CLAUDE.md so\nan operator can flip it at runtime via the Settings API without\nrestarting the binary.", - "default": false + "type": "boolean" }, "screenshots": { - "oneOf": [ - { - "$ref": "#/components/schemas/ScreenshotSettings" - } - ], "default": { "enabled": false, "provider": "local", "url": "" - } - }, - "security_headers": { + }, "oneOf": [ { - "$ref": "#/components/schemas/SecurityHeadersSettings" + "$ref": "#/components/schemas/ScreenshotSettings" } - ], + ] + }, + "security_headers": { "default": { + "content_security_policy": "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'", "enabled": false, + "permissions_policy": "geolocation=(), microphone=(), camera=()", "preset": "moderate", - "content_security_policy": "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'", - "x_frame_options": "SAMEORIGIN", - "x_content_type_options": "nosniff", - "x_xss_protection": "1; mode=block", - "strict_transport_security": "max-age=31536000; includeSubDomains", "referrer_policy": "strict-origin-when-cross-origin", - "permissions_policy": "geolocation=(), microphone=(), camera=()" - } + "strict_transport_security": "max-age=31536000; includeSubDomains", + "x_content_type_options": "nosniff", + "x_frame_options": "SAMEORIGIN", + "x_xss_protection": "1; mode=block" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/SecurityHeadersSettings" + } + ] + }, + "self_update": { + "default": null, + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/SelfUpdateSettings", + "description": "One-click \"Update now\" from the console. Enabled by default; an admin\ncan turn it off here to keep upgrades on the CLI/config-management path.\n\nThis is the *soft* switch — it is stored in the database, so whoever can\nwrite settings can also turn it back on. Operators who need an upgrade\npath that no console session can re-open should start the server with\n`--disable-self-update`, which wins over this field unconditionally.\n`None` means the client did not express an opinion, NOT \"reset to\ndefault\". Every other field on this struct is safe to re-default on a\npartial write, but this one gates whether the server may replace its own\nbinary — silently flipping it back on because an older client PUT a\nsettings document without it would undo a deliberate security decision.\nThe update handler preserves the stored value when this is absent; read\nit through `self_update()`." + } + ] }, "setup_complete": { - "type": "boolean", + "default": false, "description": "Set to `true` by `temps setup` (all modes) once initial configuration\nhas been applied. The web onboarding wizard reads this from the server\nand skips itself when true, preventing the \"Configure Base Domain\" wall\nfrom appearing on installs that were already configured via the CLI.", - "default": false + "type": "boolean" } - } + }, + "type": "object" }, "AppSettingsResponse": { - "type": "object", "description": "Safe response for application settings that masks sensitive fields", - "required": [ - "preview_domain", - "screenshots", - "letsencrypt", - "dns_provider", - "security_headers", - "rate_limiting", - "docker_registry", - "disk_space_alert", - "container_logs", - "agent_sandbox", - "ai_config", - "preview_gateway", - "multi_node", - "monitoring", - "observability_compression", - "observability_retention", - "effective_metrics_store", - "effective_observability_store", - "insecure_tls", - "setup_complete", - "require_mfa_for_admins", - "cluster_dns", - "build_limits", - "ai_chat_limits" - ], "properties": { "agent_sandbox": { "$ref": "#/components/schemas/AgentSandboxSettingsMasked" @@ -2477,7 +2462,7 @@ }, "cluster_dns": { "$ref": "#/components/schemas/ClusterDnsSettings", - "description": "Cluster-DNS resolver settings (ADR-024, experimental beta). No masking\nneeded \u2014 `enabled` is a plain bool with no sensitive content. Passed\nthrough as-is so the settings UI can read and toggle the flag." + "description": "Cluster-DNS resolver settings (ADR-024, experimental beta). No masking\nneeded — `enabled` is a plain bool with no sensitive content. Passed\nthrough as-is so the settings UI can read and toggle the flag." }, "container_logs": { "$ref": "#/components/schemas/ContainerLogSettings" @@ -2492,15 +2477,15 @@ "$ref": "#/components/schemas/DockerRegistrySettingsMasked" }, "edge_target": { + "description": "Public edge target that synced DNS records point at (IP → A/AAAA, else CNAME).", "type": [ "string", "null" - ], - "description": "Public edge target that synced DNS records point at (IP \u2192 A/AAAA, else CNAME)." + ] }, "effective_metrics_store": { "$ref": "#/components/schemas/MetricsStoreKind", - "description": "The storage backend the runtime is **actually** using for metrics,\nafter reconciling the `monitoring.store` toggle with the server's\n`TEMPS_CLICKHOUSE_*` configuration. When `monitoring.store` is\n`click_house` but those env vars are not fully set, the runtime falls\nback to TimescaleDB \u2014 in that case this reports `timescale_db` even\nthough `monitoring.store` says `click_house`. The UI shows this as the\neffective backend and warns when it diverges from the configured store." + "description": "The storage backend the runtime is **actually** using for metrics,\nafter reconciling the `monitoring.store` toggle with the server's\n`TEMPS_CLICKHOUSE_*` configuration. When `monitoring.store` is\n`click_house` but those env vars are not fully set, the runtime falls\nback to TimescaleDB — in that case this reports `timescale_db` even\nthough `monitoring.store` says `click_house`. The UI shows this as the\neffective backend and warns when it diverges from the configured store." }, "effective_observability_store": { "$ref": "#/components/schemas/MetricsStoreKind", @@ -2525,13 +2510,13 @@ "$ref": "#/components/schemas/LetsEncryptSettings" }, "monitored_services_count": { + "description": "Number of enabled, running services the MetricsScraper currently\nincludes. Used for the lightweight storage estimate in the UI.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Number of enabled, running services the MetricsScraper currently\nincludes. Used for the lightweight storage estimate in the UI.", - "minimum": 0 + ] }, "monitoring": { "$ref": "#/components/schemas/MonitoringSettingsMasked" @@ -2557,8 +2542,8 @@ "$ref": "#/components/schemas/RateLimitSettings" }, "require_mfa_for_admins": { - "type": "boolean", - "description": "When enabled, Admin-role accounts without MFA enrolled are rejected\nat password login (bherila/temps#32). SSO/OIDC logins are unaffected." + "description": "When enabled, Admin-role accounts without MFA enrolled are rejected\nat password login (bherila/temps#32). SSO/OIDC logins are unaffected.", + "type": "boolean" }, "screenshots": { "$ref": "#/components/schemas/ScreenshotSettings" @@ -2566,34 +2551,62 @@ "security_headers": { "$ref": "#/components/schemas/SecurityHeadersSettings" }, + "self_update": { + "$ref": "#/components/schemas/SelfUpdateSettings", + "description": "Whether admins may apply a release from the console. This is the\ndatabase-backed toggle only — a server started with\n`--disable-self-update` refuses regardless of what this says, which\n`GET /settings/update` reports as the authoritative answer." + }, "setup_complete": { - "type": "boolean", - "description": "Whether `temps setup` has been run at least once. The web onboarding\nwizard checks this field on load and skips itself when true." + "description": "Whether `temps setup` has been run at least once. The web onboarding\nwizard checks this field on load and skips itself when true.", + "type": "boolean" } - } + }, + "required": [ + "preview_domain", + "screenshots", + "letsencrypt", + "dns_provider", + "security_headers", + "rate_limiting", + "docker_registry", + "disk_space_alert", + "container_logs", + "agent_sandbox", + "ai_config", + "preview_gateway", + "multi_node", + "monitoring", + "observability_compression", + "observability_retention", + "effective_metrics_store", + "effective_observability_store", + "insecure_tls", + "setup_complete", + "require_mfa_for_admins", + "cluster_dns", + "build_limits", + "ai_chat_limits", + "self_update" + ], + "type": "object" }, "ApplyHostnameModeRequest": { - "type": "object", "description": "Request to apply a hostname mode (recompute + optional DNS sync).", - "required": [ - "mode" - ], "properties": { "mode": { - "type": "string", - "description": "Target mode to apply: `\"standard\"` or `\"flat\"`." + "description": "Target mode to apply: `\"standard\"` or `\"flat\"`.", + "type": "string" }, "sync_dns": { - "type": "boolean", - "description": "Also reconcile the provider's DNS zone for the affected hostnames." + "description": "Also reconcile the provider's DNS zone for the affected hostnames.", + "type": "boolean" } - } - }, - "ArchiveFlagResponse": { - "type": "object", + }, "required": [ - "key" + "mode" ], + "type": "object" + }, + "ArchiveFlagResponse": { "properties": { "archived_at": { "type": [ @@ -2604,141 +2617,139 @@ "key": { "type": "string" } - } + }, + "required": [ + "key" + ], + "type": "object" }, "ArchiveMode": { - "type": "string", "enum": [ "off", "on", "always", "unknown" - ] + ], + "type": "string" }, "AssignRoleRequest": { - "type": "object", - "required": [ - "user_id", - "role_type" - ], "properties": { "role_type": { "type": "string" }, "user_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "AttachScheduleServicesRequest": { - "type": "object", - "description": "Body for `POST /api/backups/schedules/{id}/services` \u2014 attach external\nservices to a backup schedule. Idempotent.", + }, "required": [ - "service_ids" + "user_id", + "role_type" ], + "type": "object" + }, + "AttachScheduleServicesRequest": { + "description": "Body for `POST /api/backups/schedules/{id}/services` — attach external\nservices to a backup schedule. Idempotent.", "properties": { "service_ids": { - "type": "array", + "description": "External service ids to attach. Duplicates are de-duplicated server-side.", "items": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, - "description": "External service ids to attach. Duplicates are de-duplicated server-side." + "type": "array" } - } + }, + "required": [ + "service_ids" + ], + "type": "object" }, "AttachScheduleServicesResponse": { - "type": "object", "description": "Response for `POST /api/backups/schedules/{id}/services`.", - "required": [ - "inserted", - "total_attached" - ], "properties": { "inserted": { - "type": "integer", - "format": "int64", "description": "Number of rows actually inserted (excludes rows skipped by\n`ON CONFLICT DO NOTHING`).", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "total_attached": { - "type": "integer", "description": "Total number of services now attached to the schedule.", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "inserted", + "total_attached" + ], + "type": "object" }, "AuditLogIpInfo": { - "type": "object", "description": "IP address information in audit log", - "required": [ - "ip" - ], "properties": { "city": { + "description": "City name", + "example": "San Francisco", "type": [ "string", "null" - ], - "description": "City name", - "example": "San Francisco" + ] }, "country": { + "description": "Country code", + "example": "US", "type": [ "string", "null" - ], - "description": "Country code", - "example": "US" + ] }, "ip": { - "type": "string", "description": "IP address", - "example": "192.168.1.1" + "example": "192.168.1.1", + "type": "string" }, "latitude": { + "description": "Latitude", + "example": 37.7749, + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Latitude", - "example": 37.7749 + ] }, "longitude": { + "description": "Longitude", + "example": 122.4194, + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Longitude", - "example": 122.4194 + ] } - } + }, + "required": [ + "ip" + ], + "type": "object" }, "AuditLogResponse": { - "type": "object", "description": "Response type for audit log entries", - "required": [ - "id", - "operation_type", - "audit_date" - ], "properties": { "audit_date": { - "type": "integer", - "format": "int64", "description": "When the action occurred", - "example": 11932193 + "example": 11932193, + "format": "int64", + "type": "integer" }, "data": { "description": "Additional context about the action" }, "id": { - "type": "integer", + "description": "Unique identifier for the audit log entry", "format": "int32", - "description": "Unique identifier for the audit log entry" + "type": "integer" }, "ip_address": { "oneOf": [ @@ -2752,9 +2763,9 @@ ] }, "operation_type": { - "type": "string", "description": "The type of action that was performed", - "example": "USER_LOGIN" + "example": "USER_LOGIN", + "type": "string" }, "user": { "oneOf": [ @@ -2768,64 +2779,63 @@ ] }, "user_id": { + "description": "The user who performed the action (`null` when that account has\nsince been deleted; `data` retains the original actor context)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "The user who performed the action (`null` when that account has\nsince been deleted; `data` retains the original actor context)" + ] } - } - }, - "AuditLogUserInfo": { - "type": "object", - "description": "User information in audit log", + }, "required": [ "id", - "name", - "email" + "operation_type", + "audit_date" ], + "type": "object" + }, + "AuditLogUserInfo": { + "description": "User information in audit log", "properties": { "email": { - "type": "string", "description": "User's email", - "example": "john.doe@example.com" + "example": "john.doe@example.com", + "type": "string" }, "id": { - "type": "integer", + "description": "User ID", "format": "int32", - "description": "User ID" + "type": "integer" }, "name": { - "type": "string", "description": "User's name", - "example": "John Doe" + "example": "John Doe", + "type": "string" } - } - }, - "AuthFlavorDto": { - "type": "object", - "description": "One auth flavor surfaced to the UI. Mirrors `AuthFlavor` in the catalog\nbut without the seed-path / env-var fields the frontend doesn't need\n(those are server-side only \u2014 exposing them just bloats the response).", + }, "required": [ "id", - "label", - "description", - "format" + "name", + "email" ], + "type": "object" + }, + "AuthFlavorDto": { + "description": "One auth flavor surfaced to the UI. Mirrors `AuthFlavor` in the catalog\nbut without the seed-path / env-var fields the frontend doesn't need\n(those are server-side only — exposing them just bloats the response).", "properties": { "description": { "type": "string" }, "env_var": { + "description": "For `api_key` format: the env var name that will be set inside the\nsandbox. Useful for showing the user \"we'll set OPENAI_API_KEY\" so\nthey know what their key controls.", "type": [ "string", "null" - ], - "description": "For `api_key` format: the env var name that will be set inside the\nsandbox. Useful for showing the user \"we'll set OPENAI_API_KEY\" so\nthey know what their key controls." + ] }, "format": { - "type": "string", - "description": "`api_key`, `oauth_token`, or `config_file` \u2014 drives which input UI\nthe settings page renders (single-line vs. multi-line textarea)." + "description": "`api_key`, `oauth_token`, or `config_file` — drives which input UI\nthe settings page renders (single-line vs. multi-line textarea).", + "type": "string" }, "id": { "type": "string" @@ -2833,39 +2843,60 @@ "label": { "type": "string" } - } - }, - "AuthResponse": { - "type": "object", + }, "required": [ - "success", - "message", - "mfa_required" + "id", + "label", + "description", + "format" ], + "type": "object" + }, + "AuthResponse": { "properties": { "message": { "type": "string" }, + "mfa_enrollment_required": { + "type": "boolean" + }, "mfa_required": { "type": "boolean" }, + "mfa_setup": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/MfaSetupResponse" + } + ] + }, + "password_change_required": { + "type": "boolean" + }, "success": { "type": "boolean" }, "user_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } - }, - "AuthStatusResponse": { - "type": "object", + }, "required": [ - "status" + "success", + "message", + "mfa_required", + "mfa_enrollment_required", + "password_change_required" ], + "type": "object" + }, + "AuthStatusResponse": { "properties": { "cli_token": { "type": [ @@ -2876,88 +2907,82 @@ "status": { "type": "string" } - } - }, - "AuthTokenResponse": { - "type": "object", + }, "required": [ - "access_token", - "refresh_token", - "expires_at" + "status" ], + "type": "object" + }, + "AuthTokenResponse": { "properties": { "access_token": { "type": "string" }, "expires_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "refresh_token": { "type": "string" } - } + }, + "required": [ + "access_token", + "refresh_token", + "expires_at" + ], + "type": "object" }, "AutoWatchParams": { - "type": "object", - "description": "Auto-watch (Watchdog-style) detector parameters (stub \u2014 not evaluated).", + "description": "Auto-watch (Watchdog-style) detector parameters (stub — not evaluated).", "properties": { "direction": { "$ref": "#/components/schemas/Direction", "description": "The engine self-tunes the band; the user supplies only the direction." } - } + }, + "type": "object" }, "AutofixRunConfig": { - "type": "object", - "description": "User-chosen per-run options, persisted as JSON in `agent_runs.run_config`.\nEvery field is optional \u2014 unset fields fall back to the provider defaults\nin settings, then to built-in defaults.", + "description": "User-chosen per-run options, persisted as JSON in `agent_runs.run_config`.\nEvery field is optional — unset fields fall back to the provider defaults\nin settings, then to built-in defaults.", "properties": { "branch": { + "default": null, + "description": "Branch to clone instead of the project's main branch.", "type": [ "string", "null" - ], - "description": "Branch to clone instead of the project's main branch.", - "default": null + ] }, "max_turns": { + "default": null, + "description": "Per-run turn cap applied to every phase of this run. Only enforced\nfor CLIs with a turn flag (Claude Code); Codex/OpenCode run to\ncompletion. `None` uses the provider's per-phase defaults.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Per-run turn cap applied to every phase of this run. Only enforced\nfor CLIs with a turn flag (Claude Code); Codex/OpenCode run to\ncompletion. `None` uses the provider's per-phase defaults.", - "default": null + ] }, "model": { + "default": null, + "description": "Model id for the chosen provider. `None` uses the provider's saved\ndefault model, or the CLI's own default.", "type": [ "string", "null" - ], - "description": "Model id for the chosen provider. `None` uses the provider's saved\ndefault model, or the CLI's own default.", - "default": null + ] }, "provider": { + "default": null, + "description": "AI provider id (\"claude_cli\", \"codex_cli\", \"opencode\"). `None` uses\nthe platform default provider from agent sandbox settings.", "type": [ "string", "null" - ], - "description": "AI provider id (\"claude_cli\", \"codex_cli\", \"opencode\"). `None` uses\nthe platform default provider from agent sandbox settings.", - "default": null + ] } - } + }, + "type": "object" }, "AutofixerRunResponse": { - "type": "object", - "required": [ - "id", - "project_id", - "status", - "tokens_input", - "tokens_output", - "files_changed", - "created_at" - ], "properties": { "ai_model": { "type": [ @@ -2972,11 +2997,11 @@ ] }, "ai_provider": { + "description": "AI provider slug this run executes with (e.g. claude_cli, codex_cli).", "type": [ "string", "null" - ], - "description": "AI provider slug this run executes with (e.g. claude_cli, codex_cli)." + ] }, "analysis": { "type": [ @@ -3006,12 +3031,12 @@ ] }, "files_changed": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "phase": { "type": [ @@ -3020,11 +3045,11 @@ ] }, "pr_number": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "pr_url": { "type": [ @@ -3033,8 +3058,8 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "run_config": { "oneOf": [ @@ -3057,19 +3082,19 @@ "type": "string" }, "tokens_input": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "tokens_output": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trigger_source_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "user_context": { "type": [ @@ -3077,201 +3102,196 @@ "null" ] } - } - }, - "AutofixerRunWithLogsResponse": { - "type": "object", + }, "required": [ - "run", - "logs" + "id", + "project_id", + "status", + "tokens_input", + "tokens_output", + "files_changed", + "created_at" ], + "type": "object" + }, + "AutofixerRunWithLogsResponse": { "properties": { "logs": { - "type": "array", "items": { "$ref": "#/components/schemas/AgentRunLogResponse" - } + }, + "type": "array" }, "run": { "$ref": "#/components/schemas/AutofixerRunResponse" } - } - }, - "AvailableContainerInfo": { - "type": "object", - "description": "Available Docker container that can be imported as a service", + }, "required": [ - "container_id", - "container_name", - "image", - "version", - "service_type", - "is_running" + "run", + "logs" ], + "type": "object" + }, + "AvailableContainerInfo": { + "description": "Available Docker container that can be imported as a service", "properties": { "container_id": { - "type": "string", "description": "Container ID or name", - "example": "abc123def456" + "example": "abc123def456", + "type": "string" }, "container_name": { - "type": "string", "description": "Container display name", - "example": "my-postgres" + "example": "my-postgres", + "type": "string" }, "exposed_ports": { - "type": "array", + "description": "Exposed ports (e.g., [5432] for PostgreSQL, [6379] for Redis)", "items": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, - "description": "Exposed ports (e.g., [5432] for PostgreSQL, [6379] for Redis)" + "type": "array" }, "image": { - "type": "string", "description": "Docker image name (e.g., \"gotempsh/postgres-walg:18-bookworm\")", - "example": "gotempsh/postgres-walg:18-bookworm" + "example": "gotempsh/postgres-walg:18-bookworm", + "type": "string" }, "is_running": { - "type": "boolean", "description": "Whether the container is currently running", - "example": true + "example": true, + "type": "boolean" }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute", "description": "Service type this container represents" }, "version": { - "type": "string", "description": "Extracted version from image", - "example": "18" + "example": "18", + "type": "string" } - } + }, + "required": [ + "container_id", + "container_name", + "image", + "version", + "service_type", + "is_running" + ], + "type": "object" }, "AvailablePermissions": { - "type": "object", "description": "Response containing all available permissions for frontend validation", - "required": [ - "permissions", - "roles" - ], "properties": { "permissions": { - "type": "array", + "description": "All available permissions in the system", "items": { "$ref": "#/components/schemas/PermissionInfo" }, - "description": "All available permissions in the system" + "type": "array" }, "roles": { - "type": "array", + "description": "All available roles", "items": { "$ref": "#/components/schemas/RoleInfo" }, - "description": "All available roles" + "type": "array" } - } + }, + "required": [ + "permissions", + "roles" + ], + "type": "object" }, "BackupAlertListResponse": { - "type": "object", "description": "Response body for the list-backup-alerts endpoint.", - "required": [ - "alerts" - ], "properties": { "alerts": { - "type": "array", + "description": "All currently open (unresolved) alerts, newest first.", "items": { "$ref": "#/components/schemas/BackupAlertResponse" }, - "description": "All currently open (unresolved) alerts, newest first." + "type": "array" } - } - }, - "BackupAlertResponse": { - "type": "object", - "description": "A single open backup alert surfaced in the UI banner.\n\nAlerts are auto-opened by the watcher and auto-resolved when the triggering\ncondition clears. No manual dismiss is required or supported.\n\nThe optional `schedule_s3_source_id` field is included so the UI can\ndeep-link an `overdue_schedule` alert to the S3 source detail page that\nhosts the schedule. `stalled_job` alerts no longer carry a deep-link\ntarget \u2014 the alert message text contains the backup id for display.", + }, "required": [ - "id", - "kind", - "severity", - "message", - "opened_at" + "alerts" ], + "type": "object" + }, + "BackupAlertResponse": { + "description": "A single open backup alert surfaced in the UI banner.\n\nAlerts are auto-opened by the watcher and auto-resolved when the triggering\ncondition clears. No manual dismiss is required or supported.\n\nThe optional `schedule_s3_source_id` field is included so the UI can\ndeep-link an `overdue_schedule` alert to the S3 source detail page that\nhosts the schedule. `stalled_job` alerts no longer carry a deep-link\ntarget — the alert message text contains the backup id for display.", "properties": { "id": { - "type": "integer", + "description": "Database id of the alert row.", "format": "int64", - "description": "Database id of the alert row." + "type": "integer" }, "kind": { - "type": "string", - "description": "`\"overdue_schedule\"` or `\"stalled_job\"`." + "description": "`\"overdue_schedule\"` or `\"stalled_job\"`.", + "type": "string" }, "message": { - "type": "string", - "description": "Human-readable description of the alert condition." + "description": "Human-readable description of the alert condition.", + "type": "string" }, "opened_at": { - "type": "string", "description": "RFC 3339 timestamp when the alert was opened.", - "example": "2026-05-15T10:00:00Z" + "example": "2026-05-15T10:00:00Z", + "type": "string" }, "schedule_id": { + "description": "FK to `backup_schedules.id`. Set for `overdue_schedule` alerts.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "FK to `backup_schedules.id`. Set for `overdue_schedule` alerts." + ] }, "schedule_name": { + "description": "Human-readable name of the linked schedule, if applicable.", "type": [ "string", "null" - ], - "description": "Human-readable name of the linked schedule, if applicable." + ] }, "schedule_s3_source_id": { + "description": "FK to `backup_schedules.s3_source_id`. The UI uses this to deep-link\nthe alert to the S3 source detail page that hosts the schedule.\nSet for `overdue_schedule` alerts.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "FK to `backup_schedules.s3_source_id`. The UI uses this to deep-link\nthe alert to the S3 source detail page that hosts the schedule.\nSet for `overdue_schedule` alerts." + ] }, "severity": { - "type": "string", - "description": "`\"warning\"` or `\"critical\"`." + "description": "`\"warning\"` or `\"critical\"`.", + "type": "string" } - } - }, - "BackupResponse": { - "type": "object", - "description": "Response type for backup", + }, "required": [ "id", - "name", - "backup_id", - "backup_type", - "state", - "started_at", - "s3_source_id", - "s3_location", - "metadata", - "compression_type", - "created_by", - "tags" + "kind", + "severity", + "message", + "opened_at" ], + "type": "object" + }, + "BackupResponse": { + "description": "Response type for backup", "properties": { "attempts": { + "description": "How many times this job has been claimed and run. `null` for legacy\nbackups with no `backup_jobs` row.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "How many times this job has been claimed and run. `null` for legacy\nbackups with no `backup_jobs` row." + ] }, "backup_id": { "type": "string" @@ -3286,25 +3306,25 @@ ] }, "completed_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "compression_type": { "type": "string" }, "created_by": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "current_step": { + "description": "Name of the engine step currently executing (e.g., `\"walg_push\"`).\n`null` when no `backup_jobs` row exists for this backup (legacy rows\npre-dating ADR-014), or when the job has not yet completed its first step.", "type": [ "string", "null" - ], - "description": "Name of the engine step currently executing (e.g., `\"walg_push\"`).\n`null` when no `backup_jobs` row exists for this backup (legacy rows\npre-dating ADR-014), or when the job has not yet completed its first step." + ] }, "error_message": { "type": [ @@ -3313,11 +3333,11 @@ ] }, "expires_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "external_service": { "oneOf": [ @@ -3331,39 +3351,39 @@ ] }, "file_count": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "live_size_bytes": { + "description": "Best-effort partial size while a backup is still running, computed\nby listing the S3 prefix. Null when the backup is finished\n(`size_bytes` is authoritative in that case).", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Best-effort partial size while a backup is still running, computed\nby listing the S3 prefix. Null when the backup is finished\n(`size_bytes` is authoritative in that case)." + ] }, "max_attempts": { + "description": "Maximum attempts before the job is permanently failed. `null` for\nlegacy backups.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum attempts before the job is permanently failed. `null` for\nlegacy backups." + ] }, "max_runtime_secs": { + "description": "Resolved wall-clock timeout for this backup job (seconds). `null` for\nlegacy backups. Derived from the three-tier resolution order:\ncaller override → schedule override → engine default.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Resolved wall-clock timeout for this backup job (seconds). `null` for\nlegacy backups. Derived from the three-tier resolution order:\ncaller override \u2192 schedule override \u2192 engine default." + ] }, "metadata": {}, "name": { @@ -3373,63 +3393,63 @@ "type": "string" }, "s3_source_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "schedule_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "size_bytes": { + "description": "Final size of the backup once completed. Null while running.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Final size of the backup once completed. Null while running." + ] }, "started_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "state": { "type": "string" }, "tags": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "BackupScheduleResponse": { - "type": "object", - "description": "Response type for backup schedule", + }, "required": [ "id", "name", + "backup_id", "backup_type", - "retention_period", + "state", + "started_at", "s3_source_id", - "schedule_expression", - "enabled", - "created_at", - "updated_at", - "tags", - "target_all_services", - "include_control_plane" + "s3_location", + "metadata", + "compression_type", + "created_by", + "tags" ], + "type": "object" + }, + "BackupScheduleResponse": { + "description": "Response type for backup schedule", "properties": { "backup_type": { "type": "string" }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "description": { "type": [ @@ -3441,199 +3461,208 @@ "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "include_control_plane": { - "type": "boolean", - "description": "When `true`, every run also produces a `control_plane` backup\n(Temps's own Postgres). When `false`, only the external service\nfan-out happens." + "description": "When `true`, every run also produces a `control_plane` backup\n(Temps's own Postgres). When `false`, only the external service\nfan-out happens.", + "type": "boolean" }, "last_run": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "max_runtime_secs": { + "description": "Per-schedule wall-clock timeout override for backup jobs (seconds).\n`null` means the engine-family default is used. See\n`temps_backup_core::timeouts::default_max_runtime_secs`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Per-schedule wall-clock timeout override for backup jobs (seconds).\n`null` means the engine-family default is used. See\n`temps_backup_core::timeouts::default_max_runtime_secs`." + ] }, "name": { "type": "string" }, "next_run": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "retention_period": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "s3_source_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "schedule_expression": { - "type": "string", - "example": "0 0 * * *" + "example": "0 0 * * *", + "type": "string" }, "tags": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "target_all_services": { - "type": "boolean", - "description": "When `true`, the schedule auto-includes every external service on\nthe host (and any future ones). When `false`, the schedule only\ntargets services attached via `backup_schedule_services`." + "description": "When `true`, the schedule auto-includes every external service on\nthe host (and any future ones). When `false`, the schedule only\ntargets services attached via `backup_schedule_services`.", + "type": "boolean" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "id", + "name", + "backup_type", + "retention_period", + "s3_source_id", + "schedule_expression", + "enabled", + "created_at", + "updated_at", + "tags", + "target_all_services", + "include_control_plane" + ], + "type": "object" }, "BitbucketAuthInput": { + "description": "Authentication input for a Bitbucket Cloud provider. Use `access_token` for\na Repository or Workspace Access Token (PAT), or `username` + `app_password`\nfor App Password (HTTP Basic) authentication.", "oneOf": [ { - "type": "object", "description": "Personal / Workspace / Repository Access Token.", - "required": [ - "token", - "type" - ], "properties": { "token": { - "type": "string", - "description": "The Bitbucket access token value." + "description": "The Bitbucket access token value.", + "type": "string" }, "type": { - "type": "string", "enum": [ "access_token" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "HTTP Basic / App Password authentication.", + }, "required": [ - "username", - "password", + "token", "type" ], + "type": "object" + }, + { + "description": "HTTP Basic / App Password authentication.", "properties": { "password": { - "type": "string", - "description": "App password generated in Bitbucket security settings." + "description": "App password generated in Bitbucket security settings.", + "type": "string" }, "type": { - "type": "string", "enum": [ "app_password" - ] + ], + "type": "string" }, "username": { - "type": "string", - "description": "Bitbucket account username." + "description": "Bitbucket account username.", + "type": "string" } - } + }, + "required": [ + "username", + "password", + "type" + ], + "type": "object" } - ], - "description": "Authentication input for a Bitbucket Cloud provider. Use `access_token` for\na Repository or Workspace Access Token (PAT), or `username` + `app_password`\nfor App Password (HTTP Basic) authentication." + ] }, "BlobResponse": { - "type": "object", "description": "Response after uploading a blob", - "required": [ - "url", - "pathname", - "contentType", - "size", - "uploadedAt" - ], "properties": { "contentType": { - "type": "string", "description": "Content type of the blob", - "example": "image/png" + "example": "image/png", + "type": "string" }, "pathname": { - "type": "string", "description": "Original pathname", - "example": "images/avatar-abc123.png" + "example": "images/avatar-abc123.png", + "type": "string" }, "size": { - "type": "integer", - "format": "int64", "description": "Size in bytes", - "example": 12345 + "example": 12345, + "format": "int64", + "type": "integer" }, "uploadedAt": { - "type": "string", - "format": "date-time", "description": "Upload timestamp", - "example": "2025-01-03T12:00:00Z" + "example": "2025-01-03T12:00:00Z", + "format": "date-time", + "type": "string" }, "url": { - "type": "string", "description": "URL path to access the blob", - "example": "/api/blob/123/images/avatar-abc123.png" + "example": "/api/blob/123/images/avatar-abc123.png", + "type": "string" } - } + }, + "required": [ + "url", + "pathname", + "contentType", + "size", + "uploadedAt" + ], + "type": "object" }, "BlobStatusResponse": { - "type": "object", "description": "Response for Blob service status", - "required": [ - "enabled", - "healthy" - ], "properties": { "docker_image": { + "description": "Docker image being used", + "example": "ghcr.io/rustfs/rustfs:0.5.0", "type": [ "string", "null" - ], - "description": "Docker image being used", - "example": "ghcr.io/rustfs/rustfs:0.5.0" + ] }, "enabled": { - "type": "boolean", "description": "Whether the Blob service is enabled", - "example": true + "example": true, + "type": "boolean" }, "healthy": { - "type": "boolean", "description": "Whether the service is healthy", - "example": true + "example": true, + "type": "boolean" }, "version": { + "description": "Current version (if running)", + "example": "0.5.0", "type": [ "string", "null" - ], - "description": "Current version (if running)", - "example": "0.5.0" + ] } - } - }, - "BranchInfo": { - "type": "object", + }, "required": [ - "name", - "commit_sha", - "protected" + "enabled", + "healthy" ], + "type": "object" + }, + "BranchInfo": { "properties": { "commit_sha": { "type": "string" @@ -3644,180 +3673,182 @@ "protected": { "type": "boolean" } - } - }, - "BranchListResponse": { - "type": "object", + }, "required": [ - "branches" + "name", + "commit_sha", + "protected" ], + "type": "object" + }, + "BranchListResponse": { "properties": { "branches": { - "type": "array", "items": { "$ref": "#/components/schemas/BranchInfo" - } + }, + "type": "array" } - } - }, - "BrowserCount": { - "type": "object", + }, "required": [ - "browser", - "count", - "percentage" + "branches" ], + "type": "object" + }, + "BrowserCount": { "properties": { "browser": { "type": "string" }, "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "BrowsersQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "browser", + "count", + "percentage" ], + "type": "object" + }, + "BrowsersQuery": { "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" }, "BuildConfiguration": { - "type": "object", "description": "Build configuration (for building images from source)", - "required": [ - "context", - "args" - ], "properties": { "args": { - "type": "object", - "description": "Build arguments", "additionalProperties": { "type": "string" }, + "description": "Build arguments", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "context": { - "type": "string", - "description": "Build context (Dockerfile path or buildpack)" + "description": "Build context (Dockerfile path or buildpack)", + "type": "string" }, "dockerfile": { + "description": "Dockerfile path (relative to context)", "type": [ "string", "null" - ], - "description": "Dockerfile path (relative to context)" + ] }, "target": { + "description": "Target stage (for multi-stage builds)", "type": [ "string", "null" - ], - "description": "Target stage (for multi-stage builds)" + ] } - } + }, + "required": [ + "context", + "args" + ], + "type": "object" }, "BuildLimitsSettings": { - "type": "object", - "description": "Control-plane build resource limits.\n\nCaps how many builds run concurrently AND how much CPU/memory each build\nis allowed to consume. A single global semaphore in the deployer crate\ngates every `DockerRuntime::build_image` call to `max_concurrent`. When\nthe semaphore is full, additional builds queue and wait \u2014 they do not\nfail. Per-build CPU/memory caps are forwarded to Docker via\n`BuildImageOptions { memory, cpuquota, cpuperiod }`.\n\n`cpu_limit_cores = 0.0` or `memory_limit_mb = 0` means \"no explicit cap\"\n\u2014 fall back to the legacy 50%-of-host heuristic for backwards\ncompatibility with operators who never visit the settings page.", + "description": "Control-plane build resource limits.\n\nCaps how many builds run concurrently AND how much CPU/memory each build\nis allowed to consume. A single global semaphore in the deployer crate\ngates every `DockerRuntime::build_image` call to `max_concurrent`. When\nthe semaphore is full, additional builds queue and wait — they do not\nfail. Per-build CPU/memory caps are forwarded to Docker via\n`BuildImageOptions { memory, cpuquota, cpuperiod }`.\n\n`cpu_limit_cores = 0.0` or `memory_limit_mb = 0` means \"no explicit cap\"\n— fall back to the legacy 50%-of-host heuristic for backwards\ncompatibility with operators who never visit the settings page.", "properties": { "cpu_limit_cores": { - "type": "number", - "format": "float", + "default": 0, "description": "CPU cores allowed per build (float, e.g. 2.0 = 2 cores, 0.5 = half\na core). 0 means \"use the legacy 50%-of-host default\".", - "default": 0.0, - "example": 2.0, - "minimum": 0 + "example": 2, + "format": "float", + "minimum": 0, + "type": "number" }, "max_concurrent": { - "type": "integer", - "format": "int32", - "description": "Maximum number of `docker build` operations allowed to run at the\nsame time on the control plane. Additional builds queue. Min 1.", "default": 2, + "description": "Maximum number of `docker build` operations allowed to run at the\nsame time on the control plane. Additional builds queue. Min 1.", "example": 2, - "minimum": 1 + "format": "int32", + "minimum": 1, + "type": "integer" }, "memory_limit_mb": { - "type": "integer", - "format": "int32", - "description": "Memory allowed per build, in megabytes. 0 means \"use the legacy\n50%-of-host default\". Docker enforces this as a hard cap \u2014 builds\nthat exceed it OOM-kill.", "default": 0, + "description": "Memory allowed per build, in megabytes. 0 means \"use the legacy\n50%-of-host default\". Docker enforces this as a hard cap — builds\nthat exceed it OOM-kill.", "example": 2048, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" } - } + }, + "type": "object" }, "CancelBackupResponse": { - "type": "object", "description": "Response body for cancel endpoints.", - "required": [ - "cancelled" - ], "properties": { "cancelled": { - "type": "integer", + "description": "Number of rows that were actually flipped to `failed`. `0` is a valid\nsuccess and means the backup was already terminal — the call is\nidempotent.", "format": "int64", - "description": "Number of rows that were actually flipped to `failed`. `0` is a valid\nsuccess and means the backup was already terminal \u2014 the call is\nidempotent.", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "CertStatusResponse": { - "type": "object", - "description": "Current on-demand cert status for a single hostname (ADR-018 \u00a75). Backs\n`GET /domains/by-host/{hostname}/cert-status`.", + }, "required": [ - "hostname" + "cancelled" ], + "type": "object" + }, + "CertStatusResponse": { + "description": "Current on-demand cert status for a single hostname (ADR-018 §5). Backs\n`GET /domains/by-host/{hostname}/cert-status`.", "properties": { "backoff_until": { + "description": "On-demand negative-cache deadline (epoch millis), when in backoff.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "On-demand negative-cache deadline (epoch millis), when in backoff." + ] }, "hostname": { - "type": "string", - "description": "SNI hostname." + "description": "SNI hostname.", + "type": "string" }, "last_attempt": { "oneOf": [ @@ -3831,72 +3862,69 @@ ] }, "status": { + "description": "Current cert lifecycle status from the `domains` row, when one exists.", "type": [ "string", "null" - ], - "description": "Current cert lifecycle status from the `domains` row, when one exists." + ] } - } + }, + "required": [ + "hostname" + ], + "type": "object" }, "ChallengeConfig": { - "type": "object", "description": "Challenge configuration (future feature)\nFor CAPTCHA, JS challenges, proof-of-work, etc.", - "required": [ - "challengeType", - "difficulty" - ], "properties": { "challengeType": { - "type": "string", - "description": "Challenge type: \"captcha\", \"js_challenge\", \"proof_of_work\"" + "description": "Challenge type: \"captcha\", \"js_challenge\", \"proof_of_work\"", + "type": "string" }, "difficulty": { - "type": "integer", - "format": "int32", "description": "Challenge difficulty level (1-10)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "protectedPaths": { - "type": "array", + "description": "Paths that require challenges", "items": { "type": "string" }, - "description": "Paths that require challenges" + "type": "array" } - } - }, - "ChallengeError": { - "type": "object", + }, "required": [ - "type", - "detail", - "status" + "challengeType", + "difficulty" ], + "type": "object" + }, + "ChallengeError": { "properties": { "detail": { - "type": "string", - "description": "Human-readable error description" + "description": "Human-readable error description", + "type": "string" }, "status": { - "type": "integer", + "description": "HTTP status code", "format": "int32", - "description": "HTTP status code" + "type": "integer" }, "type": { - "type": "string", - "description": "Error type (e.g., \"urn:ietf:params:acme:error:unauthorized\")" + "description": "Error type (e.g., \"urn:ietf:params:acme:error:unauthorized\")", + "type": "string" } - } - }, - "ChallengeValidationStatus": { - "type": "object", + }, "required": [ "type", - "url", - "status", - "token" + "detail", + "status" ], + "type": "object" + }, + "ChallengeValidationStatus": { "properties": { "error": { "oneOf": [ @@ -3910,77 +3938,79 @@ ] }, "status": { - "type": "string", - "description": "Challenge status (e.g., \"pending\", \"valid\", \"invalid\")" + "description": "Challenge status (e.g., \"pending\", \"valid\", \"invalid\")", + "type": "string" }, "token": { - "type": "string", - "description": "Challenge token" + "description": "Challenge token", + "type": "string" }, "type": { - "type": "string", - "description": "Challenge type (e.g., \"dns-01\", \"http-01\")" + "description": "Challenge type (e.g., \"dns-01\", \"http-01\")", + "type": "string" }, "url": { - "type": "string", - "description": "Challenge validation URL" + "description": "Challenge validation URL", + "type": "string" }, "validated": { + "description": "When the challenge was validated (if successful)", "type": [ "string", "null" - ], - "description": "When the challenge was validated (if successful)" + ] } - } - }, - "ChangePasswordRequest": { - "type": "object", + }, "required": [ - "current_password", - "new_password" + "type", + "url", + "status", + "token" ], + "type": "object" + }, + "ChangePasswordRequest": { "properties": { "current_password": { - "type": "string", - "example": "current_password_value" + "example": "current_password_value", + "type": "string" }, "mfa_code": { + "description": "TOTP code (or recovery code). Required iff the user has MFA enabled.", + "example": "123456", "type": [ "string", "null" - ], - "description": "TOTP code (or recovery code). Required iff the user has MFA enabled.", - "example": "123456" + ] }, "new_password": { - "type": "string", - "example": "new_password_value" + "example": "new_password_value", + "type": "string" }, "revoke_other_sessions": { - "type": "boolean", - "description": "When true, every session OTHER than the one making this request is\nrevoked. Defaults to false; the UI surfaces this as a checkbox." + "description": "When true, every session OTHER than the one making this request is\nrevoked. Defaults to false; the UI surfaces this as a checkbox.", + "type": "boolean" } - } + }, + "required": [ + "current_password", + "new_password" + ], + "type": "object" }, "ChangeProjectSourceRequest": { - "type": "object", "description": "Change a project's source type to a Git-less type (docker_image /\nstatic_files / manual). Switching TO `git` is done via the Git settings\nendpoint (which also supplies the repository + provider connection).", - "required": [ - "source_type" - ], "properties": { "source_type": { "$ref": "#/components/schemas/SourceType" } - } - }, - "ChatCompletionChoice": { - "type": "object", + }, "required": [ - "index", - "message" + "source_type" ], + "type": "object" + }, + "ChatCompletionChoice": { "properties": { "finish_reason": { "type": [ @@ -3989,78 +4019,78 @@ ] }, "index": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "$ref": "#/components/schemas/ChatMessage" } - } + }, + "required": [ + "index", + "message" + ], + "type": "object" }, "ChatCompletionRequest": { "allOf": [ { - "type": [ - "object", - "null" - ], - "description": "Tolerates extra SDK fields (stream_options, logprobs, etc.)", "additionalProperties": {}, + "description": "Tolerates extra SDK fields (stream_options, logprobs, etc.)", "propertyNames": { "type": "string" - } + }, + "type": [ + "object", + "null" + ] }, { - "type": "object", - "required": [ - "model", - "messages" - ], "properties": { "frequency_penalty": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "max_tokens": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "messages": { - "type": "array", "items": { "$ref": "#/components/schemas/ChatMessage" - } + }, + "type": "array" }, "model": { "type": "string" }, "n": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "presence_penalty": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "response_format": {}, "seed": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "stop": { "oneOf": [ @@ -4076,26 +4106,26 @@ "type": "boolean" }, "temperature": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "tool_choice": {}, "tools": { + "items": {}, "type": [ "array", "null" - ], - "items": {} + ] }, "top_p": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "user": { "type": [ @@ -4103,30 +4133,27 @@ "null" ] } - } - } - ], - "description": "OpenAI-compatible chat completion request.\nUses `deny_unknown_fields = false` (serde default) so that SDK-specific\nfields like `stream_options`, `logprobs`, `top_logprobs`, `logit_bias`,\n`parallel_tool_calls`, etc. are silently accepted without breaking." + }, + "required": [ + "model", + "messages" + ], + "type": "object" + } + ], + "description": "OpenAI-compatible chat completion request.\nUses `deny_unknown_fields = false` (serde default) so that SDK-specific\nfields like `stream_options`, `logprobs`, `top_logprobs`, `logit_bias`,\n`parallel_tool_calls`, etc. are silently accepted without breaking." }, "ChatCompletionResponse": { - "type": "object", - "required": [ - "id", - "object", - "created", - "model", - "choices" - ], "properties": { "choices": { - "type": "array", "items": { "$ref": "#/components/schemas/ChatCompletionChoice" - } + }, + "type": "array" }, "created": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "id": { "type": "string" @@ -4147,13 +4174,17 @@ } ] } - } - }, - "ChatMessage": { - "type": "object", + }, "required": [ - "role" + "id", + "object", + "created", + "model", + "choices" ], + "type": "object" + }, + "ChatMessage": { "properties": { "content": { "oneOf": [ @@ -4181,165 +4212,164 @@ ] }, "tool_calls": { + "items": {}, "type": [ "array", "null" - ], - "items": {} + ] } - } + }, + "required": [ + "role" + ], + "type": "object" }, "ChatReadinessResponse": { - "type": "object", "description": "What still has to be true before an AI chat can run a turn in this project.\n\nThe three gates are independent and fail for different reasons with different\nfixes, so they are reported separately rather than collapsed into one boolean:\nan instance admin configures a provider (instance-wide), while the two toggles\nare per-project. Collapsing them would leave the user with \"AI unavailable\"\nand no idea which of three places to go.", - "required": [ - "ai_configured", - "chat_enabled", - "write_actions_enabled" - ], "properties": { "ai_configured": { - "type": "boolean", - "description": "An AI provider is configured on this instance. Fixed in\nSettings \u2192 AI Providers; instance-wide, not per project." + "description": "An AI provider is configured on this instance. Fixed in\nSettings → AI Providers; instance-wide, not per project.", + "type": "boolean" }, "chat_enabled": { - "type": "boolean", - "description": "The per-project read-only chat toggle is on (the default)." + "description": "The per-project read-only chat toggle is on (the default).", + "type": "boolean" }, "write_actions_enabled": { - "type": "boolean", - "description": "The per-project write-actions opt-in is on. Required for any flow where\nthe assistant *proposes* changes; irrelevant for read-only questions." + "description": "The per-project write-actions opt-in is on. Required for any flow where\nthe assistant *proposes* changes; irrelevant for read-only questions.", + "type": "boolean" } - } + }, + "required": [ + "ai_configured", + "chat_enabled", + "write_actions_enabled" + ], + "type": "object" }, "ChildBackupEntryResponse": { - "type": "object", "description": "A single child backup entry in the `GET /backups/{id}/children` response.\n\nEach entry corresponds to one `external_service_backups` row joined with\n`external_services`, providing service metadata without a second request.", - "required": [ - "id", - "service_id", - "service_name", - "service_type", - "state", - "backup_type", - "started_at", - "s3_location", - "compression_type" - ], "properties": { "backup_type": { - "type": "string", - "description": "Backup variant (e.g. \"full\", \"incremental\")." + "description": "Backup variant (e.g. \"full\", \"incremental\").", + "type": "string" }, "compression_type": { - "type": "string", - "description": "Compression algorithm used (e.g. \"gzip\", \"lz4\")." + "description": "Compression algorithm used (e.g. \"gzip\", \"lz4\").", + "type": "string" }, "error_message": { + "description": "Engine-reported error message when `state = \"failed\"`.", "type": [ "string", "null" - ], - "description": "Engine-reported error message when `state = \"failed\"`." + ] }, "finished_at": { + "description": "When the child backup finished, if known.", + "example": "2025-01-15T14:35:00.456Z", "type": [ "string", "null" - ], - "description": "When the child backup finished, if known.", - "example": "2025-01-15T14:35:00.456Z" + ] }, "id": { - "type": "integer", + "description": "Row ID from `external_service_backups`.", "format": "int32", - "description": "Row ID from `external_service_backups`." + "type": "integer" }, "s3_location": { - "type": "string", - "description": "Object key or `s3://` URL where the backup data lives." + "description": "Object key or `s3://` URL where the backup data lives.", + "type": "string" }, "service_id": { - "type": "integer", + "description": "FK to `external_services.id`.", "format": "int32", - "description": "FK to `external_services.id`." + "type": "integer" }, "service_name": { - "type": "string", - "description": "Human-readable name of the external service (e.g. \"redis-prod\")." + "description": "Human-readable name of the external service (e.g. \"redis-prod\").", + "type": "string" }, "service_type": { - "type": "string", "description": "Service type string (e.g. \"postgres\", \"redis\", \"mongodb\", \"s3\").", - "example": "postgres" + "example": "postgres", + "type": "string" }, "size_bytes": { + "description": "Size of the child backup in bytes, if available.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size of the child backup in bytes, if available." + ] }, "started_at": { - "type": "string", "description": "When the child backup started (RFC 3339).", - "example": "2025-01-15T14:30:00.123Z" + "example": "2025-01-15T14:30:00.123Z", + "type": "string" }, "state": { - "type": "string", - "description": "Current state: \"pending\" | \"running\" | \"completed\" | \"failed\"." + "description": "Current state: \"pending\" | \"running\" | \"completed\" | \"failed\".", + "type": "string" } - } + }, + "required": [ + "id", + "service_id", + "service_name", + "service_type", + "state", + "backup_type", + "started_at", + "s3_location", + "compression_type" + ], + "type": "object" }, "ChildBackupListResponse": { - "type": "object", "description": "Response body for `GET /backups/{id}/children`.\n\nReturns an empty `children` list (not 404) when the parent backup has no\nchild records (e.g. control-plane backups).", - "required": [ - "children" - ], "properties": { "children": { - "type": "array", + "description": "Zero or more child backup entries ordered by `external_service_backups.id` ASC.", "items": { "$ref": "#/components/schemas/ChildBackupEntryResponse" }, - "description": "Zero or more child backup entries ordered by `external_service_backups.id` ASC." + "type": "array" } - } + }, + "required": [ + "children" + ], + "type": "object" }, "CleanupExpiredBackupsRequest": { - "type": "object", "properties": { "expected_backup_ids": { - "type": [ - "array", - "null" - ], + "description": "Exact candidates returned by the dry run. Execution fails if the\nretention selection has changed since preview.", "items": { "type": "string" }, - "description": "Exact candidates returned by the dry run. Execution fails if the\nretention selection has changed since preview." + "type": [ + "array", + "null" + ] } - } + }, + "type": "object" }, "CliDeviceApproveRequest": { - "type": "object", - "required": [ - "user_code" - ], "properties": { "user_code": { "type": "string" } - } - }, - "CliDeviceApproveResponse": { - "type": "object", + }, "required": [ - "user_code", - "status" + "user_code" ], + "type": "object" + }, + "CliDeviceApproveResponse": { "properties": { "status": { "type": "string" @@ -4347,15 +4377,14 @@ "user_code": { "type": "string" } - } - }, - "CliDeviceLookupResponse": { - "type": "object", + }, "required": [ "user_code", - "status", - "expires_at" + "status" ], + "type": "object" + }, + "CliDeviceLookupResponse": { "properties": { "client_name": { "type": [ @@ -4364,8 +4393,8 @@ ] }, "expires_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "requested_ip": { "type": [ @@ -4374,98 +4403,95 @@ ] }, "status": { - "type": "string", - "description": "`pending` | `approved` | `denied` | `expired`." + "description": "`pending` | `approved` | `denied` | `expired`.", + "type": "string" }, "user_code": { "type": "string" } - } - }, - "CliDevicePollRequest": { - "type": "object", + }, "required": [ - "device_code" + "user_code", + "status", + "expires_at" ], + "type": "object" + }, + "CliDevicePollRequest": { "properties": { "device_code": { "type": "string" } - } + }, + "required": [ + "device_code" + ], + "type": "object" }, "CliDevicePollResponse": { "oneOf": [ { - "type": "object", "description": "Still waiting on the user to approve in the browser.", - "required": [ - "status" - ], "properties": { "status": { - "type": "string", "enum": [ "authorization_pending" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "CLI is polling faster than the server-suggested interval.", + }, "required": [ "status" ], + "type": "object" + }, + { + "description": "CLI is polling faster than the server-suggested interval.", "properties": { "status": { - "type": "string", "enum": [ "slow_down" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "User denied the request in the browser.", + }, "required": [ "status" ], + "type": "object" + }, + { + "description": "User denied the request in the browser.", "properties": { "status": { - "type": "string", "enum": [ "access_denied" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "The session has expired without approval.", + }, "required": [ "status" ], + "type": "object" + }, + { + "description": "The session has expired without approval.", "properties": { "status": { - "type": "string", "enum": [ "expired_token" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "The session was approved; this is the only response that carries\nthe API key. The key is returned exactly once and then cleared\nfrom the session row.", + }, "required": [ - "user_id", - "email", - "role", - "api_key", - "key_prefix", "status" ], + "type": "object" + }, + { + "description": "The session was approved; this is the only response that carries\nthe API key. The key is returned exactly once and then cleared\nfrom the session row.", "properties": { "api_key": { "type": "string" @@ -4474,11 +4500,11 @@ "type": "string" }, "expires_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "key_prefix": { "type": "string" @@ -4487,80 +4513,84 @@ "type": "string" }, "status": { - "type": "string", "enum": [ "approved" - ] + ], + "type": "string" }, "user_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "user_id", + "email", + "role", + "api_key", + "key_prefix", + "status" + ], + "type": "object" } ] }, "CliDeviceStartRequest": { - "type": "object", "properties": { "client_name": { + "description": "Friendly hostname / client identifier shown in the browser approval\nscreen. Sanitized before display.", + "example": "dviejo-mac.local", "type": [ "string", "null" - ], - "description": "Friendly hostname / client identifier shown in the browser approval\nscreen. Sanitized before display.", - "example": "dviejo-mac.local" + ] } - } + }, + "type": "object" }, "CliDeviceStartResponse": { - "type": "object", - "required": [ - "device_code", - "user_code", - "verification_uri", - "verification_uri_complete", - "expires_in", - "interval" - ], "properties": { "device_code": { - "type": "string", - "description": "Opaque secret the CLI polls with. Never display to a human." + "description": "Opaque secret the CLI polls with. Never display to a human.", + "type": "string" }, "expires_in": { - "type": "integer", + "description": "Seconds until the device_code expires.", "format": "int64", - "description": "Seconds until the device_code expires." + "type": "integer" }, "interval": { - "type": "integer", + "description": "Suggested polling interval, in seconds.", "format": "int64", - "description": "Suggested polling interval, in seconds." + "type": "integer" }, "user_code": { - "type": "string", "description": "Short human-readable code the user types into the browser.", - "example": "ABCD-1234" + "example": "ABCD-1234", + "type": "string" }, "verification_uri": { - "type": "string", - "description": "Base verification URL \u2014 the CLI may display this when the\npre-filled URL is too long to be useful.", - "example": "https://temps.example.com/cli-login" + "description": "Base verification URL — the CLI may display this when the\npre-filled URL is too long to be useful.", + "example": "https://temps.example.com/cli-login", + "type": "string" }, "verification_uri_complete": { - "type": "string", "description": "`verification_uri` with `user_code` pre-filled. Open this directly.", - "example": "https://temps.example.com/cli-login/ABCD-1234" + "example": "https://temps.example.com/cli-login/ABCD-1234", + "type": "string" } - } - }, - "CliLoginRequest": { - "type": "object", + }, "required": [ - "username", - "password" + "device_code", + "user_code", + "verification_uri", + "verification_uri_complete", + "expires_in", + "interval" ], + "type": "object" + }, + "CliLoginRequest": { "properties": { "password": { "type": "string" @@ -4568,10 +4598,14 @@ "username": { "type": "string" } - } + }, + "required": [ + "username", + "password" + ], + "type": "object" }, "CloudProvider": { - "type": "string", "description": "Cloud provider detected from node metadata", "enum": [ "aws", @@ -4580,147 +4614,136 @@ "hetzner", "digitalocean", "other" - ] + ], + "type": "string" }, "CloudflareConfig": { - "type": "object", - "description": "Configuration for a Cloudflare Email Sending notification provider.\n\nNotifications are delivered through Cloudflare's transactional Email Sending\nAPI. Only the account, token, sender and recipients are configured here \u2014\nsubject and body are derived from each notification.", - "required": [ - "account_id", - "api_token", - "from_address", - "to_addresses" - ], + "description": "Configuration for a Cloudflare Email Sending notification provider.\n\nNotifications are delivered through Cloudflare's transactional Email Sending\nAPI. Only the account, token, sender and recipients are configured here —\nsubject and body are derived from each notification.", "properties": { "account_id": { - "type": "string", "description": "Cloudflare account id that owns the Email Sending configuration.", - "example": "023e105f4ecef8ad9ca31a8372d0c353" + "example": "023e105f4ecef8ad9ca31a8372d0c353", + "type": "string" }, "api_token": { - "type": "string", - "description": "Cloudflare API token with the Email Sending permission. Encrypted at\nrest and masked in normal API responses." + "description": "Cloudflare API token with the Email Sending permission. Encrypted at\nrest and masked in normal API responses.", + "type": "string" }, "from_address": { - "type": "string", "description": "Verified sender address (must belong to a domain enabled for Cloudflare\nEmail Sending).", - "example": "welcome@infracf.example.com" + "example": "welcome@infracf.example.com", + "type": "string" }, "from_name": { + "description": "Optional human-friendly sender name shown in the recipient's inbox.", "type": [ "string", "null" - ], - "description": "Optional human-friendly sender name shown in the recipient's inbox." + ] }, "to_addresses": { - "type": "array", + "description": "Recipients that should receive the notification.", "items": { "type": "string" }, - "description": "Recipients that should receive the notification." + "type": "array" } - } + }, + "required": [ + "account_id", + "api_token", + "from_address", + "to_addresses" + ], + "type": "object" }, "ClusterCapacity": { - "type": "object", "description": "Total cluster capacity (sum of node allocatable resources)", - "required": [ - "node_count", - "cpu_millis", - "memory_mb" - ], "properties": { "cpu_millis": { - "type": "integer", + "description": "Total allocatable CPU in millicores", "format": "int64", - "description": "Total allocatable CPU in millicores" + "type": "integer" }, "memory_mb": { - "type": "integer", + "description": "Total allocatable memory in MB", "format": "int64", - "description": "Total allocatable memory in MB" + "type": "integer" }, "node_count": { - "type": "integer", "description": "Number of nodes", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "node_count", + "cpu_millis", + "memory_mb" + ], + "type": "object" }, "ClusterDnsSettings": { - "type": "object", - "description": "Cluster-DNS resolver settings (ADR-024, experimental beta).\n\nWhen `enabled`, the Temps control plane starts a Hickory DNS resolver and\ninjects it as the first nameserver into every deployed container via\n`HostConfig.Dns` \u2014 giving containers the ability to resolve `*.temps.local`\nFQDNs for service-to-service communication. Worker nodes pick this flag up\nfrom the `/api/internal/nodes/{id}/network/peers` wire response and gate\ntheir own per-node resolver the same way.\n\n**Default: `false` (disabled).**\n\nWhy disabled by default: a production incident showed that when the injected\nHickory resolver was slow or transiently unresponsive for a non-`*.temps.local`\n(external) hostname, glibc's resolver cycled through all three nameservers\n(`172.20.0.1`, `1.1.1.1`, `8.8.8.8`) at ~5 s timeout \u00d7 2 attempts each,\ncausing 22\u201327 s delays for outbound TCP connections. Disabling the injection\nrestores Docker's embedded DNS as the sole resolver, eliminating that failure\nmode. Operators running single/multi-node installs that depend on\n`*.temps.local` resolution must explicitly opt in by setting `enabled: true`.\n\n`bool` defaults to `false` in Rust and JSON (`#[serde(default)]`), so the\nsafe-off behaviour is automatic for new installs and legacy settings rows.", + "description": "Cluster-DNS resolver settings (ADR-024, experimental beta).\n\nWhen `enabled`, the Temps control plane starts a Hickory DNS resolver and\ninjects it as the first nameserver into every deployed container via\n`HostConfig.Dns` — giving containers the ability to resolve `*.temps.local`\nFQDNs for service-to-service communication. Worker nodes pick this flag up\nfrom the `/api/internal/nodes/{id}/network/peers` wire response and gate\ntheir own per-node resolver the same way.\n\n**Default: `false` (disabled).**\n\nWhy disabled by default: a production incident showed that when the injected\nHickory resolver was slow or transiently unresponsive for a non-`*.temps.local`\n(external) hostname, glibc's resolver cycled through all three nameservers\n(`172.20.0.1`, `1.1.1.1`, `8.8.8.8`) at ~5 s timeout × 2 attempts each,\ncausing 22–27 s delays for outbound TCP connections. Disabling the injection\nrestores Docker's embedded DNS as the sole resolver, eliminating that failure\nmode. Operators running single/multi-node installs that depend on\n`*.temps.local` resolution must explicitly opt in by setting `enabled: true`.\n\n`bool` defaults to `false` in Rust and JSON (`#[serde(default)]`), so the\nsafe-off behaviour is automatic for new installs and legacy settings rows.", "properties": { "enabled": { - "type": "boolean", - "description": "Master switch. When `false` (default), no custom DNS is injected into\ncontainers \u2014 they use Docker's embedded DNS which forwards to the host's\nown `resolv.conf`. When `true`, the control-plane Hickory resolver is\nstarted and its bridge IP is injected as the first nameserver so\n`*.temps.local` FQDNs resolve inside containers.", "default": false, - "example": false + "description": "Master switch. When `false` (default), no custom DNS is injected into\ncontainers — they use Docker's embedded DNS which forwards to the host's\nown `resolv.conf`. When `true`, the control-plane Hickory resolver is\nstarted and its bridge IP is injected as the first nameserver so\n`*.temps.local` FQDNs resolve inside containers.", + "example": false, + "type": "boolean" } - } + }, + "type": "object" }, "ClusterHealthReportResponse": { - "type": "object", "description": "Response body for `GET /external-services/{id}/cluster-health`.", - "required": [ - "checked_at", - "monitor_response_ms", - "members" - ], "properties": { "checked_at": { - "type": "string", "description": "ISO-8601 wall-clock when the report was generated.", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "members": { - "type": "array", "items": { "$ref": "#/components/schemas/ClusterMemberHealthResponse" - } + }, + "type": "array" }, "monitor_error": { + "description": "Set when the monitor itself was unreachable. UI shows a banner.", "type": [ "string", "null" - ], - "description": "Set when the monitor itself was unreachable. UI shows a banner." + ] }, "monitor_response_ms": { - "type": "integer", + "description": "Round-trip to query the monitor (ms).", "format": "int64", - "description": "Round-trip to query the monitor (ms)." + "type": "integer" } - } - }, - "ClusterMemberHealthResponse": { - "type": "object", - "description": "One row in the cluster Members table \u2014 see `GET /external-services/{id}/cluster-health`.", + }, "required": [ - "nodename", - "nodehost", - "nodeport", - "reported_state", - "goal_state", - "health", - "seconds_since_report", - "candidate_priority", - "replication_quorum" + "checked_at", + "monitor_response_ms", + "members" ], + "type": "object" + }, + "ClusterMemberHealthResponse": { + "description": "One row in the cluster Members table — see `GET /external-services/{id}/cluster-health`.", "properties": { "candidate_priority": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "goal_state": { - "type": "string", - "description": "What the monitor *wants* the node to be. Differs from\n`reported_state` mid-transition (failover, demotion, etc.)." + "description": "What the monitor *wants* the node to be. Differs from\n`reported_state` mid-transition (failover, demotion, etc.).", + "type": "string" }, "health": { - "type": "integer", + "description": "pg_auto_failover liveness signal: `1` healthy, `0` unknown\n(no recent report), `-1` unhealthy.", "format": "int32", - "description": "pg_auto_failover liveness signal: `1` healthy, `0` unknown\n(no recent report), `-1` unhealthy." + "type": "integer" }, "nodehost": { "type": "string" @@ -4729,131 +4752,134 @@ "type": "string" }, "nodeport": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "replay_lag_ms": { + "description": "`replay_lag` from `pg_stat_replication`, in milliseconds.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "`replay_lag` from `pg_stat_replication`, in milliseconds." + ] }, "replication_quorum": { "type": "boolean" }, "reported_state": { - "type": "string", - "description": "What the node *last told the monitor* it was. Stale during outages." + "description": "What the node *last told the monitor* it was. Stale during outages.", + "type": "string" }, "seconds_since_report": { - "type": "integer", + "description": "Wall-clock seconds since the node last reported in.", "format": "int64", - "description": "Wall-clock seconds since the node last reported in." + "type": "integer" }, "sync_state": { + "description": "`sync` / `quorum` / `async` for secondaries; `null` for the primary.", "type": [ "string", "null" - ], - "description": "`sync` / `quorum` / `async` for secondaries; `null` for the primary." + ] } - } + }, + "required": [ + "nodename", + "nodehost", + "nodeport", + "reported_state", + "goal_state", + "health", + "seconds_since_report", + "candidate_priority", + "replication_quorum" + ], + "type": "object" }, "ClusterMemberRequest": { - "type": "object", "description": "Request spec for a single cluster member.", - "required": [ - "role" - ], "properties": { "node_id": { + "description": "Target worker node ID. Omit or null to run on the control plane.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Target worker node ID. Omit or null to run on the control plane." + ] }, "role": { - "type": "string", "description": "Service-type-specific role (e.g., \"monitor\", \"primary\", \"replica\")", - "example": "primary" + "example": "primary", + "type": "string" } - } - }, - "CmdBody": { - "type": "object", + }, "required": [ - "command" + "role" ], + "type": "object" + }, + "CmdBody": { "properties": { "args": { - "type": "array", + "description": "Arguments to pass to the binary. Defaults to empty.", "items": { "type": "string" }, - "description": "Arguments to pass to the binary. Defaults to empty." + "type": "array" }, "command": { - "type": "string", - "description": "Binary name (argv[0]) \u2014 e.g. `\"ls\"`, `\"node\"`. The SDK sends this\nseparately from `args`." + "description": "Binary name (argv[0]) — e.g. `\"ls\"`, `\"node\"`. The SDK sends this\nseparately from `args`.", + "type": "string" }, "cwd": { + "description": "Working directory override.", "type": [ "string", "null" - ], - "description": "Working directory override." + ] }, "env": { - "type": "object", - "description": "Extra env vars.", "additionalProperties": { "type": "string" }, + "description": "Extra env vars.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "sudo": { - "type": "boolean", - "description": "When true, the SDK runs the command privileged. We ignore it today\n\u2014 the underlying provider always runs as the sandbox's own user." + "description": "When true, the SDK runs the command privileged. We ignore it today\n— the underlying provider always runs as the sandbox's own user.", + "type": "boolean" }, "wait": { - "type": "boolean", - "description": "When true, the response is an `application/x-ndjson` stream where\nthe first line is the running-command envelope and the second line\nis the finished-command envelope with `exitCode`." + "description": "When true, the response is an `application/x-ndjson` stream where\nthe first line is the running-command envelope and the second line\nis the finished-command envelope with `exitCode`.", + "type": "boolean" } - } - }, - "CmdInner": { - "type": "object", - "description": "Inner `command` object \u2014 matches the SDK's zod validator exactly.\n`exitCode` is `null` until the command terminates; `startedAt` is Unix\nepoch milliseconds.", + }, "required": [ - "id", - "name", - "args", - "cwd", - "sandboxId", - "startedAt" + "command" ], + "type": "object" + }, + "CmdInner": { + "description": "Inner `command` object — matches the SDK's zod validator exactly.\n`exitCode` is `null` until the command terminates; `startedAt` is Unix\nepoch milliseconds.", "properties": { "args": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "cwd": { "type": "string" }, "exitCode": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { "type": "string" @@ -4865,38 +4891,43 @@ "type": "string" }, "startedAt": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "id", + "name", + "args", + "cwd", + "sandboxId", + "startedAt" + ], + "type": "object" }, "CmdKillBody": { - "type": "object", "description": "SDK-shaped kill body. The SDK sends `{signal: AbortSignal}` but only\nuses the signal for HTTP request abortion client-side; there's no\nsignal name on the wire.", "properties": { "force": { - "type": "boolean", - "description": "Optional: when true, SIGKILL instead of SIGTERM." + "description": "Optional: when true, SIGKILL instead of SIGTERM.", + "type": "boolean" } - } + }, + "type": "object" }, "CmdResponse": { - "type": "object", "description": "`@vercel/sandbox` envelope: `{ command: {...} }`.", - "required": [ - "command" - ], "properties": { "command": { "$ref": "#/components/schemas/CmdInner" } - } - }, - "CommitExistsResponse": { - "type": "object", + }, "required": [ - "exists" + "command" ], + "type": "object" + }, + "CommitExistsResponse": { "properties": { "commit": { "oneOf": [ @@ -4918,88 +4949,91 @@ "exists": { "type": "boolean" } - } - }, - "CommitInfo": { - "type": "object", + }, "required": [ - "sha", - "message", - "author", - "author_email", - "date" + "exists" ], + "type": "object" + }, + "CommitInfo": { "properties": { "author": { - "type": "string", - "description": "Author name" + "description": "Author name", + "type": "string" }, "author_email": { - "type": "string", - "description": "Author email" + "description": "Author email", + "type": "string" }, "date": { - "type": "string", - "format": "date-time", "description": "Commit date in ISO 8601 format", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "format": "date-time", + "type": "string" }, "message": { - "type": "string", - "description": "Commit message" + "description": "Commit message", + "type": "string" }, "sha": { - "type": "string", - "description": "Commit SHA hash" + "description": "Commit SHA hash", + "type": "string" } - } - }, - "CommitListResponse": { - "type": "object", + }, "required": [ - "commits" + "sha", + "message", + "author", + "author_email", + "date" ], + "type": "object" + }, + "CommitListResponse": { "properties": { "commits": { - "type": "array", "items": { "$ref": "#/components/schemas/CommitInfo" - } + }, + "type": "array" } - } + }, + "required": [ + "commits" + ], + "type": "object" }, "Comparator": { - "type": "string", "description": "Comparator for static/forecast threshold detectors. Serializes to the\nkeyword forms `gt|gte|lt|lte` (NOT the SQL operators used by\n`temps-monitoring::compare`).", "enum": [ "gt", "gte", "lt", "lte" - ] + ], + "type": "string" }, "ComposePublicPort": { - "type": "object", "description": "A port that should be exposed publicly through the proxy for a compose service.", - "required": [ - "service", - "port" - ], "properties": { "port": { - "type": "integer", - "format": "int32", "description": "Container port to expose (e.g. 8123)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "service": { - "type": "string", - "description": "Compose service name (e.g. \"web\", \"clickhouse\")" + "description": "Compose service name (e.g. \"web\", \"clickhouse\")", + "type": "string" } - } + }, + "required": [ + "service", + "port" + ], + "type": "object" }, "ConnectionListQuery": { - "type": "object", "properties": { "direction": { "type": [ @@ -5008,20 +5042,20 @@ ] }, "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "per_page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "sort": { "type": [ @@ -5029,55 +5063,41 @@ "null" ] } - } + }, + "type": "object" }, "ConnectionListResponse": { - "type": "object", - "required": [ - "connections", - "total_count", - "page", - "per_page" - ], "properties": { "connections": { - "type": "array", "items": { "$ref": "#/components/schemas/ConnectionResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "per_page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ConnectionResponse": { - "type": "object", + }, "required": [ - "id", - "provider_id", - "account_name", - "account_type", - "is_active", - "is_expired", - "syncing", - "synced_repository_count", - "health_status", - "consecutive_health_failures", - "created_at", - "updated_at" + "connections", + "total_count", + "page", + "per_page" ], + "type": "object" + }, + "ConnectionResponse": { "properties": { "account_name": { "type": "string" @@ -5086,27 +5106,27 @@ "type": "string" }, "consecutive_health_failures": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "health_message": { + "description": "Human-readable reason when health_status is \"unhealthy\"; null otherwise.", "type": [ "string", "null" - ], - "description": "Human-readable reason when health_status is \"unhealthy\"; null otherwise." + ] }, "health_status": { - "type": "string", - "description": "Current health status: \"healthy\", \"unhealthy\", or \"unknown\"." + "description": "Current health status: \"healthy\", \"unhealthy\", or \"unknown\".", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "installation_id": { "type": [ @@ -5121,51 +5141,61 @@ "type": "boolean" }, "last_health_check_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "last_synced_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "provider_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "synced_repository_count": { - "type": "integer", + "description": "Running count of repositories persisted by the current (or most\nrecent) sync. Resets to 0 when a new sync begins; useful for showing\nlive progress on large syncs.", "format": "int32", - "description": "Running count of repositories persisted by the current (or most\nrecent) sync. Resets to 0 when a new sync begins; useful for showing\nlive progress on large syncs." + "type": "integer" }, "syncing": { "type": "boolean" }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "user_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "required": [ + "id", + "provider_id", + "account_name", + "account_type", + "is_active", + "is_expired", + "syncing", + "synced_repository_count", + "health_status", + "consecutive_health_failures", + "created_at", + "updated_at" + ], + "type": "object" }, "ConnectionTestResult": { - "type": "object", "description": "Connection test result", - "required": [ - "success", - "message" - ], "properties": { "message": { "type": "string" @@ -5173,68 +5203,65 @@ "success": { "type": "boolean" } - } + }, + "required": [ + "success", + "message" + ], + "type": "object" }, "ConsoleEventPayload": { - "type": "object", "description": "Payload for server-side event ingestion via the console API.\n\nThe app backend reads the encrypted `_temps_visitor_id` and `_temps_sid`\ncookie values from the user's request and forwards them here.\nTemps decrypts them server-side to resolve visitor/session identity.", - "required": [ - "event_name", - "environment_id", - "deployment_id" - ], "properties": { "deployment_id": { - "type": "integer", + "description": "Deployment ID to attribute the event to", "format": "int32", - "description": "Deployment ID to attribute the event to" + "type": "integer" }, "environment_id": { - "type": "integer", + "description": "Environment ID to attribute the event to", "format": "int32", - "description": "Environment ID to attribute the event to" + "type": "integer" }, "event_data": { "description": "Arbitrary JSON event data" }, "event_name": { - "type": "string", - "description": "Event name (e.g. \"purchase\", \"signup\", custom event names)" + "description": "Event name (e.g. \"purchase\", \"signup\", custom event names)", + "type": "string" }, "request_path": { - "type": "string", - "description": "Page path context (defaults to \"/\")" + "description": "Page path context (defaults to \"/\")", + "type": "string" }, "request_query": { - "type": "string", - "description": "Query string context" + "description": "Query string context", + "type": "string" }, "session_id": { + "description": "Encrypted `_temps_sid` cookie value from the user's browser", "type": [ "string", "null" - ], - "description": "Encrypted `_temps_sid` cookie value from the user's browser" + ] }, "visitor_id": { + "description": "Encrypted `_temps_visitor_id` cookie value from the user's browser", "type": [ "string", "null" - ], - "description": "Encrypted `_temps_visitor_id` cookie value from the user's browser" + ] } - } + }, + "required": [ + "event_name", + "environment_id", + "deployment_id" + ], + "type": "object" }, "ContainerActionResponse": { - "type": "object", "description": "Response indicating success of container state change", - "required": [ - "container_id", - "container_name", - "action", - "status", - "message" - ], "properties": { "action": { "type": "string" @@ -5251,23 +5278,18 @@ "status": { "type": "string" } - } - }, - "ContainerDetailResponse": { - "type": "object", - "description": "Detailed container information with environment variables and metrics", + }, "required": [ - "id", "container_id", "container_name", - "image_name", + "action", "status", - "deployment_id", - "created_at", - "deployed_at", - "container_port", - "environment_variables" + "message" ], + "type": "object" + }, + "ContainerDetailResponse": { + "description": "Detailed container information with environment variables and metrics", "properties": { "container_id": { "type": "string" @@ -5276,95 +5298,95 @@ "type": "string" }, "container_port": { - "type": "integer", + "description": "Port inside the container", "format": "int32", - "description": "Port inside the container" + "type": "integer" }, "cpu_limit_cores": { + "description": "CPU limit in whole cores (e.g. 1.0). None when no limit is configured.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "CPU limit in whole cores (e.g. 1.0). None when no limit is configured." + ] }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "deployed_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "deployment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "environment_variables": { - "type": "array", + "description": "Environment variables (sensitive values masked)", "items": { "$ref": "#/components/schemas/EnvVarResponse" }, - "description": "Environment variables (sensitive values masked)" + "type": "array" }, "error_message": { + "description": "Free-form error string from Docker's container state on exit.", "type": [ "string", "null" - ], - "description": "Free-form error string from Docker's container state on exit." + ] }, "exit_code": { + "description": "Process exit code reported by Docker. None while still running.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Process exit code reported by Docker. None while still running." + ] }, "exit_reason": { + "description": "Human-readable reason the container exited.", "type": [ "string", "null" - ], - "description": "Human-readable reason the container exited." + ] }, "finished_at": { + "description": "When the container exited (Docker's FinishedAt). None while running.", + "example": "2025-10-12T12:16:47.609192Z", "type": [ "string", "null" - ], - "description": "When the container exited (Docker's FinishedAt). None while running.", - "example": "2025-10-12T12:16:47.609192Z" + ] }, "host_port": { + "description": "Port on the host machine", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Port on the host machine" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "image_name": { "type": "string" }, "oom_killed": { + "description": "True when Docker's OOM killer terminated the container.", "type": [ "boolean", "null" - ], - "description": "True when Docker's OOM killer terminated the container." + ] }, "ready_at": { + "example": "2025-10-12T12:16:47.609192Z", "type": [ "string", "null" - ], - "example": "2025-10-12T12:16:47.609192Z" + ] }, "resource_limits": { "oneOf": [ @@ -5378,60 +5400,65 @@ ] }, "restart_count": { + "description": "Container restart count from Docker", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Container restart count from Docker" + ] }, "service_name": { + "description": "Compose service name (e.g. \"web\", \"redis\"). None for single-container deployments.", "type": [ "string", "null" - ], - "description": "Compose service name (e.g. \"web\", \"redis\"). None for single-container deployments." + ] }, "service_url": { + "description": "Per-service URL for compose deployments", "type": [ "string", "null" - ], - "description": "Per-service URL for compose deployments" + ] }, "started_at": { + "description": "When the container's main process most recently started.", + "example": "2025-10-12T12:15:50.000000Z", "type": [ "string", "null" - ], - "description": "When the container's main process most recently started.", - "example": "2025-10-12T12:15:50.000000Z" + ] }, "status": { "type": "string" } - } - }, - "ContainerEnvironmentVariableValueResponse": { - "type": "object", + }, "required": [ - "value" + "id", + "container_id", + "container_name", + "image_name", + "status", + "deployment_id", + "created_at", + "deployed_at", + "container_port", + "environment_variables" ], + "type": "object" + }, + "ContainerEnvironmentVariableValueResponse": { "properties": { "value": { "type": "string" } - } - }, - "ContainerInfoResponse": { - "type": "object", + }, "required": [ - "container_id", - "container_name", - "image_name", - "status", - "created_at" + "value" ], + "type": "object" + }, + "ContainerInfoResponse": { "properties": { "container_id": { "type": "string" @@ -5440,197 +5467,204 @@ "type": "string" }, "cpu_limit_cores": { + "description": "CPU limit in whole cores (e.g. 1.0). None when no limit is configured.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "CPU limit in whole cores (e.g. 1.0). None when no limit is configured." + ] }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "error_message": { + "description": "Free-form error string from Docker's container state on exit.", "type": [ "string", "null" - ], - "description": "Free-form error string from Docker's container state on exit." + ] }, "exit_code": { + "description": "Process exit code reported by Docker. None while still running.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Process exit code reported by Docker. None while still running." + ] }, "exit_reason": { + "description": "Human-readable reason the container exited (e.g. \"OOMKilled\",\n\"Killed by SIGKILL (exit code 137)\", \"Exit code 1\"). None while running.", "type": [ "string", "null" - ], - "description": "Human-readable reason the container exited (e.g. \"OOMKilled\",\n\"Killed by SIGKILL (exit code 137)\", \"Exit code 1\"). None while running." + ] }, "finished_at": { + "description": "When the container exited (Docker's FinishedAt). None while running.", + "example": "2025-10-12T12:16:47.609192Z", "type": [ "string", "null" - ], - "description": "When the container exited (Docker's FinishedAt). None while running.", - "example": "2025-10-12T12:16:47.609192Z" + ] }, "image_name": { "type": "string" }, "node_name": { + "description": "Node name where this container is running. None for local (single-node) deployments.", "type": [ "string", "null" - ], - "description": "Node name where this container is running. None for local (single-node) deployments." + ] }, "oom_killed": { + "description": "True when Docker's OOM killer terminated the container.", "type": [ "boolean", "null" - ], - "description": "True when Docker's OOM killer terminated the container." + ] }, "restart_count": { + "description": "Container restart count from Docker. The UI shows a chip when this is\n> 0 so a crash loop is visible without opening detail.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Container restart count from Docker. The UI shows a chip when this is\n> 0 so a crash loop is visible without opening detail." + ] }, "service_name": { + "description": "Compose service name (e.g. \"web\", \"redis\"). None for single-container deployments.", "type": [ "string", "null" - ], - "description": "Compose service name (e.g. \"web\", \"redis\"). None for single-container deployments." + ] }, "service_url": { + "description": "Per-service URL for compose deployments (e.g. \"https://web-myapp.localho.st\")", "type": [ "string", "null" - ], - "description": "Per-service URL for compose deployments (e.g. \"https://web-myapp.localho.st\")" + ] }, "started_at": { + "description": "When the container's main process most recently started. The UI uses\nthis for the uptime label so the count resets when a container is\nrestarted in place. None for containers that never started.", + "example": "2025-10-12T12:15:50.000000Z", "type": [ "string", "null" - ], - "description": "When the container's main process most recently started. The UI uses\nthis for the uptime label so the count resets when a container is\nrestarted in place. None for containers that never started.", - "example": "2025-10-12T12:15:50.000000Z" + ] }, "status": { "type": "string" } - } - }, - "ContainerInventoryItem": { - "type": "object", - "description": "A container reported by the agent during heartbeat reconciliation.", + }, "required": [ "container_id", - "container_name" + "container_name", + "image_name", + "status", + "created_at" ], + "type": "object" + }, + "ContainerInventoryItem": { + "description": "A container reported by the agent during heartbeat reconciliation.", "properties": { "container_id": { - "type": "string", - "description": "Docker container ID" + "description": "Docker container ID", + "type": "string" }, "container_name": { - "type": "string", - "description": "Docker container name" + "description": "Docker container name", + "type": "string" } - } - }, - "ContainerListResponse": { - "type": "object", + }, "required": [ - "containers", - "total" + "container_id", + "container_name" ], + "type": "object" + }, + "ContainerListResponse": { "properties": { "containers": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerInfoResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "containers", + "total" + ], + "type": "object" }, "ContainerLogSettings": { - "type": "object", "description": "Docker container log rotation settings\nControls the `--log-opt max-size` and `--log-opt max-file` for containers", "properties": { "max_file": { - "type": "integer", - "format": "int32", - "description": "Maximum number of rotated log files to keep (e.g., 3 means up to 3 x max_size total)", "default": 3, + "description": "Maximum number of rotated log files to keep (e.g., 3 means up to 3 x max_size total)", "example": 3, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "max_size": { - "type": "string", - "description": "Maximum size of each log file (e.g., \"50m\", \"100m\", \"1g\")\nDocker default is unlimited; we default to \"50m\" to prevent disk exhaustion", "default": "50m", - "example": "50m" + "description": "Maximum size of each log file (e.g., \"50m\", \"100m\", \"1g\")\nDocker default is unlimited; we default to \"50m\" to prevent disk exhaustion", + "example": "50m", + "type": "string" }, "service_max_file": { - "type": "integer", - "format": "int32", - "description": "Maximum rotated log files for external service containers", "default": 3, + "description": "Maximum rotated log files for external service containers", "example": 3, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "service_max_size": { - "type": "string", - "description": "Maximum size for external service container logs (postgres, redis, etc.)\nDefaults to \"20m\" since services are typically less verbose than app containers", "default": "20m", - "example": "20m" + "description": "Maximum size for external service container logs (postgres, redis, etc.)\nDefaults to \"20m\" since services are typically less verbose than app containers", + "example": "20m", + "type": "string" } - } + }, + "type": "object" }, "ContainerLogsQuery": { - "type": "object", "properties": { "container_name": { + "description": "Optional container name to get logs from (if deployment has multiple containers)", "type": [ "string", "null" - ], - "description": "Optional container name to get logs from (if deployment has multiple containers)" + ] }, "end_date": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "follow": { - "type": "boolean", - "description": "Follow log output in real-time (default: true for backward compatibility)" + "description": "Follow log output in real-time (default: true for backward compatibility)", + "type": "boolean" }, "start_date": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "tail": { "type": [ @@ -5639,60 +5673,51 @@ ] }, "timestamps": { - "type": "boolean", - "description": "Include timestamps in log output (default: false)" + "description": "Include timestamps in log output (default: false)", + "type": "boolean" } - } + }, + "type": "object" }, "ContainerMetricHistoryPoint": { - "type": "object", "description": "One bucketed data point of a container resource metric time series.", - "required": [ - "time", - "value" - ], "properties": { "time": { - "type": "string", "description": "Bucket timestamp (ISO 8601 with `Z` suffix).", - "example": "2025-10-12T12:15:00+00:00" + "example": "2025-10-12T12:15:00+00:00", + "type": "string" }, "value": { - "type": "number", + "description": "Averaged metric value for the bucket.", "format": "double", - "description": "Averaged metric value for the bucket." + "type": "number" } - } + }, + "required": [ + "time", + "value" + ], + "type": "object" }, "ContainerMetricsHistoryQuery": { - "type": "object", "description": "Query parameters for the container metrics history endpoint.", - "required": [ - "metric" - ], "properties": { "metric": { - "type": "string", - "description": "Dotted metric name, e.g. `container.cpu_percent` or\n`container.memory_used_bytes`." + "description": "Dotted metric name, e.g. `container.cpu_percent` or\n`container.memory_used_bytes`.", + "type": "string" }, "range": { - "type": "string", - "description": "Time window: `1h`, `6h`, `24h`, or `7d` (defaults to `1h`)." + "description": "Time window: `1h`, `6h`, `24h`, or `7d` (defaults to `1h`).", + "type": "string" } - } + }, + "required": [ + "metric" + ], + "type": "object" }, "ContainerMetricsResponse": { - "type": "object", "description": "Container resource metrics (CPU, memory usage)", - "required": [ - "container_id", - "container_name", - "cpu_percent", - "memory_bytes", - "network_rx_bytes", - "network_tx_bytes", - "timestamp" - ], "properties": { "container_id": { "type": "string" @@ -5701,264 +5726,270 @@ "type": "string" }, "cpu_limit_cores": { + "description": "CPU limit in whole cores (e.g. 1.0). None = no limit.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "CPU limit in whole cores (e.g. 1.0). None = no limit." + ] }, "cpu_percent": { - "type": "number", + "description": "CPU usage as a multi-core percentage (Docker convention: 200 = 2 cores\nfully pinned). Divide by 100 to get cores used.", "format": "double", - "description": "CPU usage as a multi-core percentage (Docker convention: 200 = 2 cores\nfully pinned). Divide by 100 to get cores used." + "type": "number" }, "memory_bytes": { - "type": "integer", - "format": "int64", "description": "Memory usage in bytes", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "memory_limit_bytes": { + "description": "Memory limit in bytes (if set)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Memory limit in bytes (if set)", - "minimum": 0 + ] }, "memory_percent": { + "description": "Memory usage percentage (0-100) if limit is set", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Memory usage percentage (0-100) if limit is set" + ] }, "network_rx_bytes": { - "type": "integer", - "format": "int64", "description": "Network bytes received", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "network_tx_bytes": { - "type": "integer", - "format": "int64", "description": "Network bytes transmitted", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "timestamp": { - "type": "string", "description": "Timestamp of metrics collection", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" } - } - }, - "ContainerResponse": { - "type": "object", + }, "required": [ - "name", - "container_type", - "can_contain_containers", - "can_contain_entities", - "metadata" + "container_id", + "container_name", + "cpu_percent", + "memory_bytes", + "network_rx_bytes", + "network_tx_bytes", + "timestamp" ], + "type": "object" + }, + "ContainerResponse": { "properties": { "can_contain_containers": { - "type": "boolean", "description": "Can this container hold other containers?", - "example": true + "example": true, + "type": "boolean" }, "can_contain_entities": { - "type": "boolean", "description": "Can this container hold entities (tables, collections, etc.)?", - "example": false + "example": false, + "type": "boolean" }, "child_container_type": { + "description": "Type of child containers (if can_contain_containers is true)", + "example": "schema", "type": [ "string", "null" - ], - "description": "Type of child containers (if can_contain_containers is true)", - "example": "schema" + ] }, "container_type": { - "type": "string", "description": "Container type (database, schema, keyspace, bucket, etc.)", - "example": "database" + "example": "database", + "type": "string" }, "entity_count_hint": { + "description": "Hint for UI on expected entity count (small = sidebar, large = pagination)", + "example": "large", "type": [ "string", "null" - ], - "description": "Hint for UI on expected entity count (small = sidebar, large = pagination)", - "example": "large" + ] }, "entity_type_label": { + "description": "Label for entity type (if can_contain_entities is true)", + "example": "table", "type": [ "string", "null" - ], - "description": "Label for entity type (if can_contain_entities is true)", - "example": "table" + ] }, "metadata": { "description": "Additional metadata" }, "name": { - "type": "string", "description": "Container name", - "example": "mydb" + "example": "mydb", + "type": "string" } - } - }, - "ContainerRuntimeInfo": { - "type": "object", - "description": "Snapshot of a container's lifecycle state from `docker inspect`.\n`restart_count` and `oom_killed` are the load-bearing fields when\ndiagnosing crash loops \u2014 the kernel OOM killer never reaches the\napplication's logs, so seeing `oom_killed=true` is the only signal\nthat a memory limit was the cause.", + }, "required": [ - "role", - "container_name", - "resource_limits" + "name", + "container_type", + "can_contain_containers", + "can_contain_entities", + "metadata" ], + "type": "object" + }, + "ContainerRuntimeInfo": { + "description": "Snapshot of a container's lifecycle state from `docker inspect`.\n`restart_count` and `oom_killed` are the load-bearing fields when\ndiagnosing crash loops — the kernel OOM killer never reaches the\napplication's logs, so seeing `oom_killed=true` is the only signal\nthat a memory limit was the cause.", "properties": { "container_id": { + "description": "Container Docker id, when present. None = container does not exist\n(was never created or was removed externally).", "type": [ "string", "null" - ], - "description": "Container Docker id, when present. None = container does not exist\n(was never created or was removed externally)." + ] }, "container_name": { - "type": "string", - "description": "Stable name of the Docker container (e.g. `postgres-mydb`)." + "description": "Stable name of the Docker container (e.g. `postgres-mydb`).", + "type": "string" }, "exit_code": { + "description": "Last container exit code, when known. Non-zero = unclean stop.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Last container exit code, when known. Non-zero = unclean stop." + ] }, "finished_at": { + "description": "ISO-8601 timestamp of the most recent termination, when known.", "type": [ "string", "null" - ], - "description": "ISO-8601 timestamp of the most recent termination, when known." + ] }, "image": { + "description": "Currently-effective Docker image (e.g. `gotempsh/postgres-walg:18-bookworm`).", "type": [ "string", "null" - ], - "description": "Currently-effective Docker image (e.g. `gotempsh/postgres-walg:18-bookworm`)." + ] }, "oom_killed": { + "description": "True when the container's last termination was caused by the\nkernel OOM killer. Set if the user enabled hard memory limits\nand the working set exceeded them.", "type": [ "boolean", "null" - ], - "description": "True when the container's last termination was caused by the\nkernel OOM killer. Set if the user enabled hard memory limits\nand the working set exceeded them." + ] }, "resource_limits": { "$ref": "#/components/schemas/ServiceResourceLimits", "description": "Currently-applied resource limits read off the container's\n`HostConfig`. Compare this against the user-configured limits to\ndetect drift (an old container that never picked up new caps)." }, "restart_count": { + "description": "Total restarts since the container was created. Useful for\ndetecting crash loops — a steady stream means something is killing\nthe container repeatedly (frequently OOM).", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total restarts since the container was created. Useful for\ndetecting crash loops \u2014 a steady stream means something is killing\nthe container repeatedly (frequently OOM)." + ] }, "role": { - "type": "string", - "description": "`service_members.role` for cluster members; \"standalone\" otherwise." + "description": "`service_members.role` for cluster members; \"standalone\" otherwise.", + "type": "string" }, "started_at": { + "description": "ISO-8601 timestamp of when the container last started. None when\nit has never started (i.e. created but never run).", "type": [ "string", "null" - ], - "description": "ISO-8601 timestamp of when the container last started. None when\nit has never started (i.e. created but never run)." + ] }, "status": { + "description": "Bollard container state (\"running\", \"exited\", \"dead\", etc.). None\nwhen the container does not exist.", "type": [ "string", "null" - ], - "description": "Bollard container state (\"running\", \"exited\", \"dead\", etc.). None\nwhen the container does not exist." + ] } - } - }, - "ContainerStatsSample": { - "type": "object", - "description": "Live resource usage sample for a single container.\n\n`cpu_percent` is computed by Docker's standard formula:\n ((cpu_delta / system_delta) * online_cpus) * 100\n`memory_percent` is `(memory_usage / memory_limit) * 100` \u2014 when no\nmemory limit is set the limit reported by Docker is the host's total\nRAM, so a 5% reading means \"5% of host RAM\", not \"5% of allocated\".", + }, "required": [ "role", - "container_name" + "container_name", + "resource_limits" ], + "type": "object" + }, + "ContainerStatsSample": { + "description": "Live resource usage sample for a single container.\n\n`cpu_percent` is computed by Docker's standard formula:\n ((cpu_delta / system_delta) * online_cpus) * 100\n`memory_percent` is `(memory_usage / memory_limit) * 100` — when no\nmemory limit is set the limit reported by Docker is the host's total\nRAM, so a 5% reading means \"5% of host RAM\", not \"5% of allocated\".", "properties": { "container_name": { "type": "string" }, "cpu_percent": { + "description": "CPU usage as a percentage. `None` when the container is not running\n(Docker returns no usable counters).", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "CPU usage as a percentage. `None` when the container is not running\n(Docker returns no usable counters)." + ] }, "memory_limit_bytes": { + "description": "Memory limit in bytes (host RAM if no limit set).", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Memory limit in bytes (host RAM if no limit set).", - "minimum": 0 + ] }, "memory_percent": { + "description": "Memory usage as a percentage of `memory_limit_bytes`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Memory usage as a percentage of `memory_limit_bytes`." + ] }, "memory_usage_bytes": { + "description": "Resident memory usage in bytes.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Resident memory usage in bytes.", - "minimum": 0 + ] }, "online_cpus": { + "description": "Number of cores Docker observed at sample time. Used by the UI\nto label \"x/y cores\" instead of just a percent.", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Number of cores Docker observed at sample time. Used by the UI\nto label \"x/y cores\" instead of just a percent.", - "minimum": 0 + ] }, "role": { "type": "string" } - } - }, - "ContentPart": { - "type": "object", + }, "required": [ - "type" + "role", + "container_name" ], + "type": "object" + }, + "ContentPart": { "properties": { "image_url": {}, "text": { @@ -5970,30 +6001,26 @@ "type": { "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" }, "ContextLine": { - "type": "object", "description": "A line in context response", - "required": [ - "timestamp", - "level", - "message", - "line_offset", - "is_match" - ], "properties": { "fields": {}, "is_match": { - "type": "boolean", - "description": "Whether this line matched the original search" + "description": "Whether this line matched the original search", + "type": "boolean" }, "level": { "$ref": "#/components/schemas/LogLevel" }, "line_offset": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -6001,51 +6028,59 @@ "timestamp": { "type": "string" } - } - }, - "ContextLogsRequest": { - "type": "object", + }, "required": [ - "chunk_id", - "line_offset" + "timestamp", + "level", + "message", + "line_offset", + "is_match" ], + "type": "object" + }, + "ContextLogsRequest": { "properties": { "chunk_id": { "type": "string" }, "line_offset": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "lines": { + "description": "Number of context lines before and after (default: 25)", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Number of context lines before and after (default: 25)", - "minimum": 0 + ] } - } - }, - "ContextLogsResponse": { - "type": "object", + }, "required": [ - "lines", - "target_index" + "chunk_id", + "line_offset" ], + "type": "object" + }, + "ContextLogsResponse": { "properties": { "lines": { - "type": "array", "items": { "$ref": "#/components/schemas/ContextLine" - } + }, + "type": "array" }, "target_index": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "lines", + "target_index" + ], + "type": "object" }, "ConversationDetailResponse": { "allOf": [ @@ -6053,32 +6088,23 @@ "$ref": "#/components/schemas/ConversationResponse" }, { - "type": "object", - "required": [ - "messages" - ], "properties": { "messages": { - "type": "array", + "description": "Turns oldest-first. The `system` seed message is omitted (internal).", "items": { "$ref": "#/components/schemas/MessageResponse" }, - "description": "Turns oldest-first. The `system` seed message is omitted (internal)." + "type": "array" } - } + }, + "required": [ + "messages" + ], + "type": "object" } ] }, "ConversationResponse": { - "type": "object", - "required": [ - "public_id", - "context_type", - "context_id", - "status", - "created_at", - "last_activity_at" - ], "properties": { "context_id": { "type": "string" @@ -6104,27 +6130,23 @@ "null" ] } - } + }, + "required": [ + "public_id", + "context_type", + "context_id", + "status", + "created_at", + "last_activity_at" + ], + "type": "object" }, "ConversationSummary": { - "type": "object", "description": "A conversation summary grouping related AI invocations.", - "required": [ - "conversation_id", - "message_count", - "total_input_tokens", - "total_output_tokens", - "total_tokens", - "total_cost_microcents", - "avg_latency_ms", - "models_used", - "first_at", - "last_at" - ], "properties": { "avg_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "conversation_id": { "type": "string" @@ -6136,124 +6158,127 @@ "type": "string" }, "message_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "models_used": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "total_cost_microcents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "conversation_id", + "message_count", + "total_input_tokens", + "total_output_tokens", + "total_tokens", + "total_cost_microcents", + "avg_latency_ms", + "models_used", + "first_at", + "last_at" + ], + "type": "object" }, "ConversationsQueryParams": { - "type": "object", "properties": { "from": { + "description": "ISO 8601 start time (defaults to 24h ago)", "type": [ "string", "null" - ], - "description": "ISO 8601 start time (defaults to 24h ago)" + ] }, "limit": { + "description": "Max results (defaults to 50, max 100)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Max results (defaults to 50, max 100)", - "minimum": 0 + ] }, "model": { + "description": "Filter by model name", "type": [ "string", "null" - ], - "description": "Filter by model name" + ] }, "tags": { + "description": "Filter by tags (comma-separated, AND logic)", "type": [ "string", "null" - ], - "description": "Filter by tags (comma-separated, AND logic)" + ] }, "to": { + "description": "ISO 8601 end time (defaults to now)", "type": [ "string", "null" - ], - "description": "ISO 8601 end time (defaults to now)" + ] }, "user_id": { + "description": "Filter by user ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by user ID" + ] } - } + }, + "type": "object" }, "CopyBlobRequest": { - "type": "object", "description": "Request to copy a blob", - "required": [ - "fromUrl", - "toPathname" - ], "properties": { "fromUrl": { - "type": "string", "description": "Source blob URL or pathname", - "example": "/api/blob/10/images/avatar.png" + "example": "/api/blob/10/images/avatar.png", + "type": "string" }, "projectId": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] }, "toPathname": { - "type": "string", "description": "Destination pathname", - "example": "images/avatar-copy.png" + "example": "images/avatar-copy.png", + "type": "string" } - } + }, + "required": [ + "fromUrl", + "toPathname" + ], + "type": "object" }, "CostAnalysis": { - "type": "object", "description": "Full cluster cost + rightsizing analysis attached to an import plan.", - "required": [ - "nodes", - "capacity", - "requested", - "usage_source", - "overprovisioning", - "recommendation", - "notes" - ], "properties": { "actual_usage": { "oneOf": [ @@ -6271,34 +6296,34 @@ "description": "Total cluster capacity (sum of node allocatable resources)" }, "control_plane_monthly_usd": { + "description": "Managed control-plane fee included in `current_monthly_usd` (EKS/GKE\ncharge ~$73/mo per cluster). `None` when not applicable/unknown.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Managed control-plane fee included in `current_monthly_usd` (EKS/GKE\ncharge ~$73/mo per cluster). `None` when not applicable/unknown." + ] }, "current_monthly_usd": { + "description": "Estimated total infrastructure cost per month in USD (compute nodes +\ncontrol-plane fee). `None` when no node could be priced.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Estimated total infrastructure cost per month in USD (compute nodes +\ncontrol-plane fee). `None` when no node could be priced." + ] }, "nodes": { - "type": "array", + "description": "Per-node inventory with price estimates where the instance type is known", "items": { "$ref": "#/components/schemas/NodeCostInfo" }, - "description": "Per-node inventory with price estimates where the instance type is known" + "type": "array" }, "notes": { - "type": "array", + "description": "Honesty notes: what could not be measured, which numbers are\nestimates, and any assumptions made. Always shown to the user.", "items": { "type": "string" }, - "description": "Honesty notes: what could not be measured, which numbers are\nestimates, and any assumptions made. Always shown to the user." + "type": "array" }, "overprovisioning": { "$ref": "#/components/schemas/OverprovisioningAssessment", @@ -6321,127 +6346,128 @@ }, "requested": { "$ref": "#/components/schemas/ResourceFootprint", - "description": "Sum of pod resource *requests* across running pods \u2014 what the\nscheduler has reserved, i.e. what the cluster is sized for." + "description": "Sum of pod resource *requests* across running pods — what the\nscheduler has reserved, i.e. what the cluster is sized for." }, "usage_source": { "$ref": "#/components/schemas/UsageSource", "description": "How the usage numbers were obtained (drives UI wording)" } - } - }, - "CreateAlertRuleRequest": { - "type": "object", + }, "required": [ - "name", - "trigger_type" + "nodes", + "capacity", + "requested", + "usage_source", + "overprovisioning", + "recommendation", + "notes" ], + "type": "object" + }, + "CreateAlertRuleRequest": { "properties": { "cooldown_minutes": { - "type": "integer", + "description": "Minimum minutes between notifications for same rule+group", "format": "int32", - "description": "Minimum minutes between notifications for same rule+group" + "type": "integer" }, "enabled": { "type": "boolean" }, "environment_filter": { + "description": "Optional environment ID to filter alerts", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment ID to filter alerts" + ] }, "error_level_filter": { + "description": "Optional error type/level filter", "type": [ "string", "null" - ], - "description": "Optional error type/level filter" + ] }, "name": { "type": "string" }, "notification_priority": { - "type": "string", - "description": "Notification priority: Low, Normal, High, Critical" + "description": "Notification priority: Low, Normal, High, Critical", + "type": "string" }, "trigger_config": { "description": "Trigger-specific configuration (e.g., {\"count\": 100, \"window_minutes\": 60} for frequency)" }, "trigger_type": { - "type": "string", - "description": "Trigger type: new_issue, regression, frequency, new_user, user_count, status_change" + "description": "Trigger type: new_issue, regression, frequency, new_user, user_count, status_change", + "type": "string" } - } - }, - "CreateApiKeyRequest": { - "type": "object", + }, "required": [ "name", - "role_type" + "trigger_type" ], + "type": "object" + }, + "CreateApiKeyRequest": { "properties": { "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "name": { "type": "string" }, "permissions": { - "type": [ - "array", - "null" + "example": [ + "projects:read", + "deployments:read" ], "items": { "type": "string" }, - "example": [ - "projects:read", - "deployments:read" + "type": [ + "array", + "null" ] }, "role_type": { - "type": "string", - "example": "admin" + "example": "admin", + "type": "string" } - } - }, - "CreateApiKeyResponse": { - "type": "object", + }, "required": [ - "id", "name", - "key_prefix", - "role_type", - "api_key", - "created_at" + "role_type" ], + "type": "object" + }, + "CreateApiKeyResponse": { "properties": { "api_key": { "type": "string" }, "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00Z", "format": "date-time", - "example": "2024-01-01T00:00:00Z" + "type": "string" }, "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "key_prefix": { "type": "string" @@ -6450,29 +6476,29 @@ "type": "string" }, "permissions": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "role_type": { "type": "string" } - } - }, - "CreateBackupScheduleRequest": { - "type": "object", + }, "required": [ + "id", "name", - "backup_type", - "retention_period", - "schedule_expression", - "enabled", - "tags" + "key_prefix", + "role_type", + "api_key", + "created_at" ], + "type": "object" + }, + "CreateBackupScheduleRequest": { "properties": { "backup_type": { "type": "string" @@ -6487,76 +6513,80 @@ "type": "boolean" }, "include_control_plane": { + "description": "When `true` (default), every run also produces a `control_plane`\nbackup of Temps's own database. Operators who use Temps purely as\na backup orchestrator for external DBs can set this to `false` to\nkeep the run history focused on those services.", "type": [ "boolean", "null" - ], - "description": "When `true` (default), every run also produces a `control_plane`\nbackup of Temps's own database. Operators who use Temps purely as\na backup orchestrator for external DBs can set this to `false` to\nkeep the run history focused on those services." + ] }, "max_runtime_secs": { + "description": "Optional wall-clock timeout override for jobs created by this schedule\n(seconds). When set, overrides the engine-family default. `null` means\n\"use engine default.\" The per-job `max_runtime_secs` in\n`EnqueueJobParams` can still override this for ad-hoc triggers.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Optional wall-clock timeout override for jobs created by this schedule\n(seconds). When set, overrides the engine-family default. `null` means\n\"use engine default.\" The per-job `max_runtime_secs` in\n`EnqueueJobParams` can still override this for ad-hoc triggers." + ] }, "name": { "type": "string" }, "retention_period": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "s3_source_id": { + "description": "Optional S3 source. If omitted, the current default S3 source is used.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional S3 source. If omitted, the current default S3 source is used." + ] }, "schedule_expression": { "type": "string" }, "tags": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "target_all_services": { + "description": "When `true` (default), the schedule backs up every external service\non the host — including databases created in the future. When\n`false`, the schedule backs up only the services explicitly attached\nvia `POST /backups/schedules/{id}/services`. Omit to use the default.", "type": [ "boolean", "null" - ], - "description": "When `true` (default), the schedule backs up every external service\non the host \u2014 including databases created in the future. When\n`false`, the schedule backs up only the services explicitly attached\nvia `POST /backups/schedules/{id}/services`. Omit to use the default." + ] } - } - }, - "CreateBitbucketRequest": { - "type": "object", + }, "required": [ "name", - "auth" + "backup_type", + "retention_period", + "schedule_expression", + "enabled", + "tags" ], + "type": "object" + }, + "CreateBitbucketRequest": { "properties": { "auth": { "$ref": "#/components/schemas/BitbucketAuthInput", - "description": "Authentication credentials \u2014 either an access token or an app password." + "description": "Authentication credentials — either an access token or an app password." }, "name": { - "type": "string", - "description": "Display name for this provider." + "description": "Display name for this provider.", + "type": "string" } - } - }, - "CreateCloudflareProviderRequest": { - "type": "object", + }, "required": [ "name", - "config" + "auth" ], + "type": "object" + }, + "CreateCloudflareProviderRequest": { "properties": { "config": { "$ref": "#/components/schemas/CloudflareConfig" @@ -6570,27 +6600,31 @@ "name": { "type": "string" } - } - }, - "CreateConversationRequest": { - "type": "object", + }, "required": [ - "context_type", - "context_id" + "name", + "config" ], + "type": "object" + }, + "CreateConversationRequest": { "properties": { "context_id": { - "type": "string", - "description": "The entity id (ints stringified)." + "description": "The entity id (ints stringified).", + "type": "string" }, "context_type": { - "type": "string", - "description": "e.g. `\"deployment\"`." + "description": "e.g. `\"deployment\"`.", + "type": "string" } - } + }, + "required": [ + "context_type", + "context_id" + ], + "type": "object" }, "CreateDSNRequest": { - "type": "object", "properties": { "base_url": { "type": [ @@ -6599,18 +6633,18 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "name": { "type": [ @@ -6618,15 +6652,10 @@ "null" ] } - } + }, + "type": "object" }, "CreateDashboardRequest": { - "type": "object", - "required": [ - "project_id", - "name", - "layout" - ], "properties": { "layout": { "$ref": "#/components/schemas/DashboardLayout" @@ -6635,213 +6664,213 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "CreateDeploymentTokenRequest": { - "type": "object", + }, "required": [ - "name" + "project_id", + "name", + "layout" ], + "type": "object" + }, + "CreateDeploymentTokenRequest": { "properties": { "deployment_id": { + "description": "Optional deployment ID - if set, token is scoped to a specific deployment", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional deployment ID - if set, token is scoped to a specific deployment" + ] }, "environment_id": { + "description": "Optional environment ID - if not set, token applies to all environments", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment ID - if not set, token applies to all environments" + ] }, "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "name": { "type": "string" }, "permissions": { - "type": [ - "array", - "null" - ], - "items": { - "type": "string" - }, "description": "List of permissions (e.g., [\"visitors:enrich\", \"emails:send\"])\nIf not provided, defaults to full access", "example": [ "visitors:enrich", "emails:send" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" ] } - } - }, - "CreateDeploymentTokenResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "token_prefix", - "token", - "created_at" + "name" ], + "type": "object" + }, + "CreateDeploymentTokenResponse": { "properties": { "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00Z", "format": "date-time", - "example": "2024-01-01T00:00:00Z" + "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" }, "permissions": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "token": { - "type": "string", - "description": "The full token value - only returned on creation" + "description": "The full token value - only returned on creation", + "type": "string" }, "token_prefix": { "type": "string" } - } - }, - "CreateDnsProviderRequest": { - "type": "object", - "description": "Request to create a new DNS provider", + }, "required": [ + "id", + "project_id", "name", - "provider_type", - "credentials" + "token_prefix", + "token", + "created_at" ], + "type": "object" + }, + "CreateDnsProviderRequest": { + "description": "Request to create a new DNS provider", "properties": { "credentials": { "$ref": "#/components/schemas/DnsProviderCredentials", "description": "Provider credentials" }, "description": { + "description": "Optional description", "type": [ "string", "null" - ], - "description": "Optional description" + ] }, "name": { - "type": "string", "description": "User-friendly name", - "example": "My Cloudflare" + "example": "My Cloudflare", + "type": "string" }, "provider_type": { "$ref": "#/components/schemas/DnsProviderType", "description": "Provider type" } - } - }, - "CreateDomainRequest": { - "type": "object", + }, "required": [ - "domain" + "name", + "provider_type", + "credentials" ], + "type": "object" + }, + "CreateDomainRequest": { "properties": { "challenge_type": { - "type": "string", - "description": "Challenge type for Let's Encrypt validation. Options: \"http-01\" (default) or \"dns-01\"" + "description": "Challenge type for Let's Encrypt validation. Options: \"http-01\" (default) or \"dns-01\"", + "type": "string" }, "domain": { "type": "string" } - } - }, - "CreateEmailDomainRequest": { - "type": "object", + }, "required": [ - "provider_id", "domain" ], + "type": "object" + }, + "CreateEmailDomainRequest": { "properties": { "domain": { - "type": "string", "description": "Domain name (e.g., \"updates.example.com\")", - "example": "updates.example.com" + "example": "updates.example.com", + "type": "string" }, "provider_id": { - "type": "integer", + "description": "Provider ID to use for this domain", "format": "int32", - "description": "Provider ID to use for this domain" + "type": "integer" } - } - }, - "CreateEmailProviderRequest": { - "type": "object", + }, "required": [ - "name", - "provider_type", - "region" + "provider_id", + "domain" ], + "type": "object" + }, + "CreateEmailProviderRequest": { "properties": { "name": { - "type": "string", "description": "User-friendly name for the provider", - "example": "My AWS SES" + "example": "My AWS SES", + "type": "string" }, "provider_type": { "$ref": "#/components/schemas/EmailProviderTypeRoute", "description": "Provider type" }, "region": { - "type": "string", - "description": "Cloud region. For SMTP this is informational only \u2014 the host/port carry the real routing.", - "example": "us-east-1" + "description": "Cloud region. For SMTP this is informational only — the host/port carry the real routing.", + "example": "us-east-1", + "type": "string" }, "scaleway_credentials": { "oneOf": [ @@ -6877,20 +6906,21 @@ ] }, "sns_topic_arn": { + "description": "Exact SNS topic allowed to deliver SES events for this provider.", "type": [ "string", "null" - ], - "description": "Exact SNS topic allowed to deliver SES events for this provider." + ] } - } - }, - "CreateEnvironmentRequest": { - "type": "object", + }, "required": [ "name", - "branch" + "provider_type", + "region" ], + "type": "object" + }, + "CreateEnvironmentRequest": { "properties": { "branch": { "type": "string" @@ -6899,33 +6929,32 @@ "type": "string" }, "set_as_preview": { - "type": "boolean", - "description": "If true, set this environment as the preview environment for the project" + "description": "If true, set this environment as the preview environment for the project", + "type": "boolean" } - } - }, - "CreateEnvironmentVariableRequest": { - "type": "object", + }, "required": [ - "key", - "value", - "environment_ids" + "name", + "branch" ], + "type": "object" + }, + "CreateEnvironmentVariableRequest": { "properties": { "environment_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" }, "include_in_preview": { - "type": "boolean", - "description": "Include this environment variable in preview environments (default: true)" + "description": "Include this environment variable in preview environments (default: true)", + "type": "boolean" }, "is_secret": { - "type": "boolean", - "description": "When true the variable is treated as write-only: never returned in\nplaintext from the API, masked in the UI, and updates that omit the\nvalue preserve the existing ciphertext. The flag is one-way \u2014 secret\nvars cannot be demoted back to regular vars." + "description": "When true the variable is treated as write-only: never returned in\nplaintext from the API, masked in the UI, and updates that omit the\nvalue preserve the existing ciphertext. The flag is one-way — secret\nvars cannot be demoted back to regular vars.", + "type": "boolean" }, "key": { "type": "string" @@ -6933,48 +6962,48 @@ "value": { "type": "string" } - } - }, - "CreateExternalServiceRequest": { - "type": "object", + }, "required": [ - "name", - "service_type", - "parameters" + "key", + "value", + "environment_ids" ], + "type": "object" + }, + "CreateExternalServiceRequest": { "properties": { "members": { - "type": "array", + "description": "Cluster member specifications. Required when topology is \"cluster\".", "items": { "$ref": "#/components/schemas/ClusterMemberRequest" }, - "description": "Cluster member specifications. Required when topology is \"cluster\"." + "type": "array" }, "name": { "type": "string" }, "node_id": { + "description": "Target node ID for the service. Omit or null to run on the control plane.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Target node ID for the service. Omit or null to run on the control plane." + ] }, "parameters": { - "type": "object", "additionalProperties": {}, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute" }, "topology": { - "type": "string", "description": "Service topology: \"standalone\" (default) or \"cluster\" (HA multi-member).", - "example": "standalone" + "example": "standalone", + "type": "string" }, "version": { "type": [ @@ -6982,19 +7011,19 @@ "null" ] } - } - }, - "CreateFlagRequest": { - "type": "object", + }, "required": [ - "key", - "value_type", - "default_value" + "name", + "service_type", + "parameters" ], + "type": "object" + }, + "CreateFlagRequest": { "properties": { "client_visible": { - "type": "boolean", - "description": "Whether the flag may be exposed on the unauthenticated same-origin\nevaluation endpoint. Defaults to `false`: flags are server-only unless\nexplicitly opted in, because targeting rules can encode business logic." + "description": "Whether the flag may be exposed on the unauthenticated same-origin\nevaluation endpoint. Defaults to `false`: flags are server-only unless\nexplicitly opted in, because targeting rules can encode business logic.", + "type": "boolean" }, "default_value": { "description": "Served whenever evaluation cannot do better. Must match `value_type`.\n\nLeft unannotated so utoipa emits a free-form schema: a bool flag's\ndefault is `false`, not an object, and `value_type = Object` would tell\nevery generated client otherwise." @@ -7006,22 +7035,23 @@ ] }, "key": { - "type": "string", "description": "Stable key used in application code. Immutable after create.", - "example": "checkout.v2" + "example": "checkout.v2", + "type": "string" }, "value_type": { "$ref": "#/components/schemas/FlagValueType", "description": "Fixed at create: retyping would invalidate every stored value and every\ncall site." } - } - }, - "CreateFunnelRequest": { - "type": "object", + }, "required": [ - "name", - "steps" + "key", + "value_type", + "default_value" ], + "type": "object" + }, + "CreateFunnelRequest": { "properties": { "description": { "type": [ @@ -7033,90 +7063,90 @@ "type": "string" }, "steps": { - "type": "array", "items": { "$ref": "#/components/schemas/CreateFunnelStep" - } + }, + "type": "array" } - } - }, - "CreateFunnelResponse": { - "type": "object", + }, "required": [ - "funnel_id", - "message" + "name", + "steps" ], + "type": "object" + }, + "CreateFunnelResponse": { "properties": { "funnel_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" } - } - }, - "CreateFunnelStep": { - "type": "object", + }, "required": [ - "event_name" + "funnel_id", + "message" ], + "type": "object" + }, + "CreateFunnelStep": { "properties": { "event_filter": { - "type": "array", "items": { "$ref": "#/components/schemas/SmartFilter" - } + }, + "type": "array" }, "event_name": { "type": "string" } - } - }, - "CreateGenericRequest": { - "type": "object", + }, "required": [ - "name", - "clone_url" + "event_name" ], + "type": "object" + }, + "CreateGenericRequest": { "properties": { "base_url": { + "description": "Optional base URL of the git host for display purposes (no API is called).", "type": [ "string", "null" - ], - "description": "Optional base URL of the git host for display purposes (no API is called)." + ] }, "clone_url": { - "type": "string", - "description": "HTTPS clone URL for the repository, e.g. `https://git.example.com/org/repo.git`." + "description": "HTTPS clone URL for the repository, e.g. `https://git.example.com/org/repo.git`.", + "type": "string" }, "name": { - "type": "string", - "description": "Display name for this provider." + "description": "Display name for this provider.", + "type": "string" }, "token": { + "description": "Access token or password. Omit (or set to `null`) for public repositories.", "type": [ "string", "null" - ], - "description": "Access token or password. Omit (or set to `null`) for public repositories." + ] }, "token_username": { + "description": "HTTP Basic username used with the token. Defaults to `x-access-token` when\nabsent or empty. Ignored for public (unauthenticated) repositories.", "type": [ "string", "null" - ], - "description": "HTTP Basic username used with the token. Defaults to `x-access-token` when\nabsent or empty. Ignored for public (unauthenticated) repositories." + ] } - } - }, - "CreateGitHubPATRequest": { - "type": "object", + }, "required": [ "name", - "token" + "clone_url" ], + "type": "object" + }, + "CreateGitHubPATRequest": { "properties": { "name": { "type": "string" @@ -7124,16 +7154,14 @@ "token": { "type": "string" } - } - }, - "CreateGitLabOAuthRequest": { - "type": "object", + }, "required": [ "name", - "client_id", - "client_secret", - "redirect_uri" + "token" ], + "type": "object" + }, + "CreateGitLabOAuthRequest": { "properties": { "base_url": { "type": [ @@ -7153,14 +7181,16 @@ "redirect_uri": { "type": "string" } - } - }, - "CreateGitLabPATRequest": { - "type": "object", + }, "required": [ "name", - "token" + "client_id", + "client_secret", + "redirect_uri" ], + "type": "object" + }, + "CreateGitLabPATRequest": { "properties": { "base_url": { "type": [ @@ -7174,37 +7204,37 @@ "token": { "type": "string" } - } - }, - "CreateGiteaPATRequest": { - "type": "object", + }, "required": [ "name", - "token", - "base_url" + "token" ], + "type": "object" + }, + "CreateGiteaPATRequest": { "properties": { "base_url": { - "type": "string", - "description": "HTTPS base URL of the Gitea instance, e.g. `https://git.example.com`." + "description": "HTTPS base URL of the Gitea instance, e.g. `https://git.example.com`.", + "type": "string" }, "name": { - "type": "string", - "description": "Display name for this provider." + "description": "Display name for this provider.", + "type": "string" }, "token": { - "type": "string", - "description": "Personal access token issued by the Gitea instance." + "description": "Personal access token issued by the Gitea instance.", + "type": "string" } - } - }, - "CreateIncidentRequest": { - "type": "object", + }, "required": [ - "title", - "severity" + "name", + "token", + "base_url" ], - "properties": { + "type": "object" + }, + "CreateIncidentRequest": { + "properties": { "description": { "type": [ "string", @@ -7212,18 +7242,18 @@ ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "monitor_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "severity": { "type": "string" @@ -7231,60 +7261,59 @@ "title": { "type": "string" } - } - }, - "CreateIntegrationBody": { - "type": "object", + }, "required": [ - "provider", - "signing_secret" + "title", + "severity" ], + "type": "object" + }, + "CreateIntegrationBody": { "properties": { "provider": { - "type": "string", - "description": "Registered provider name, e.g. \"stripe\"." + "description": "Registered provider name, e.g. \"stripe\".", + "type": "string" }, "signing_secret": { - "type": "string", - "description": "Signing secret from the provider's dashboard." + "description": "Signing secret from the provider's dashboard.", + "type": "string" } - } + }, + "required": [ + "provider", + "signing_secret" + ], + "type": "object" }, "CreateIpAccessControlRequest": { - "type": "object", "description": "Request to create an IP access control rule", - "required": [ - "ip_address", - "action" - ], "properties": { "action": { - "type": "string", "description": "Action to take: \"block\" or \"allow\"", - "example": "block" + "example": "block", + "type": "string" }, "ip_address": { - "type": "string", "description": "IP address in CIDR notation (e.g., \"192.168.1.1\" or \"10.0.0.0/24\")", - "example": "192.168.1.100" + "example": "192.168.1.100", + "type": "string" }, "reason": { + "description": "Optional reason for the action", + "example": "Malicious activity detected", "type": [ "string", "null" - ], - "description": "Optional reason for the action", - "example": "Malicious activity detected" + ] } - } - }, - "CreateMcpRequest": { - "type": "object", + }, "required": [ - "slug", - "name", - "config" + "ip_address", + "action" ], + "type": "object" + }, + "CreateMcpRequest": { "properties": { "config": { "type": "object" @@ -7301,57 +7330,50 @@ "slug": { "type": "string" } - } - }, - "CreateMetricAlertRequest": { - "type": "object", + }, "required": [ - "project_id", + "slug", "name", - "metric_name", - "aggregation", - "detection_config", - "window_secs", - "for_duration_secs", - "severity", - "enabled" + "config" ], + "type": "object" + }, + "CreateMetricAlertRequest": { "properties": { "aggregation": { - "type": "string", - "description": "One of `avg|sum|min|max|count|rate|p50|p90|p95|p99`." + "description": "One of `avg|sum|min|max|count|rate|p50|p90|p95|p99`.", + "type": "string" }, "detection_config": { "$ref": "#/components/schemas/DetectionConfig", "description": "The detector: a discriminated union keyed by `kind`. Today only\n`{ \"kind\": \"static\", \"comparator\": \"gt\", \"threshold\": 500 }` is evaluable." }, "dynamic_alerts": { - "type": "boolean", - "description": "When true (and `group_by` is set) fire one independent alarm per breaching\nseries. Static detectors only. Default false." + "description": "When true (and `group_by` is set) fire one independent alarm per breaching\nseries. Static detectors only. Default false.", + "type": "boolean" }, "enabled": { "type": "boolean" }, "for_duration_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "group_by": { - "type": "array", + "description": "Label keys to break the metric down by, e.g. `[\"endpoint\",\"region\"]`. Empty\n(the default) = one aggregate stream. Max 2 keys; keys must match\n`[a-zA-Z0-9_.:-]`.", "items": { "type": "string" }, - "description": "Label keys to break the metric down by, e.g. `[\"endpoint\",\"region\"]`. Empty\n(the default) = one aggregate stream. Max 2 keys; keys must match\n`[a-zA-Z0-9_.:-]`." + "type": "array" }, "grouped_notification_threshold": { - "type": "integer", + "description": "When more than this many series transition to firing in the same tick, only\nthe first gets the expensive chart/AI enrichment. Range 1–1000, default 5.", "format": "int32", - "description": "When more than this many series transition to firing in the same tick, only\nthe first gets the expensive chart/AI enrichment. Range 1\u20131000, default 5." + "type": "integer" }, "label_filters": { - "type": "array", + "description": "AND-combined label equality filters: `[[\"key\",\"value\"],…]`. Empty = no\nfiltering (the default). Max 10 pairs; keys must match `[a-zA-Z0-9_.:-]`;\nvalues capped at 500 characters.", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -7360,14 +7382,15 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "AND-combined label equality filters: `[[\"key\",\"value\"],\u2026]`. Empty = no\nfiltering (the default). Max 10 pairs; keys must match `[a-zA-Z0-9_.:-]`;\nvalues capped at 500 characters." + "type": "array" }, "max_series": { - "type": "integer", + "description": "Cardinality cap for dynamic alerting: at most this many series (top by\n`|value|`). Range 1–100, default 20.", "format": "int32", - "description": "Cardinality cap for dynamic alerting: at most this many series (top by\n`|value|`). Range 1\u2013100, default 20." + "type": "integer" }, "metric_name": { "type": "string" @@ -7376,33 +7399,39 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "severity": { - "type": "string", - "description": "One of `info|warning|critical`." + "description": "One of `info|warning|critical`.", + "type": "string" }, "window_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "CreateMonitorRequest": { - "type": "object", + }, "required": [ + "project_id", "name", - "monitor_type", - "environment_id" + "metric_name", + "aggregation", + "detection_config", + "window_secs", + "for_duration_secs", + "severity", + "enabled" ], + "type": "object" + }, + "CreateMonitorRequest": { "properties": { "check_interval_seconds": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "check_path": { "type": [ @@ -7411,8 +7440,8 @@ ] }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "monitor_type": { "type": "string" @@ -7420,14 +7449,15 @@ "name": { "type": "string" } - } - }, - "CreateNotificationEmailProviderRequest": { - "type": "object", + }, "required": [ "name", - "config" + "monitor_type", + "environment_id" ], + "type": "object" + }, + "CreateNotificationEmailProviderRequest": { "properties": { "config": { "$ref": "#/components/schemas/EmailConfig" @@ -7441,16 +7471,14 @@ "name": { "type": "string" } - } - }, - "CreateOidcProviderRequest": { - "type": "object", + }, "required": [ "name", - "issuer_url", - "client_id", - "client_secret" + "config" ], + "type": "object" + }, + "CreateOidcProviderRequest": { "properties": { "client_id": { "type": "string" @@ -7486,50 +7514,52 @@ "type": "string" }, "trust_idp_email": { - "type": "boolean", - "description": "Defaults false. Set to true only for IdPs where an admin\ncontrols user provisioning (corporate Okta, Azure AD) and\nself-signup of arbitrary emails is not possible \u2014 see the\n`trust_idp_email` field on `oidc_providers::Model` for the\nsecurity tradeoff this enables." + "description": "Defaults false. Set to true only for IdPs where an admin\ncontrols user provisioning (corporate Okta, Azure AD) and\nself-signup of arbitrary emails is not possible — see the\n`trust_idp_email` field on `oidc_providers::Model` for the\nsecurity tradeoff this enables.", + "type": "boolean" } - } - }, - "CreateOidcRoleMappingRequest": { - "type": "object", + }, "required": [ - "priority", - "idp_group", - "role" + "name", + "issuer_url", + "client_id", + "client_secret" ], + "type": "object" + }, + "CreateOidcRoleMappingRequest": { "properties": { "idp_group": { "type": "string" }, "priority": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "role": { "type": "string" } - } + }, + "required": [ + "priority", + "idp_group", + "role" + ], + "type": "object" }, "CreatePlanRequest": { - "type": "object", "description": "Request to create an import plan", - "required": [ - "source", - "workload_id" - ], "properties": { "credentials": { "$ref": "#/components/schemas/ImportCredentials", "description": "Platform credentials (required for cloud platforms like Vercel, Railway)" }, "repository_id": { + "description": "Optional repository ID to associate with the import\nIf provided, preset will be detected from the repository", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional repository ID to associate with the import\nIf provided, preset will be detected from the repository" + ] }, "source": { "$ref": "#/components/schemas/ImportSource", @@ -7539,51 +7569,49 @@ "$ref": "#/components/schemas/WorkloadId", "description": "Workload ID to import" } - } + }, + "required": [ + "source", + "workload_id" + ], + "type": "object" }, "CreatePlanResponse": { - "type": "object", "description": "Response with created plan", - "required": [ - "session_id", - "plan", - "validation", - "can_execute" - ], "properties": { "can_execute": { - "type": "boolean", - "description": "Whether the plan can be executed" + "description": "Whether the plan can be executed", + "type": "boolean" }, "plan": { "$ref": "#/components/schemas/ImportPlan", "description": "Generated import plan" }, "session_id": { - "type": "string", - "description": "Session ID for tracking" + "description": "Session ID for tracking", + "type": "string" }, "validation": { "$ref": "#/components/schemas/ValidationReport", "description": "Validation report" } - } - }, - "CreatePrResponse": { - "type": "object", + }, "required": [ - "run", - "pr_url", - "pr_number", - "branch_name" + "session_id", + "plan", + "validation", + "can_execute" ], + "type": "object" + }, + "CreatePrResponse": { "properties": { "branch_name": { "type": "string" }, "pr_number": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "pr_url": { "type": "string" @@ -7591,135 +7619,134 @@ "run": { "$ref": "#/components/schemas/AutofixerRunResponse" } - } - }, - "CreateProjectAccessRequest": { - "type": "object", + }, "required": [ - "team_id", - "role" + "run", + "pr_url", + "pr_number", + "branch_name" ], + "type": "object" + }, + "CreateProjectAccessRequest": { "properties": { "role": { "$ref": "#/components/schemas/TeamRole" }, "team_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "CreateProjectFromTemplateRequest": { - "type": "object", - "description": "Request to create a project from a template\n\nSupports two deploy modes:\n * **Fork mode** \u2014 when `git_provider_connection_id` is set, the template\n repo is cloned into a new repository under the user's Git account and the\n project tracks that fork (git-push deploys, automatic deploy on push).\n * **One-click public-repo mode** \u2014 when `git_provider_connection_id` is\n omitted, the project deploys directly from the template's public source\n repository (no fork, no Git account required). This is the activation\n path: a brand-new user with no Git provider connected can still deploy a\n demo in one click. `repository_name` / `repository_owner` are ignored in\n this mode, and automatic-deploy-on-push is unavailable (there is no fork\n to receive webhooks).", + }, "required": [ - "template_slug", - "project_name" + "team_id", + "role" ], + "type": "object" + }, + "CreateProjectFromTemplateRequest": { + "description": "Request to create a project from a template\n\nSupports two deploy modes:\n * **Fork mode** — when `git_provider_connection_id` is set, the template\n repo is cloned into a new repository under the user's Git account and the\n project tracks that fork (git-push deploys, automatic deploy on push).\n * **One-click public-repo mode** — when `git_provider_connection_id` is\n omitted, the project deploys directly from the template's public source\n repository (no fork, no Git account required). This is the activation\n path: a brand-new user with no Git provider connected can still deploy a\n demo in one click. `repository_name` / `repository_owner` are ignored in\n this mode, and automatic-deploy-on-push is unavailable (there is no fork\n to receive webhooks).", "properties": { "automatic_deploy": { - "type": "boolean", - "description": "Enable automatic deployment on push (defaults to true). Only honoured in\nfork mode; public-repo deploys cannot receive push webhooks." + "description": "Enable automatic deployment on push (defaults to true). Only honoured in\nfork mode; public-repo deploys cannot receive push webhooks.", + "type": "boolean" }, "environment_variables": { - "type": "array", + "description": "Environment variables to set (key-value pairs)", "items": { "$ref": "#/components/schemas/EnvVarInput" }, - "description": "Environment variables to set (key-value pairs)" + "type": "array" }, "git_provider_connection_id": { + "description": "Git provider connection ID. When omitted, the project deploys directly\nfrom the template's public source repository instead of forking it.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Git provider connection ID. When omitted, the project deploys directly\nfrom the template's public source repository instead of forking it." + ] }, "private": { - "type": "boolean", - "description": "Whether to make the repository private (defaults to true)" + "description": "Whether to make the repository private (defaults to true)", + "type": "boolean" }, "project_name": { - "type": "string", - "description": "Name for the new project" + "description": "Name for the new project", + "type": "string" }, "repository_name": { + "description": "Name for the new repository to create. Required in fork mode; ignored in\none-click public-repo mode.", "type": [ "string", "null" - ], - "description": "Name for the new repository to create. Required in fork mode; ignored in\none-click public-repo mode." + ] }, "repository_owner": { + "description": "Owner/organization for the new repository (defaults to authenticated user)", "type": [ "string", "null" - ], - "description": "Owner/organization for the new repository (defaults to authenticated user)" + ] }, "storage_service_ids": { - "type": "array", + "description": "External storage service IDs to attach to the project", "items": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, - "description": "External storage service IDs to attach to the project" + "type": "array" }, "template_slug": { - "type": "string", - "description": "Template slug to use as the base" + "description": "Template slug to use as the base", + "type": "string" } - } - }, - "CreateProjectFromTemplateResponse": { - "type": "object", - "description": "Response after creating a project from template", + }, "required": [ - "project_id", - "project_slug", - "project_name", - "repository_url", "template_slug", - "message" + "project_name" ], + "type": "object" + }, + "CreateProjectFromTemplateResponse": { + "description": "Response after creating a project from template", "properties": { "message": { - "type": "string", - "description": "Message with additional info" + "description": "Message with additional info", + "type": "string" }, "project_id": { - "type": "integer", + "description": "ID of the created project", "format": "int32", - "description": "ID of the created project" + "type": "integer" }, "project_name": { - "type": "string", - "description": "Name of the created project" + "description": "Name of the created project", + "type": "string" }, "project_slug": { - "type": "string", - "description": "Slug of the created project" + "description": "Slug of the created project", + "type": "string" }, "repository_url": { - "type": "string", - "description": "URL of the created repository" + "description": "URL of the created repository", + "type": "string" }, "template_slug": { - "type": "string", - "description": "Template that was used" + "description": "Template that was used", + "type": "string" } - } - }, - "CreateProjectRequest": { - "type": "object", + }, "required": [ - "name", - "directory", - "main_branch", - "preset", - "storage_service_ids" + "project_id", + "project_slug", + "project_name", + "repository_url", + "template_slug", + "message" ], + "type": "object" + }, + "CreateProjectRequest": { "properties": { "automatic_deploy": { "type": [ @@ -7743,12 +7770,7 @@ "type": "string" }, "environment_variables": { - "type": [ - "array", - "null" - ], "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -7757,24 +7779,29 @@ { "type": "string" } - ] - } + ], + "type": "array" + }, + "type": [ + "array", + "null" + ] }, "exposed_port": { + "description": "Port exposed by the container (fallback when image has no EXPOSE directive)\n\nPriority order for port resolution:\n1. Image EXPOSE directive (auto-detected from built image)\n2. Environment-level exposed_port (overrides this value per environment)\n3. This project-level exposed_port (fallback)\n4. Default: 3000\n\nOnly set this if your image doesn't use EXPOSE directive.", + "example": 8080, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Port exposed by the container (fallback when image has no EXPOSE directive)\n\nPriority order for port resolution:\n1. Image EXPOSE directive (auto-detected from built image)\n2. Environment-level exposed_port (overrides this value per environment)\n3. This project-level exposed_port (fallback)\n4. Default: 3000\n\nOnly set this if your image doesn't use EXPOSE directive.", - "example": 8080 + ] }, "git_provider_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "git_url": { "type": [ @@ -7858,11 +7885,11 @@ "description": "Source type for deployments\n\nDetermines how the project is deployed:\n- **git** (default): Traditional Git-based deployments - source code is pulled, built, and deployed\n- **docker_image**: Deploy pre-built Docker images from external registries (DockerHub, GHCR, etc.)\n- **static_files**: Deploy pre-built static files uploaded as tar.gz or zip bundles\n\nFor `docker_image` and `static_files` source types, `repo_name` and `repo_owner` are optional." }, "storage_service_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" }, "use_default_wildcard": { "type": [ @@ -7870,44 +7897,46 @@ "null" ] } - } + }, + "required": [ + "name", + "directory", + "main_branch", + "preset", + "storage_service_ids" + ], + "type": "object" }, "CreateProjectSecretRequest": { - "type": "object", "description": "Request to create a new project secret.\n\nProject secrets are mounted into the container as files under\n`/run/secrets/` (mode 0400, tmpfs) instead of as environment variables.\nValues are always encrypted at rest and never returned in plaintext from\nthe API after create. Distinct from agent secrets (global `/settings/secrets`).", - "required": [ - "key", - "value" - ], "properties": { "environment_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" }, "include_in_preview": { - "type": "boolean", - "description": "Include this secret in preview environments." + "description": "Include this secret in preview environments.", + "type": "boolean" }, "key": { - "type": "string", - "description": "Identifier for the secret. Becomes the filename at `/run/secrets/`.\nMust start with a letter or underscore and contain only A-Z, a-z, 0-9, _." + "description": "Identifier for the secret. Becomes the filename at `/run/secrets/`.\nMust start with a letter or underscore and contain only A-Z, a-z, 0-9, _.", + "type": "string" }, "value": { - "type": "string", - "description": "Plaintext value, <= 1 MiB." + "description": "Plaintext value, <= 1 MiB.", + "type": "string" } - } - }, - "CreateProviderKeyRequest": { - "type": "object", + }, "required": [ - "provider", - "display_name", - "api_key" + "key", + "value" ], + "type": "object" + }, + "CreateProviderKeyRequest": { "properties": { "api_key": { "type": "string" @@ -7919,11 +7948,11 @@ ] }, "default_model": { + "description": "Optional model id to pin for this provider (e.g. \"gpt-4o-mini\").", "type": [ "string", "null" - ], - "description": "Optional model id to pin for this provider (e.g. \"gpt-4o-mini\")." + ] }, "display_name": { "type": "string" @@ -7931,15 +7960,15 @@ "provider": { "type": "string" } - } - }, - "CreateProviderRequest": { - "type": "object", + }, "required": [ - "name", - "provider_type", - "config" + "provider", + "display_name", + "api_key" ], + "type": "object" + }, + "CreateProviderRequest": { "properties": { "config": {}, "enabled": { @@ -7954,15 +7983,15 @@ "provider_type": { "type": "string" } - } - }, - "CreateRouteRequest": { - "type": "object", + }, "required": [ - "domain", - "host", - "port" + "name", + "provider_type", + "config" ], + "type": "object" + }, + "CreateRouteRequest": { "properties": { "domain": { "type": "string" @@ -7971,28 +8000,25 @@ "type": "string" }, "port": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "route_type": { + "description": "Route type: \"http\" (default) matches on HTTP Host header,\n\"tls\" matches on TLS SNI hostname for TCP passthrough", "type": [ "string", "null" - ], - "description": "Route type: \"http\" (default) matches on HTTP Host header,\n\"tls\" matches on TLS SNI hostname for TCP passthrough" + ] } - } - }, - "CreateS3SourceRequest": { - "type": "object", + }, "required": [ - "name", - "bucket_name", - "bucket_path", - "access_key_id", - "secret_key", - "region" + "domain", + "host", + "port" ], + "type": "object" + }, + "CreateS3SourceRequest": { "properties": { "access_key_id": { "type": "string" @@ -8004,28 +8030,28 @@ "type": "string" }, "endpoint": { + "description": "Optional endpoint URL for S3-compatible services like MinIO", + "example": "http://minio.example.com:9000", "type": [ "string", "null" - ], - "description": "Optional endpoint URL for S3-compatible services like MinIO", - "example": "http://minio.example.com:9000" + ] }, "force_path_style": { + "description": "Whether to use path-style addressing (default: true)", + "example": true, "type": [ "boolean", "null" - ], - "description": "Whether to use path-style addressing (default: true)", - "example": true + ] }, "is_default": { + "description": "When true, make this the default source (will swap out any existing default).\nThe very first S3 source is always created as default regardless of this flag.", + "example": false, "type": [ "boolean", "null" - ], - "description": "When true, make this the default source (will swap out any existing default).\nThe very first S3 source is always created as default regardless of this flag.", - "example": false + ] }, "name": { "type": "string" @@ -8036,10 +8062,18 @@ "secret_key": { "type": "string" } - } + }, + "required": [ + "name", + "bucket_name", + "bucket_path", + "access_key_id", + "secret_key", + "region" + ], + "type": "object" }, "CreateSandboxBody": { - "type": "object", "properties": { "_runtime": { "type": [ @@ -8048,52 +8082,52 @@ ] }, "backend": { + "description": "Isolation backend: `\"docker\"` (default) or `\"firecracker\"` (ADR-029,\nhardware-virtualized microVM — requires a host provisioned with\n`temps firecracker setup`). Omit for the platform default; existing\nclients are unaffected. Requesting an unavailable backend fails with\n400 rather than silently downgrading isolation.", "type": [ "string", "null" - ], - "description": "Isolation backend: `\"docker\"` (default) or `\"firecracker\"` (ADR-029,\nhardware-virtualized microVM \u2014 requires a host provisioned with\n`temps firecracker setup`). Omit for the platform default; existing\nclients are unaffected. Requesting an unavailable backend fails with\n400 rather than silently downgrading isolation." + ] }, "cpu_limit": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "disk_size_mb": { + "description": "Root disk size in MB (Firecracker only; Docker ignores it). Omit for\nthe platform default (1 GiB).", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Root disk size in MB (Firecracker only; Docker ignores it). Omit for\nthe platform default (1 GiB).", - "minimum": 0 + ] }, "env": { - "type": "object", - "description": "Extra env vars baked into the container on create.", "additionalProperties": { "type": "string" }, + "description": "Extra env vars baked into the container on create.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "image": { + "description": "Docker image override. `null` uses the platform default.", "type": [ "string", "null" - ], - "description": "Docker image override. `null` uses the platform default." + ] }, "memory_limit_mb": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "name": { "type": [ @@ -8103,27 +8137,27 @@ }, "networkPolicy": {}, "pids_limit": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "ports": { - "type": "array", + "description": "Ports the sandbox will listen on. Each port becomes a `routes[]`\nentry in the create/get response so `@vercel/sandbox`'s\n`sandbox.domain(port)` can resolve it client-side without an\nextra round-trip.", "items": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, - "description": "Ports the sandbox will listen on. Each port becomes a `routes[]`\nentry in the create/get response so `@vercel/sandbox`'s\n`sandbox.domain(port)` can resolve it client-side without an\nextra round-trip." + "type": "array" }, "preview_password": { + "description": "Optional preview-URL password. When set, every preview URL served\nfor this sandbox is gated behind a login form. 8–256 characters.\nOmit to leave preview URLs open (the sandbox ID remains the only\ngate). The plaintext is never returned; only the last-4 hint is\nsurfaced in `SandboxResponse.preview_password_hint`.", "type": [ "string", "null" - ], - "description": "Optional preview-URL password. When set, every preview URL served\nfor this sandbox is gated behind a login form. 8\u2013256 characters.\nOmit to leave preview URLs open (the sandbox ID remains the only\ngate). The plaintext is never returned; only the last-4 hint is\nsurfaced in `SandboxResponse.preview_password_hint`." + ] }, "projectId": { "type": [ @@ -8154,32 +8188,27 @@ ] }, "timeout": { + "description": "Idle timeout as sent by `@vercel/sandbox` (milliseconds). Converted\nto seconds when `timeout_secs` is absent.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Idle timeout as sent by `@vercel/sandbox` (milliseconds). Converted\nto seconds when `timeout_secs` is absent.", - "minimum": 0 + ] }, "timeout_secs": { + "description": "Idle timeout in seconds (temps-native). Clamped to `[60, 86400]`.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Idle timeout in seconds (temps-native). Clamped to `[60, 86400]`.", - "minimum": 0 + ] } - } + }, + "type": "object" }, "CreateSkillRequest": { - "type": "object", - "required": [ - "slug", - "name", - "content" - ], "properties": { "content": { "type": "string" @@ -8196,14 +8225,15 @@ "slug": { "type": "string" } - } - }, - "CreateSlackProviderRequest": { - "type": "object", + }, "required": [ + "slug", "name", - "config" + "content" ], + "type": "object" + }, + "CreateSlackProviderRequest": { "properties": { "config": { "$ref": "#/components/schemas/SlackConfig" @@ -8217,30 +8247,30 @@ "name": { "type": "string" } - } - }, - "CreateTeamMemberRequest": { - "type": "object", + }, "required": [ - "user_id", - "role" + "name", + "config" ], + "type": "object" + }, + "CreateTeamMemberRequest": { "properties": { "role": { "$ref": "#/components/schemas/TeamRole" }, "user_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "CreateTeamRequest": { - "type": "object", + }, "required": [ - "name", - "slug" + "user_id", + "role" ], + "type": "object" + }, + "CreateTeamRequest": { "properties": { "description": { "type": [ @@ -8254,14 +8284,14 @@ "slug": { "type": "string" } - } - }, - "CreateUserRequest": { - "type": "object", + }, "required": [ - "username", - "roles" + "name", + "slug" ], + "type": "object" + }, + "CreateUserRequest": { "properties": { "email": { "type": [ @@ -8269,6 +8299,9 @@ "null" ] }, + "must_change_password": { + "type": "boolean" + }, "password": { "type": [ "string", @@ -8276,22 +8309,22 @@ ] }, "roles": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "username": { "type": "string" } - } - }, - "CreateWebhookProviderRequest": { - "type": "object", + }, "required": [ - "name", - "config" + "username", + "roles" ], + "type": "object" + }, + "CreateWebhookProviderRequest": { "properties": { "config": { "$ref": "#/components/schemas/WebhookConfig" @@ -8305,87 +8338,82 @@ "name": { "type": "string" } - } - }, - "CreateWebhookRequestBody": { - "type": "object", + }, "required": [ - "url", - "events" + "name", + "config" ], + "type": "object" + }, + "CreateWebhookRequestBody": { "properties": { "enabled": { + "default": true, + "description": "Whether the webhook is enabled", "type": [ "boolean", "null" - ], - "description": "Whether the webhook is enabled", - "default": true + ] }, "events": { - "type": "array", - "items": { - "type": "string" - }, "description": "Event types to subscribe to", "example": [ "deployment.created", "deployment.succeeded" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "secret": { + "description": "Secret for HMAC signature verification (optional)", "type": [ "string", "null" - ], - "description": "Secret for HMAC signature verification (optional)" + ] }, "url": { - "type": "string", "description": "Target URL for webhook delivery", - "example": "https://example.com/webhook" + "example": "https://example.com/webhook", + "type": "string" } - } + }, + "required": [ + "url", + "events" + ], + "type": "object" }, "CreatedResource": { - "type": "object", "description": "Resource created during import (for rollback / audit)", - "required": [ - "resource_type", - "resource_id", - "resource_name" - ], "properties": { "resource_id": { - "type": "integer", + "description": "Resource ID", "format": "int32", - "description": "Resource ID" + "type": "integer" }, "resource_name": { - "type": "string", - "description": "Resource name" + "description": "Resource name", + "type": "string" }, "resource_type": { - "type": "string", - "description": "Resource type (project, environment, deployment, service, domain, etc.)" + "description": "Resource type (project, environment, deployment, service, domain, etc.)", + "type": "string" } - } - }, - "CronExecutionInfo": { - "type": "object", + }, "required": [ - "id", - "cron_id", - "executed_at", - "url", - "status_code", - "headers", - "response_time_ms" + "resource_type", + "resource_id", + "resource_name" ], + "type": "object" + }, + "CronExecutionInfo": { "properties": { "cron_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "error_message": { "type": [ @@ -8400,33 +8428,33 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "response_time_ms": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status_code": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "url": { "type": "string" } - } - }, - "CronInfo": { - "type": "object", + }, "required": [ "id", - "project_id", - "environment_id", - "path", - "schedule", - "created_at", - "updated_at" + "cron_id", + "executed_at", + "url", + "status_code", + "headers", + "response_time_ms" ], + "type": "object" + }, + "CronInfo": { "properties": { "created_at": { "type": "string" @@ -8438,12 +8466,12 @@ ] }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "next_run": { "type": [ @@ -8455,8 +8483,8 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "schedule": { "type": "string" @@ -8464,98 +8492,103 @@ "updated_at": { "type": "string" } - } - }, - "CrossProjectSiblingRef": { - "type": "object", - "description": "A sibling project that shares the same `trace_id`, returned by the\nPhase 1 cross-project banner endpoint.", + }, "required": [ + "id", "project_id", - "project_name", - "project_slug", - "first_seen" + "environment_id", + "path", + "schedule", + "created_at", + "updated_at" ], + "type": "object" + }, + "CrossProjectSiblingRef": { + "description": "A sibling project that shares the same `trace_id`, returned by the\nPhase 1 cross-project banner endpoint.", "properties": { "first_seen": { - "type": "string", + "description": "ISO 8601 timestamp (UTC, `Z` suffix) of first span ingest for this\n`(trace_id, project_id)` pair.", "format": "date-time", - "description": "ISO 8601 timestamp (UTC, `Z` suffix) of first span ingest for this\n`(trace_id, project_id)` pair." + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" }, "project_slug": { - "type": "string", - "description": "URL slug used to link into the sibling project's single-project trace view." + "description": "URL slug used to link into the sibling project's single-project trace view.", + "type": "string" } - } - }, - "CrossProjectTraceResponse": { - "type": "object", - "description": "Response body for `GET /otel/traces/cross-project/{trace_id}`.\n\nAn empty `siblings` vec is the normal single-project case \u2014 never 404.", + }, "required": [ - "trace_id", - "siblings" + "project_id", + "project_name", + "project_slug", + "first_seen" ], + "type": "object" + }, + "CrossProjectTraceResponse": { + "description": "Response body for `GET /otel/traces/cross-project/{trace_id}`.\n\nAn empty `siblings` vec is the normal single-project case — never 404.", "properties": { "siblings": { - "type": "array", + "description": "Projects other than the caller's that hold spans for this trace,\nordered by `first_seen ASC`.", "items": { "$ref": "#/components/schemas/CrossProjectSiblingRef" }, - "description": "Projects other than the caller's that hold spans for this trace,\nordered by `first_seen ASC`." + "type": "array" }, "trace_id": { - "type": "string", - "description": "The trace_id that was queried (echoed back for client convenience)." + "description": "The trace_id that was queried (echoed back for client convenience).", + "type": "string" } - } - }, - "CurrentStatusResponse": { - "type": "object", + }, "required": [ - "monitor_id", - "current_status", - "uptime_percentage" + "trace_id", + "siblings" ], + "type": "object" + }, + "CurrentStatusResponse": { "properties": { "avg_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "current_status": { "type": "string" }, "last_check_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "monitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "uptime_percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "CustomDomainRequest": { - "type": "object", + }, "required": [ - "domain", - "environment_id" + "monitor_id", + "current_status", + "uptime_percentage" ], + "type": "object" + }, + "CustomDomainRequest": { "properties": { "branch": { "type": [ @@ -8567,8 +8600,8 @@ "type": "string" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "redirect_to": { "type": [ @@ -8577,31 +8610,27 @@ ] }, "service_name": { + "description": "Docker Compose service name this domain routes to (only for docker-compose projects)", "type": [ "string", "null" - ], - "description": "Docker Compose service name this domain routes to (only for docker-compose projects)" + ] }, "status_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } - }, - "CustomDomainResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", "domain", - "status", - "created_at", - "updated_at" + "environment_id" ], + "type": "object" + }, + "CustomDomainResponse": { "properties": { "branch": { "type": [ @@ -8610,18 +8639,18 @@ ] }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "domain": { "type": "string" }, "domain_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment": { "oneOf": [ @@ -8634,22 +8663,22 @@ ] }, "expiration_time": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_renewed": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "message": { "type": [ @@ -8658,8 +8687,8 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "redirect_to": { "type": [ @@ -8668,164 +8697,166 @@ ] }, "service_name": { + "description": "Docker Compose service name this domain routes to", "type": [ "string", "null" - ], - "description": "Docker Compose service name this domain routes to" + ] }, "status": { "type": "string" }, "status_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "CustomerMovementResponse": { - "type": "object", + }, "required": [ - "bucket", - "new_customers", - "churned_customers" + "id", + "project_id", + "domain", + "status", + "created_at", + "updated_at" ], + "type": "object" + }, + "CustomerMovementResponse": { "properties": { "bucket": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "churned_customers": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "new_customers": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "bucket", + "new_customers", + "churned_customers" + ], + "type": "object" }, "DashboardLayout": { - "type": "object", "description": "The typed layout persisted (as JSONB) in `metric_dashboards.layout`.", - "required": [ - "sections" - ], "properties": { "sections": { - "type": "array", + "description": "Ordered sections that make up the dashboard.", "items": { "$ref": "#/components/schemas/DashboardSection" }, - "description": "Ordered sections that make up the dashboard." + "type": "array" } - } + }, + "required": [ + "sections" + ], + "type": "object" }, "DashboardProjectsAnalyticsQuery": { - "type": "object", "description": "Query parameters for batch dashboard analytics", - "required": [ - "project_ids", - "start_date", - "end_date" - ], "properties": { "end_date": { - "type": "string", + "description": "End date for the query range", "format": "date-time", - "description": "End date for the query range" + "type": "string" }, "project_ids": { - "type": "string", - "description": "Comma-separated list of project IDs" + "description": "Comma-separated list of project IDs", + "type": "string" }, "start_date": { - "type": "string", + "description": "Start date for the query range", "format": "date-time", - "description": "Start date for the query range" + "type": "string" } - } + }, + "required": [ + "project_ids", + "start_date", + "end_date" + ], + "type": "object" }, "DashboardProjectsAnalyticsResponse": { - "type": "object", "description": "Batch response for dashboard project analytics", - "required": [ - "projects" - ], "properties": { "projects": { - "type": "object", - "description": "Map of project_id -> analytics data", "additionalProperties": { "$ref": "#/components/schemas/ProjectDashboardAnalytics" }, + "description": "Map of project_id -> analytics data", "propertyNames": { "type": "string" - } + }, + "type": "object" } - } + }, + "required": [ + "projects" + ], + "type": "object" }, "DashboardSection": { - "type": "object", "description": "A titled group of tiles within a dashboard.", - "required": [ - "id", - "title", - "tiles" - ], "properties": { "id": { - "type": "string", - "description": "Stable client-generated section id." + "description": "Stable client-generated section id.", + "type": "string" }, "tiles": { - "type": "array", + "description": "Tiles rendered within this section.", "items": { "$ref": "#/components/schemas/DashboardTile" }, - "description": "Tiles rendered within this section." + "type": "array" }, "title": { - "type": "string", - "description": "Section heading." + "description": "Section heading.", + "type": "string" } - } - }, - "DashboardTile": { - "type": "object", - "description": "A single metric tile within a dashboard section.", + }, "required": [ "id", - "metric_name", - "aggregation" + "title", + "tiles" ], + "type": "object" + }, + "DashboardTile": { + "description": "A single metric tile within a dashboard section.", "properties": { "aggregation": { - "type": "string", - "description": "Aggregation applied per bucket: one of\n`avg|sum|min|max|count|rate|p50|p90|p95|p99`." + "description": "Aggregation applied per bucket: one of\n`avg|sum|min|max|count|rate|p50|p90|p95|p99`.", + "type": "string" }, "group_by": { - "type": "array", + "description": "Label keys to break the metric down by (group-by / multi-series view).\nEmpty = single aggregated series (current behavior). Max 2 keys — more\ndimensions are unreadable in a chart (ADR-026 Phase 2). Each key must\nmatch `[a-zA-Z0-9_.:-]`. Wired directly to `MetricQuery.group_by` by\nthe tile query path (separate frontend task).", "items": { "type": "string" }, - "description": "Label keys to break the metric down by (group-by / multi-series view).\nEmpty = single aggregated series (current behavior). Max 2 keys \u2014 more\ndimensions are unreadable in a chart (ADR-026 Phase 2). Each key must\nmatch `[a-zA-Z0-9_.:-]`. Wired directly to `MetricQuery.group_by` by\nthe tile query path (separate frontend task)." + "type": "array" }, "id": { - "type": "string", - "description": "Stable client-generated tile id (used as a React key / for reordering)." + "description": "Stable client-generated tile id (used as a React key / for reordering).", + "type": "string" }, "label_filters": { - "type": "array", + "description": "AND-combined label equality filters: `[[\"key\",\"value\"],…]`. Empty = no\nfiltering. Max 10 pairs; keys must match `[a-zA-Z0-9_.:-]`; values\ncapped at 500 characters. Not yet wired into the tile query path\n(Phase 1 ADR-026 — field round-trips and validates; query wiring is\na separate frontend task).", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -8834,361 +8865,367 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "AND-combined label equality filters: `[[\"key\",\"value\"],\u2026]`. Empty = no\nfiltering. Max 10 pairs; keys must match `[a-zA-Z0-9_.:-]`; values\ncapped at 500 characters. Not yet wired into the tile query path\n(Phase 1 ADR-026 \u2014 field round-trips and validates; query wiring is\na separate frontend task)." + "type": "array" }, "metric_name": { - "type": "string", - "description": "The metric name to chart (e.g. `http.server.duration`)." + "description": "The metric name to chart (e.g. `http.server.duration`).", + "type": "string" }, "title": { + "description": "Optional display title; falls back to the metric name in the UI.", "type": [ "string", "null" - ], - "description": "Optional display title; falls back to the metric name in the UI." + ] } - } + }, + "required": [ + "id", + "metric_name", + "aggregation" + ], + "type": "object" }, "DataImplication": { - "type": "object", "description": "A specific data implication the user needs to understand", - "required": [ - "severity", - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable description of what could happen" + "description": "Human-readable description of what could happen", + "type": "string" }, "recommended_action": { + "description": "What the user should do about it (if anything)", "type": [ "string", "null" - ], - "description": "What the user should do about it (if anything)" + ] }, "severity": { "$ref": "#/components/schemas/DataImplicationSeverity", "description": "Severity of this implication" } - } + }, + "required": [ + "severity", + "message" + ], + "type": "object" }, "DataImplicationSeverity": { - "type": "string", "description": "Severity of a data implication", "enum": [ "info", "warning", "data-not-migrated", "potential-data-loss" - ] + ], + "type": "string" }, "DatabaseMetricsResponse": { - "type": "object", "description": "Response for the per-database metrics breakdown.", - "required": [ - "databases" - ], "properties": { "databases": { - "type": "array", + "description": "One entry per database, sorted by the first metric descending\n(largest first) so the biggest database leads the table.", "items": { "$ref": "#/components/schemas/DatabaseMetricsRow" }, - "description": "One entry per database, sorted by the first metric descending\n(largest first) so the biggest database leads the table." + "type": "array" } - } + }, + "required": [ + "databases" + ], + "type": "object" }, "DatabaseMetricsRow": { - "type": "object", "description": "Per-database metric values for a Postgres service.\n\nA Postgres instance can host many databases (some unrelated to this\nservice). The collector records per-`datname` series; this groups the\nlatest value of each requested metric by database so the UI can render a\n\"Databases\" breakdown table instead of one collapsed number.", - "required": [ - "database", - "metrics" - ], "properties": { "database": { - "type": "string", - "description": "Database name (`datname`)." + "description": "Database name (`datname`).", + "type": "string" }, "metrics": { - "type": "object", - "description": "Latest value of each requested metric for this database\n(e.g. `{\"pg.database_size_bytes\": 7943871, \"pg.cache_hit_ratio\": 0.99}`).", "additionalProperties": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, + "description": "Latest value of each requested metric for this database\n(e.g. `{\"pg.database_size_bytes\": 7943871, \"pg.cache_hit_ratio\": 0.99}`).", "propertyNames": { "type": "string" - } + }, + "type": "object" } - } + }, + "required": [ + "database", + "metrics" + ], + "type": "object" }, "DelRequest": { - "type": "object", "description": "Request to delete keys", - "required": [ - "keys" - ], "properties": { "keys": { - "type": "array", - "items": { - "type": "string" - }, "description": "The key(s) to delete", "example": [ "user:123", "user:456" - ] - }, - "project_id": { + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "keys" + ], + "type": "object" }, "DelResponse": { - "type": "object", "description": "Response for delete operation", - "required": [ - "deleted" - ], "properties": { "deleted": { - "type": "integer", - "format": "int64", "description": "Number of keys deleted", - "example": 2 + "example": 2, + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "deleted" + ], + "type": "object" }, "DeleteBlobRequest": { - "type": "object", "description": "Request to delete blobs", - "required": [ - "pathnames" - ], "properties": { "pathnames": { - "type": "array", - "items": { - "type": "string" - }, "description": "Pathnames to delete (relative to project)", "example": [ "images/avatar.png", "documents/file.pdf" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "projectId": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "pathnames" + ], + "type": "object" }, "DeleteBlobResponse": { - "type": "object", "description": "Response after deleting blobs", - "required": [ - "deleted" - ], "properties": { "deleted": { - "type": "integer", - "format": "int64", "description": "Number of blobs deleted", - "example": 2 + "example": 2, + "format": "int64", + "type": "integer" } - } - }, - "DeleteResponse": { - "type": "object", + }, "required": [ "deleted" ], + "type": "object" + }, + "DeleteResponse": { "properties": { "deleted": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "deleted" + ], + "type": "object" }, "DeployFromImageRequest": { - "type": "object", "properties": { "external_image_id": { + "description": "External image ID (if already registered). If provided without image_ref,\nthe image reference will be fetched from the registered external image.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "External image ID (if already registered). If provided without image_ref,\nthe image reference will be fetched from the registered external image." + ] }, "health_check_path": { + "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nImage deploys can't read `.temps.yaml`, so this sets the path the deployer\nprobes after the container starts and the path the environment's uptime\nmonitor checks. Must start with '/'. When omitted, defaults to \"/\".", + "example": "/api/healthz", "type": [ "string", "null" - ], - "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nImage deploys can't read `.temps.yaml`, so this sets the path the deployer\nprobes after the container starts and the path the environment's uptime\nmonitor checks. Must start with '/'. When omitted, defaults to \"/\".", - "example": "/api/healthz" + ] }, "image_ref": { + "description": "Docker image reference (e.g., \"ghcr.io/org/app:v1.0\")\nRequired if external_image_id is not provided", + "example": "ghcr.io/myorg/myapp:v1.0", "type": [ "string", "null" - ], - "description": "Docker image reference (e.g., \"ghcr.io/org/app:v1.0\")\nRequired if external_image_id is not provided", - "example": "ghcr.io/myorg/myapp:v1.0" + ] }, "metadata": { "description": "Optional deployment metadata" } - } + }, + "type": "object" }, "DeployFromImageUploadQuery": { - "type": "object", "description": "Query parameters for deploying from an uploaded image tarball", "properties": { "health_check_path": { + "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nMust start with '/'. When omitted, defaults to \"/\".", + "example": "/api/healthz", "type": [ "string", "null" - ], - "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nMust start with '/'. When omitted, defaults to \"/\".", - "example": "/api/healthz" + ] }, "tag": { + "description": "Tag to apply to the imported image (e.g., \"myapp:v1.0\")\nIf not provided, a unique tag will be generated", + "example": "myapp:v1.0", "type": [ "string", "null" - ], - "description": "Tag to apply to the imported image (e.g., \"myapp:v1.0\")\nIf not provided, a unique tag will be generated", - "example": "myapp:v1.0" + ] } - } + }, + "type": "object" }, "DeployFromStaticRequest": { - "type": "object", - "required": [ - "static_bundle_id" - ], "properties": { "health_check_path": { + "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nStatic deploys can't read `.temps.yaml`, so this sets the path the deployer\nprobes after the container starts and the path the environment's uptime\nmonitor checks. Must start with '/'. When omitted, defaults to \"/\".", + "example": "/api/healthz", "type": [ "string", "null" - ], - "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nStatic deploys can't read `.temps.yaml`, so this sets the path the deployer\nprobes after the container starts and the path the environment's uptime\nmonitor checks. Must start with '/'. When omitted, defaults to \"/\".", - "example": "/api/healthz" + ] }, "metadata": { "description": "Optional deployment metadata" }, "static_bundle_id": { - "type": "integer", + "description": "Static bundle ID (required)", "format": "int32", - "description": "Static bundle ID (required)" + "type": "integer" } - } + }, + "required": [ + "static_bundle_id" + ], + "type": "object" }, "DeploymentConfig": { - "type": "object", "description": "Deployment configuration shared between projects and environments\n\nThis configuration can be set at the project level (as defaults) and\noverridden at the environment level for specific deployments.\n\nNote: Environment variables are managed separately and are not part of this config.", "properties": { "antiAffinity": { - "type": "boolean", - "description": "Anti-affinity: spread replicas across different nodes.\n\nWhen enabled, the scheduler avoids placing two replicas of the same\nenvironment on the same node. If there are fewer eligible nodes than\nreplicas, remaining replicas wrap around (best-effort spreading).\n\nDefaults to `true` \u2014 replicas spread by default." + "description": "Anti-affinity: spread replicas across different nodes.\n\nWhen enabled, the scheduler avoids placing two replicas of the same\nenvironment on the same node. If there are fewer eligible nodes than\nreplicas, remaining replicas wrap around (best-effort spreading).\n\nDefaults to `true` — replicas spread by default.", + "type": "boolean" }, "automaticDeploy": { + "description": "Enable automatic deployments on git push.\n`None` = inherit from project config; `Some(true/false)` = explicit override.\nStored as JSONB so absent key → `None` (inherit), never silently defaults to false.", "type": [ "boolean", "null" - ], - "description": "Enable automatic deployments on git push.\n`None` = inherit from project config; `Some(true/false)` = explicit override.\nStored as JSONB so absent key \u2192 `None` (inherit), never silently defaults to false." + ] }, "containerExecEnabled": { - "type": "boolean", - "description": "Enable container exec/shell access (disabled by default for security)" + "description": "Enable container exec/shell access (disabled by default for security)", + "type": "boolean" }, "cpuLimit": { + "description": "CPU limit in microcores, where 1_000_000 = 1 full CPU core\n(e.g., 2_000_000 = 2 CPUs). NOT millicores. `None` = uncapped.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU limit in microcores, where 1_000_000 = 1 full CPU core\n(e.g., 2_000_000 = 2 CPUs). NOT millicores. `None` = uncapped." + ] }, "cpuRequest": { + "description": "CPU request in microcores, where 1_000_000 = 1 full CPU core\n(e.g., 100_000 = 0.1 CPU, 500_000 = 0.5 CPU, 2_000_000 = 2 CPUs).\nNOT millicores — the deployer formats this as `{n}u` and converts\n`n / 1_000_000` cores into Docker nano_cpus.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU request in microcores, where 1_000_000 = 1 full CPU core\n(e.g., 100_000 = 0.1 CPU, 500_000 = 0.5 CPU, 2_000_000 = 2 CPUs).\nNOT millicores \u2014 the deployer formats this as `{n}u` and converts\n`n / 1_000_000` cores into Docker nano_cpus." + ] }, "crossArchitectureBuilds": { + "description": "Build one image per architecture the eligible nodes run.\n\n`None`/`false` (the default) builds exactly once, on the control\nplane's native platform — byte-for-byte the behaviour of a\nsingle-architecture cluster. When enabled and the nodes this\ndeployment could land on span more than one architecture, the build\njob produces one image per architecture; the non-native ones go\nthrough the daemon's `platform` option, which requires QEMU binfmt\nhandlers registered on the control plane.\n\n**Opt-in on purpose.** Cross-architecture builds are emulated and\nsubstantially slower, and deriving them from cluster topology would\nmean a single node joining silently changes build behaviour for every\ndeployment in the cluster. It also keeps the decision on operator\nconfig rather than on a value each node reports about itself.\n\n`Option` so an environment inherits the project's setting\n(`None`) or overrides it, matching `automatic_deploy`.", "type": [ "boolean", "null" - ], - "description": "Build one image per architecture the eligible nodes run.\n\n`None`/`false` (the default) builds exactly once, on the control\nplane's native platform \u2014 byte-for-byte the behaviour of a\nsingle-architecture cluster. When enabled and the nodes this\ndeployment could land on span more than one architecture, the build\njob produces one image per architecture; the non-native ones go\nthrough the daemon's `platform` option, which requires QEMU binfmt\nhandlers registered on the control plane.\n\n**Opt-in on purpose.** Cross-architecture builds are emulated and\nsubstantially slower, and deriving them from cluster topology would\nmean a single node joining silently changes build behaviour for every\ndeployment in the cluster. It also keeps the decision on operator\nconfig rather than on a value each node reports about itself.\n\n`Option` so an environment inherits the project's setting\n(`None`) or overrides it, matching `automatic_deploy`." + ] }, "exposedPort": { + "description": "Port exposed by the container\nIf not specified, will be auto-detected from Docker image or default to 3000", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Port exposed by the container\nIf not specified, will be auto-detected from Docker image or default to 3000" + ] }, "idleTimeoutSeconds": { - "type": "integer", + "description": "Seconds of inactivity before containers are stopped in on-demand mode.\nOnly used when `on_demand` is true. Min: 60, Max: 86400 (24h).\nDefault: 300 (5 minutes).", "format": "int32", - "description": "Seconds of inactivity before containers are stopped in on-demand mode.\nOnly used when `on_demand` is true. Min: 60, Max: 86400 (24h).\nDefault: 300 (5 minutes)." + "type": "integer" }, "memoryLimit": { + "description": "Memory limit in megabytes. Three-state semantics:\n- `None` → inherit the parent layer (env inherits project, project\n inherits the seeded default); used by the settings UI's \"Use default\".\n- `Some(0)` → explicit **uncapped**: stop inheriting and run with no\n memory limit. This is the deliberate escape hatch for dedicated\n workloads, distinct from `None`.\n- `Some(n)` → hard cap of `n` MB.\n\n`merge`/resolution keep `Some(0)` as a present value (it wins precedence\nover a parent cap), and the deployer collapses it to \"no limit\" before\ntalking to Docker.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory limit in megabytes. Three-state semantics:\n- `None` \u2192 inherit the parent layer (env inherits project, project\n inherits the seeded default); used by the settings UI's \"Use default\".\n- `Some(0)` \u2192 explicit **uncapped**: stop inheriting and run with no\n memory limit. This is the deliberate escape hatch for dedicated\n workloads, distinct from `None`.\n- `Some(n)` \u2192 hard cap of `n` MB.\n\n`merge`/resolution keep `Some(0)` as a present value (it wins precedence\nover a parent cap), and the deployer collapses it to \"no limit\" before\ntalking to Docker." + ] }, "memoryRequest": { + "description": "Memory request in megabytes (e.g., 128 = 128MB)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory request in megabytes (e.g., 128 = 128MB)" + ] }, "onDemand": { - "type": "boolean", - "description": "Enable on-demand mode (scale-to-zero).\nWhen enabled, containers are stopped after `idle_timeout_seconds` of no traffic\nand automatically started when a new request arrives." + "description": "Enable on-demand mode (scale-to-zero).\nWhen enabled, containers are stopped after `idle_timeout_seconds` of no traffic\nand automatically started when a new request arrives.", + "type": "boolean" }, "performanceMetricsEnabled": { - "type": "boolean", - "description": "Enable performance metrics collection (speed insights)" + "description": "Enable performance metrics collection (speed insights)", + "type": "boolean" }, "replicas": { - "type": "integer", + "description": "Number of replicas/instances to run\nDefaults to 1 replica", "format": "int32", - "description": "Number of replicas/instances to run\nDefaults to 1 replica" + "type": "integer" }, "security": { "oneOf": [ @@ -9202,119 +9239,110 @@ ] }, "sessionRecordingEnabled": { - "type": "boolean", - "description": "Enable session recording for analytics" + "description": "Enable session recording for analytics", + "type": "boolean" }, "targetLabels": { - "description": "Label selector for node-based scheduling. Replicas are only deployed to\nnodes whose labels match the selector.\n\nMatching rules:\n- **Same key, array value** \u2192 OR: node must match any value\n- **Different keys** \u2192 AND: node must satisfy all keys\n\nExample: `{\"region\": [\"us\", \"asia\"], \"gpu\": \"true\"}`\n\u2192 (region=us OR region=asia) AND gpu=true\n\nApplied after `target_nodes` filtering (they stack)." + "description": "Label selector for node-based scheduling. Replicas are only deployed to\nnodes whose labels match the selector.\n\nMatching rules:\n- **Same key, array value** → OR: node must match any value\n- **Different keys** → AND: node must satisfy all keys\n\nExample: `{\"region\": [\"us\", \"asia\"], \"gpu\": \"true\"}`\n→ (region=us OR region=asia) AND gpu=true\n\nApplied after `target_nodes` filtering (they stack)." }, "targetNodes": { + "description": "Optional list of node IDs to deploy to. When set, replicas are distributed\nonly across these nodes (round-robin). When None, the scheduler distributes\nacross all active nodes (or deploys locally if no nodes exist).", + "items": { + "format": "int32", + "type": "integer" + }, "type": [ "array", "null" - ], - "items": { - "type": "integer", - "format": "int32" - }, - "description": "Optional list of node IDs to deploy to. When set, replicas are distributed\nonly across these nodes (round-robin). When None, the scheduler distributes\nacross all active nodes (or deploys locally if no nodes exist)." + ] }, "wakeTimeoutSeconds": { - "type": "integer", + "description": "Max seconds to wait for containers to start when waking from on-demand sleep.\nRequests return 503 if exceeded. Default: 30.", "format": "int32", - "description": "Max seconds to wait for containers to start when waking from on-demand sleep.\nRequests return 503 if exceeded. Default: 30." + "type": "integer" } - } + }, + "type": "object" }, "DeploymentConfigSnapshot": { - "type": "object", "description": "Deployment configuration snapshot for deployments\n\nThis extends DeploymentConfig with environment variables to capture\nthe complete state of a deployment at the time it was created.", "properties": { "automaticDeploy": { - "type": "boolean", - "description": "Enable automatic deployments on git push" + "description": "Enable automatic deployments on git push", + "type": "boolean" }, "containerExecEnabled": { - "type": "boolean", - "description": "Enable container exec/shell access" + "description": "Enable container exec/shell access", + "type": "boolean" }, "cpuLimit": { + "description": "CPU limit in millicores", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU limit in millicores" + ] }, "cpuRequest": { + "description": "CPU request in millicores", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU request in millicores" + ] }, "environmentVariables": { - "type": "object", - "description": "Environment variables used for this deployment", "additionalProperties": { "type": "string" }, + "description": "Environment variables used for this deployment", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "exposedPort": { + "description": "Port exposed by the container", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Port exposed by the container" + ] }, "memoryLimit": { + "description": "Memory limit in megabytes", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory limit in megabytes" + ] }, "memoryRequest": { + "description": "Memory request in megabytes", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory request in megabytes" + ] }, "performanceMetricsEnabled": { - "type": "boolean", - "description": "Enable performance metrics collection" + "description": "Enable performance metrics collection", + "type": "boolean" }, "replicas": { - "type": "integer", + "description": "Number of replicas", "format": "int32", - "description": "Number of replicas" + "type": "integer" }, "sessionRecordingEnabled": { - "type": "boolean", - "description": "Enable session recording" + "description": "Enable session recording", + "type": "boolean" } - } + }, + "type": "object" }, "DeploymentConfiguration": { - "type": "object", "description": "Deployment-level configuration", - "required": [ - "image", - "strategy", - "env_vars", - "ports", - "volumes", - "network", - "resources" - ], "properties": { "build": { "oneOf": [ @@ -9328,31 +9356,31 @@ ] }, "command": { - "type": [ - "array", - "null" - ], + "description": "Command override", "items": { "type": "string" }, - "description": "Command override" - }, - "entrypoint": { "type": [ "array", "null" - ], + ] + }, + "entrypoint": { + "description": "Entrypoint override", "items": { "type": "string" }, - "description": "Entrypoint override" + "type": [ + "array", + "null" + ] }, "env_vars": { - "type": "array", + "description": "Environment variables", "items": { "$ref": "#/components/schemas/EnvironmentVariable" }, - "description": "Environment variables" + "type": "array" }, "git": { "oneOf": [ @@ -9377,19 +9405,19 @@ ] }, "image": { - "type": "string", - "description": "Image to deploy" + "description": "Image to deploy", + "type": "string" }, "network": { "$ref": "#/components/schemas/NetworkConfiguration", "description": "Network configuration" }, "ports": { - "type": "array", + "description": "Port mappings", "items": { "$ref": "#/components/schemas/PortMapping" }, - "description": "Port mappings" + "type": "array" }, "resources": { "$ref": "#/components/schemas/ResourceLimits", @@ -9400,47 +9428,48 @@ "description": "Deployment strategy" }, "volumes": { - "type": "array", + "description": "Volume mounts", "items": { "$ref": "#/components/schemas/VolumeMount" }, - "description": "Volume mounts" + "type": "array" }, "working_dir": { + "description": "Working directory", "type": [ "string", "null" - ], - "description": "Working directory" + ] } - } + }, + "required": [ + "image", + "strategy", + "env_vars", + "ports", + "volumes", + "network", + "resources" + ], + "type": "object" }, "DeploymentContainerLogContentResponse": { - "type": "object", "description": "A single captured container-log dump, including its full text content.", - "required": [ - "id", - "container_name", - "size_bytes", - "truncated", - "captured_at", - "content" - ], "properties": { "captured_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "container_name": { "type": "string" }, "content": { - "type": "string", - "description": "The captured plain-text log content." + "description": "The captured plain-text log content.", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "service_name": { "type": [ @@ -9449,31 +9478,30 @@ ] }, "size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "truncated": { "type": "boolean" } - } - }, - "DeploymentContainerLogResponse": { - "type": "object", - "description": "Metadata for one captured (historical) container-log dump. Listed on the\ndeployment detail page so a user can pick which past container's logs to read.", + }, "required": [ "id", - "deployment_id", - "container_id", "container_name", "size_bytes", "truncated", - "captured_at" + "captured_at", + "content" ], + "type": "object" + }, + "DeploymentContainerLogResponse": { + "description": "Metadata for one captured (historical) container-log dump. Listed on the\ndeployment detail page so a user can pick which past container's logs to read.", "properties": { "captured_at": { - "type": "integer", + "description": "Unix epoch milliseconds of when the logs were captured (just before\nteardown). Matches the timestamp convention used by `DeploymentResponse`.", "format": "int64", - "description": "Unix epoch milliseconds of when the logs were captured (just before\nteardown). Matches the timestamp convention used by `DeploymentResponse`." + "type": "integer" }, "container_id": { "type": "string" @@ -9482,19 +9510,19 @@ "type": "string" }, "deployment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "node_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "service_name": { "type": [ @@ -9503,47 +9531,50 @@ ] }, "size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "truncated": { "type": "boolean" } - } + }, + "required": [ + "id", + "deployment_id", + "container_id", + "container_name", + "size_bytes", + "truncated", + "captured_at" + ], + "type": "object" }, "DeploymentContainerLogsListResponse": { - "type": "object", "description": "The list of captured container-log dumps for a deployment.", - "required": [ - "logs" - ], "properties": { "logs": { - "type": "array", "items": { "$ref": "#/components/schemas/DeploymentContainerLogResponse" - } + }, + "type": "array" } - } - }, - "DeploymentEnvironmentResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "slug", - "domains" + "logs" ], + "type": "object" + }, + "DeploymentEnvironmentResponse": { "properties": { "domains": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -9551,30 +9582,25 @@ "slug": { "type": "string" } - } - }, - "DeploymentJobResponse": { - "type": "object", + }, "required": [ "id", - "deployment_id", - "job_id", - "job_type", "name", - "status", - "created_at", - "updated_at", - "log_id" + "slug", + "domains" ], + "type": "object" + }, + "DeploymentJobResponse": { "properties": { "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "dependencies": {}, "deployment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "description": { "type": [ @@ -9589,22 +9615,22 @@ ] }, "execution_order": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "finished_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "job_config": { "description": "Internal workflow configuration is intentionally redacted. It can\ncontain legacy plaintext secrets or encrypted secret envelopes." @@ -9623,95 +9649,106 @@ }, "outputs": {}, "started_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "status": { "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "DeploymentJobsResponse": { - "type": "object", + }, "required": [ - "jobs", - "total" + "id", + "deployment_id", + "job_id", + "job_type", + "name", + "status", + "created_at", + "updated_at", + "log_id" ], + "type": "object" + }, + "DeploymentJobsResponse": { "properties": { "jobs": { - "type": "array", "items": { "$ref": "#/components/schemas/DeploymentJobResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "DeploymentListResponse": { - "type": "object", + }, "required": [ - "deployments", - "total", - "page", - "per_page" + "jobs", + "total" ], + "type": "object" + }, + "DeploymentListResponse": { "properties": { "deployments": { - "type": "array", "items": { "$ref": "#/components/schemas/DeploymentResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "per_page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "deployments", + "total", + "page", + "per_page" + ], + "type": "object" }, "DeploymentMetadata": { - "type": "object", "description": "Deployment metadata - typed information about the deployment", "properties": { "buildDurationMs": { + "description": "Build duration in milliseconds", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Build duration in milliseconds" + ] }, "builder": { + "description": "Docker builder used (e.g., \"nixpacks\", \"dockerfile\")", "type": [ "string", "null" - ], - "description": "Docker builder used (e.g., \"nixpacks\", \"dockerfile\")" + ] }, "deploymentDurationMs": { + "description": "Deployment duration in milliseconds", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Deployment duration in milliseconds" + ] }, "deploymentSourceType": { "oneOf": [ @@ -9725,34 +9762,34 @@ ] }, "dockerfilePath": { + "description": "Dockerfile path if using Dockerfile builder", "type": [ "string", "null" - ], - "description": "Dockerfile path if using Dockerfile builder" + ] }, "externalImageId": { + "description": "External image ID (reference to external_images table)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "External image ID (reference to external_images table)" + ] }, "externalImageRef": { + "description": "External Docker image reference (for docker_image source type)\ne.g., \"ghcr.io/org/app:v1.0\" or \"docker.io/myapp:sha-abc123\"", "type": [ "string", "null" - ], - "description": "External Docker image reference (for docker_image source type)\ne.g., \"ghcr.io/org/app:v1.0\" or \"docker.io/myapp:sha-abc123\"" + ] }, "fileCount": { + "description": "Number of files in the build output", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Number of files in the build output" + ] }, "gitPushEvent": { "oneOf": [ @@ -9766,86 +9803,98 @@ ] }, "healthCheckPath": { + "description": "Explicit deploy-time HTTP health-check path override.\nImage/static deploys can't read `.temps.yaml`, so this lets the deploy\nrequest set a custom path (e.g. \"/api/healthz\"). When present it takes\npriority over any `.temps.yaml` `health.path` value. Always starts with '/'.", "type": [ "string", "null" - ], - "description": "Explicit deploy-time HTTP health-check path override.\nImage/static deploys can't read `.temps.yaml`, so this lets the deploy\nrequest set a custom path (e.g. \"/api/healthz\"). When present it takes\npriority over any `.temps.yaml` `health.path` value. Always starts with '/'." + ] }, "imageSizeBytes": { + "description": "Total size of the built image in bytes", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total size of the built image in bytes" + ] }, "imageUploadedLocally": { - "type": "boolean", - "description": "Whether the image was uploaded directly (via docker save/load) rather than pulled from registry\nWhen true, the PullExternalImageJob is skipped since the image is already loaded locally" + "description": "Whether the image was uploaded directly (via docker save/load) rather than pulled from registry\nWhen true, the PullExternalImageJob is skipped since the image is already loaded locally", + "type": "boolean" }, "isRollback": { - "type": "boolean", - "description": "Whether this is a rollback deployment" + "description": "Whether this is a rollback deployment", + "type": "boolean" }, "labels": { - "type": "array", + "description": "Custom labels/tags for the deployment", "items": { "type": "string" }, - "description": "Custom labels/tags for the deployment" + "type": "array" }, "rolledBackFromId": { + "description": "ID of the deployment this was rolled back from (if applicable)", + "format": "int32", "type": [ "integer", "null" - ], + ] + }, + "sourceBundleContentType": { + "description": "Uploaded source archive content type.", + "type": [ + "string", + "null" + ] + }, + "sourceBundleId": { + "description": "Uploaded source archive ID. Source archives are extracted before the\nregular preset build pipeline and do not require Git metadata.", "format": "int32", - "description": "ID of the deployment this was rolled back from (if applicable)" + "type": [ + "integer", + "null" + ] + }, + "sourceBundlePath": { + "description": "Uploaded source archive path in the Temps data directory.", + "type": [ + "string", + "null" + ] }, "staticBundleContentType": { + "description": "Static bundle content type (for proper extraction: application/gzip or application/zip)", "type": [ "string", "null" - ], - "description": "Static bundle content type (for proper extraction: application/gzip or application/zip)" + ] }, "staticBundleId": { + "description": "Static bundle ID (reference to static_bundles table, for static_files source type)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Static bundle ID (reference to static_bundles table, for static_files source type)" + ] }, "staticBundlePath": { + "description": "Static bundle path in blob storage (for static_files source type)", "type": [ "string", "null" - ], - "description": "Static bundle path in blob storage (for static_files source type)" + ] }, "uploadedImageId": { + "description": "Docker image ID of the locally uploaded image (sha256:...)\nUsed to verify the image exists before deployment", "type": [ "string", "null" - ], - "description": "Docker image ID of the locally uploaded image (sha256:...)\nUsed to verify the image exists before deployment" + ] } - } + }, + "type": "object" }, "DeploymentResponse": { - "type": "object", - "required": [ - "id", - "project_id", - "environment_id", - "environment", - "status", - "url", - "created_at", - "is_current" - ], "properties": { "branch": { "type": [ @@ -9866,11 +9915,11 @@ ] }, "commit_date": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "commit_hash": { "type": [ @@ -9885,8 +9934,8 @@ ] }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "deployment_config": { "oneOf": [ @@ -9903,19 +9952,19 @@ "$ref": "#/components/schemas/DeploymentEnvironmentResponse" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "finished_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_current": { "type": "boolean" @@ -9932,8 +9981,8 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "screenshot_location": { "type": [ @@ -9942,11 +9991,11 @@ ] }, "started_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "status": { "type": "string" @@ -9960,19 +10009,24 @@ "url": { "type": "string" } - } - }, - "DeploymentStateResponse": { - "type": "object", + }, "required": [ "id", - "state", - "message" + "project_id", + "environment_id", + "environment", + "status", + "url", + "created_at", + "is_current" ], + "type": "object" + }, + "DeploymentStateResponse": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -9980,119 +10034,126 @@ "state": { "type": "string" } - } + }, + "required": [ + "id", + "state", + "message" + ], + "type": "object" }, "DeploymentStrategy": { - "type": "string", "description": "Deployment strategy", "enum": [ "replace", "blue-green", "rolling" - ] + ], + "type": "string" }, "DeploymentTokenListResponse": { - "type": "object", - "required": [ - "tokens", - "total" - ], "properties": { "tokens": { - "type": "array", "items": { "$ref": "#/components/schemas/DeploymentTokenResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "DeploymentTokenResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "token_prefix", - "is_active", - "created_at" + "tokens", + "total" ], + "type": "object" + }, + "DeploymentTokenResponse": { "properties": { "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00Z", "format": "date-time", - "example": "2024-01-01T00:00:00Z" + "type": "string" }, "created_by": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" }, "last_used_at": { + "example": "2024-01-01T00:00:00Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-01-01T00:00:00Z" + ] }, "name": { "type": "string" }, "permissions": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "token_prefix": { "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "name", + "token_prefix", + "is_active", + "created_at" + ], + "type": "object" }, "DetectionConfig": { + "description": "The typed detector definition stored (as jsonb) in\n`metric_alert_rules.detection_config`.\n\nToday only [`DetectionConfig::Static`] is evaluable; the other variants are\nschema-present (so the SDK/UI and storage are already future-shaped) but\nrejected by [`DetectionConfig::validate`] until their evaluator lands. Each is\nthen enabled code-only, with no schema migration.", "oneOf": [ { "allOf": [ @@ -10101,18 +10162,18 @@ "description": "v0 (shipping): static threshold comparison of the aggregated value." }, { - "type": "object", - "required": [ - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "static" - ] + ], + "type": "string" } - } + }, + "required": [ + "kind" + ], + "type": "object" } ], "description": "v0 (shipping): static threshold comparison of the aggregated value." @@ -10121,24 +10182,24 @@ "allOf": [ { "$ref": "#/components/schemas/AnomalyParams", - "description": "Seasonal anomaly band (basic/agile/robust/ewma share this variant \u2014 the\nalgorithm is a field, not a new kind). Creation rejected until evaluated." + "description": "Seasonal anomaly band (basic/agile/robust/ewma share this variant — the\nalgorithm is a field, not a new kind). Creation rejected until evaluated." }, { - "type": "object", - "required": [ - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "anomaly" - ] + ], + "type": "string" } - } + }, + "required": [ + "kind" + ], + "type": "object" } ], - "description": "Seasonal anomaly band (basic/agile/robust/ewma share this variant \u2014 the\nalgorithm is a field, not a new kind). Creation rejected until evaluated." + "description": "Seasonal anomaly band (basic/agile/robust/ewma share this variant — the\nalgorithm is a field, not a new kind). Creation rejected until evaluated." }, { "allOf": [ @@ -10147,18 +10208,18 @@ "description": "Predict a future threshold breach (capacity planning). Stub." }, { - "type": "object", - "required": [ - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "forecast" - ] + ], + "type": "string" } - } + }, + "required": [ + "kind" + ], + "type": "object" } ], "description": "Predict a future threshold breach (capacity planning). Stub." @@ -10170,18 +10231,18 @@ "description": "Cross-series population outlier (one host misbehaving vs its peers). Stub." }, { - "type": "object", - "required": [ - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "outlier" - ] + ], + "type": "string" } - } + }, + "required": [ + "kind" + ], + "type": "object" } ], "description": "Cross-series population outlier (one host misbehaving vs its peers). Stub." @@ -10193,137 +10254,132 @@ "description": "Watchdog-style self-tuning auto-watch (engine picks bounds). Stub." }, { - "type": "object", - "required": [ - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "auto_watch" - ] + ], + "type": "string" } - } + }, + "required": [ + "kind" + ], + "type": "object" } ], "description": "Watchdog-style self-tuning auto-watch (engine picks bounds). Stub." } - ], - "description": "The typed detector definition stored (as jsonb) in\n`metric_alert_rules.detection_config`.\n\nToday only [`DetectionConfig::Static`] is evaluable; the other variants are\nschema-present (so the SDK/UI and storage are already future-shaped) but\nrejected by [`DetectionConfig::validate`] until their evaluator lands. Each is\nthen enabled code-only, with no schema migration." + ] }, "DeviceCount": { - "type": "object", - "required": [ - "device_type", - "count", - "percentage" - ], "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "device_type": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "device_type", + "count", + "percentage" + ], + "type": "object" }, "DigestSections": { - "type": "object", "description": "Sections that can be included in the weekly digest\nNote: `#[serde(default)]` allows backward compatibility when deserializing\nold data that may have `security` and `resources` fields instead of `projects`", "properties": { "deployments": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "errors": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "funnels": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "performance": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "projects": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" } - } + }, + "type": "object" }, "Direction": { - "type": "string", "description": "Which side(s) of an anomaly band count as a deviation.", "enum": [ "both", "above", "below" - ] + ], + "type": "string" }, "DisableBlobResponse": { - "type": "object", "description": "Response after disabling Blob service", - "required": [ - "success", - "message" - ], "properties": { "message": { - "type": "string", "description": "Human-readable message", - "example": "Blob service disabled successfully" + "example": "Blob service disabled successfully", + "type": "string" }, "success": { - "type": "boolean", "description": "Whether the operation succeeded", - "example": true + "example": true, + "type": "boolean" } - } - }, - "DisableKvResponse": { - "type": "object", - "description": "Response after disabling KV service", + }, "required": [ "success", "message" ], + "type": "object" + }, + "DisableKvResponse": { + "description": "Response after disabling KV service", "properties": { "message": { - "type": "string", "description": "Status message", - "example": "KV service disabled successfully" + "example": "KV service disabled successfully", + "type": "string" }, "success": { - "type": "boolean", - "description": "Whether the service was successfully disabled" + "description": "Whether the service was successfully disabled", + "type": "boolean" } - } - }, - "DisableMfaRequest": { - "type": "object", + }, "required": [ - "code" + "success", + "message" ], + "type": "object" + }, + "DisableMfaRequest": { "properties": { "code": { "type": "string" } - } + }, + "required": [ + "code" + ], + "type": "object" }, "DiscoverRequest": { - "type": "object", "description": "Request to discover workloads", - "required": [ - "source" - ], "properties": { "credentials": { "$ref": "#/components/schemas/ImportCredentials", @@ -10337,291 +10393,290 @@ "$ref": "#/components/schemas/ImportSource", "description": "Source to discover from" } - } + }, + "required": [ + "source" + ], + "type": "object" }, "DiscoverResponse": { - "type": "object", "description": "Response with discovered workloads", - "required": [ - "workloads" - ], "properties": { "workloads": { - "type": "array", + "description": "Discovered workloads", "items": { "$ref": "#/components/schemas/WorkloadDescriptor" }, - "description": "Discovered workloads" + "type": "array" } - } + }, + "required": [ + "workloads" + ], + "type": "object" }, "DiskInfo": { - "type": "object", "description": "Disk space information for a single disk/partition", - "required": [ - "mount_point", - "total_bytes", - "used_bytes", - "available_bytes", - "usage_percent", - "file_system" - ], "properties": { "available_bytes": { - "type": "integer", - "format": "int64", "description": "Available space in bytes", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "file_system": { - "type": "string", - "description": "File system type (e.g., \"ext4\", \"apfs\")" + "description": "File system type (e.g., \"ext4\", \"apfs\")", + "type": "string" }, "mount_point": { - "type": "string", - "description": "Mount point of the disk" + "description": "Mount point of the disk", + "type": "string" }, "total_bytes": { - "type": "integer", - "format": "int64", "description": "Total space in bytes", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "usage_percent": { - "type": "number", + "description": "Usage percentage (0-100)", "format": "double", - "description": "Usage percentage (0-100)" + "type": "number" }, "used_bytes": { - "type": "integer", - "format": "int64", "description": "Used space in bytes", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" } - } - }, - "DiskSpaceAlert": { - "type": "object", - "description": "Alert for a disk that exceeds the threshold", + }, "required": [ "mount_point", - "usage_percent", - "threshold_percent", + "total_bytes", + "used_bytes", "available_bytes", - "available_human" + "usage_percent", + "file_system" ], + "type": "object" + }, + "DiskSpaceAlert": { + "description": "Alert for a disk that exceeds the threshold", "properties": { "available_bytes": { - "type": "integer", - "format": "int64", "description": "Available space in bytes", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "available_human": { - "type": "string", - "description": "Human-readable available space" + "description": "Human-readable available space", + "type": "string" }, "mount_point": { - "type": "string", - "description": "Mount point of the disk" + "description": "Mount point of the disk", + "type": "string" }, "threshold_percent": { - "type": "integer", - "format": "int32", "description": "Configured threshold percentage", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "usage_percent": { - "type": "number", + "description": "Current usage percentage", "format": "double", - "description": "Current usage percentage" + "type": "number" } - } + }, + "required": [ + "mount_point", + "usage_percent", + "threshold_percent", + "available_bytes", + "available_human" + ], + "type": "object" }, "DiskSpaceAlertSettings": { - "type": "object", "description": "Disk space alert settings for monitoring disk usage", "properties": { "check_interval_seconds": { - "type": "integer", - "format": "int64", - "description": "Interval in seconds between disk space checks", "default": 300, + "description": "Interval in seconds between disk space checks", "example": 300, - "minimum": 60 + "format": "int64", + "minimum": 60, + "type": "integer" }, "enabled": { - "type": "boolean", + "default": true, "description": "Whether disk space alerts are enabled", - "default": true + "type": "boolean" }, "monitor_path": { + "default": null, + "description": "Restrict monitoring to the disk backing this path. When unset (the\ndefault), every mounted writable volume is monitored — including\ndedicated volumes such as `/var/lib/docker`.", "type": [ "string", "null" - ], - "description": "Restrict monitoring to the disk backing this path. When unset (the\ndefault), every mounted writable volume is monitored \u2014 including\ndedicated volumes such as `/var/lib/docker`.", - "default": null + ] }, "threshold_percent": { - "type": "integer", - "format": "int32", - "description": "Threshold percentage (0-100) at which to trigger alerts", "default": 80, + "description": "Threshold percentage (0-100) at which to trigger alerts", "example": 80, + "format": "int32", "maximum": 100, - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "type": "object" }, "DiskSpaceCheckResult": { - "type": "object", "description": "Result of a disk space check", - "required": [ - "checked_at", - "enabled", - "threshold_percent", - "disks", - "alerts" - ], "properties": { "alerts": { - "type": "array", + "description": "Disks that meet or exceed the threshold", "items": { "$ref": "#/components/schemas/DiskSpaceAlert" }, - "description": "Disks that meet or exceed the threshold" + "type": "array" }, "checked_at": { - "type": "string", - "format": "date-time", "description": "Timestamp of the check (ISO 8601, UTC)", - "example": "2026-05-28T12:15:47.609192Z" + "example": "2026-05-28T12:15:47.609192Z", + "format": "date-time", + "type": "string" }, "disks": { - "type": "array", + "description": "List of all monitored disks", "items": { "$ref": "#/components/schemas/DiskInfo" }, - "description": "List of all monitored disks" + "type": "array" }, "enabled": { - "type": "boolean", - "description": "Whether disk space monitoring is enabled in settings" + "description": "Whether disk space monitoring is enabled in settings", + "type": "boolean" }, "threshold_percent": { - "type": "integer", - "format": "int32", "description": "Configured alert threshold percentage (0-100)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" } - } - }, - "DnsAckRequest": { - "type": "object", + }, "required": [ - "applied_generation" + "checked_at", + "enabled", + "threshold_percent", + "disks", + "alerts" ], + "type": "object" + }, + "DnsAckRequest": { "properties": { "applied_generation": { - "type": "integer", + "description": "Highest generation the agent has actually applied locally.", "format": "int64", - "description": "Highest generation the agent has actually applied locally." + "type": "integer" } - } - }, - "DnsAckResponse": { - "type": "object", + }, "required": [ - "node_id", - "applied_generation", - "server_generation" + "applied_generation" ], + "type": "object" + }, + "DnsAckResponse": { "properties": { "applied_generation": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "node_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "server_generation": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "node_id", + "applied_generation", + "server_generation" + ], + "type": "object" }, "DnsChallengeRecordResult": { - "type": "object", "description": "Result of a single DNS TXT record creation for ACME challenge", - "required": [ - "name", - "value", - "success", - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable message about the operation" + "description": "Human-readable message about the operation", + "type": "string" }, "name": { - "type": "string", "description": "TXT record name (e.g., \"_acme-challenge.example.com\")", - "example": "_acme-challenge.example.com" + "example": "_acme-challenge.example.com", + "type": "string" }, "success": { - "type": "boolean", - "description": "Whether the record was created successfully" + "description": "Whether the record was created successfully", + "type": "boolean" }, "value": { - "type": "string", "description": "TXT record value (the ACME challenge token)", - "example": "abc123..." + "example": "abc123...", + "type": "string" } - } - }, - "DnsChangesResponse": { - "type": "object", + }, "required": [ - "generation", - "full_snapshot", - "records", - "removed_ids" + "name", + "value", + "success", + "message" ], + "type": "object" + }, + "DnsChangesResponse": { "properties": { "full_snapshot": { - "type": "boolean", - "description": "`true` \u21d2 replace the local zone with `records`. `false` \u21d2 merge\n`records` into the existing zone (and remove `removed_ids`)." + "description": "`true` ⇒ replace the local zone with `records`. `false` ⇒ merge\n`records` into the existing zone (and remove `removed_ids`).", + "type": "boolean" }, "generation": { - "type": "integer", + "description": "Highest generation included in this response. Agent ACKs this back.", "format": "int64", - "description": "Highest generation included in this response. Agent ACKs this back." + "type": "integer" }, "records": { - "type": "array", "items": { "$ref": "#/components/schemas/EndpointDto" - } + }, + "type": "array" }, "removed_ids": { - "type": "array", + "description": "IDs the agent should remove from its zone. Always empty in the v1\nprotocol — the resolver reconciles by name on snapshot mode. Kept\nin the wire format so a future tombstone-based protocol doesn't\nrequire a breaking change.", "items": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, - "description": "IDs the agent should remove from its zone. Always empty in the v1\nprotocol \u2014 the resolver reconciles by name on snapshot mode. Kept\nin the wire format so a future tombstone-based protocol doesn't\nrequire a breaking change." + "type": "array" } - } - }, - "DnsCompletionResponse": { - "type": "object", + }, "required": [ - "domain", - "status" + "generation", + "full_snapshot", + "records", + "removed_ids" ], + "type": "object" + }, + "DnsCompletionResponse": { "properties": { "domain": { "type": "string" @@ -10629,94 +10684,95 @@ "status": { "type": "string" } - } + }, + "required": [ + "domain", + "status" + ], + "type": "object" }, "DnsLookupError": { - "type": "object", "description": "Error response for DNS lookup failures", - "required": [ - "error", - "domain" - ], "properties": { "domain": { - "type": "string", "description": "Domain name that failed", - "example": "nonexistent.com" + "example": "nonexistent.com", + "type": "string" }, "error": { - "type": "string", "description": "Error message", - "example": "DNS lookup failed: domain not found" + "example": "DNS lookup failed: domain not found", + "type": "string" } - } - }, - "DnsLookupRequest": { - "type": "object", - "description": "Request to lookup DNS A records for a domain", + }, "required": [ + "error", "domain" ], + "type": "object" + }, + "DnsLookupRequest": { + "description": "Request to lookup DNS A records for a domain", "properties": { "domain": { - "type": "string", "description": "Domain name to lookup", - "example": "example.com" + "example": "example.com", + "type": "string" } - } + }, + "required": [ + "domain" + ], + "type": "object" }, "DnsLookupResponse": { - "type": "object", "description": "Response containing DNS A records", - "required": [ - "domain", - "records", - "count", - "dns_servers" - ], "properties": { "count": { - "type": "integer", "description": "Number of records found", "example": 1, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "dns_servers": { - "type": "array", - "items": { - "type": "string" - }, "description": "DNS servers used for the lookup", "example": [ "8.8.8.8", "8.8.4.4" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "domain": { - "type": "string", "description": "Domain name that was queried", - "example": "example.com" + "example": "example.com", + "type": "string" }, "records": { - "type": "array", - "items": { - "type": "string" - }, "description": "List of A record IP addresses", "example": [ "93.184.216.34" - ] + ], + "items": { + "type": "string" + }, + "type": "array" } - } + }, + "required": [ + "domain", + "records", + "count", + "dns_servers" + ], + "type": "object" }, "DnsProviderCredentials": { + "description": "DNS provider credentials (API-facing)", "oneOf": [ { - "type": "object", - "required": [ - "api_token", - "type" - ], "properties": { "account_id": { "type": [ @@ -10725,32 +10781,31 @@ ] }, "api_token": { - "type": "string", - "example": "your-api-token" + "example": "your-api-token", + "type": "string" }, "type": { - "type": "string", "enum": [ "cloudflare" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "api_user", - "api_key", + "api_token", "type" ], + "type": "object" + }, + { "properties": { "api_key": { - "type": "string", - "example": "your-api-key" + "example": "your-api-key", + "type": "string" }, "api_user": { - "type": "string", - "example": "your-username" + "example": "your-username", + "type": "string" }, "client_ip": { "type": [ @@ -10762,35 +10817,35 @@ "type": "boolean" }, "type": { - "type": "string", "enum": [ "namecheap" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "access_key_id", - "secret_access_key", + "api_user", + "api_key", "type" ], + "type": "object" + }, + { "properties": { "access_key_id": { - "type": "string", - "example": "AKIAIOSFODNN7EXAMPLE" + "example": "AKIAIOSFODNN7EXAMPLE", + "type": "string" }, "region": { + "example": "us-east-1", "type": [ "string", "null" - ], - "example": "us-east-1" + ] }, "secret_access_key": { - "type": "string", - "example": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + "example": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "type": "string" }, "session_token": { "type": [ @@ -10799,135 +10854,129 @@ ] }, "type": { - "type": "string", "enum": [ "route53" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "api_token", + "access_key_id", + "secret_access_key", "type" ], + "type": "object" + }, + { "properties": { "api_token": { - "type": "string", - "example": "dop_v1_your-token" + "example": "dop_v1_your-token", + "type": "string" }, "type": { - "type": "string", "enum": [ "digitalocean" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "service_account_email", - "private_key", - "project_id", + "api_token", "type" ], + "type": "object" + }, + { "properties": { "private_key": { - "type": "string", - "example": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----" + "example": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----", + "type": "string" }, "project_id": { - "type": "string", - "example": "my-gcp-project" + "example": "my-gcp-project", + "type": "string" }, "service_account_email": { - "type": "string", - "example": "dns-admin@myproject.iam.gserviceaccount.com" + "example": "dns-admin@myproject.iam.gserviceaccount.com", + "type": "string" }, "type": { - "type": "string", "enum": [ "gcp" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "tenant_id", - "client_id", - "client_secret", - "subscription_id", - "resource_group", + "service_account_email", + "private_key", + "project_id", "type" ], + "type": "object" + }, + { "properties": { "client_id": { - "type": "string", - "example": "00000000-0000-0000-0000-000000000000" + "example": "00000000-0000-0000-0000-000000000000", + "type": "string" }, "client_secret": { "type": "string" }, "resource_group": { - "type": "string", - "example": "my-resource-group" + "example": "my-resource-group", + "type": "string" }, "subscription_id": { - "type": "string", - "example": "00000000-0000-0000-0000-000000000000" + "example": "00000000-0000-0000-0000-000000000000", + "type": "string" }, "tenant_id": { - "type": "string", - "example": "00000000-0000-0000-0000-000000000000" + "example": "00000000-0000-0000-0000-000000000000", + "type": "string" }, "type": { - "type": "string", "enum": [ "azure" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "Pebble challtestsrv mock DNS (LOCAL DEV/TEST ONLY)", + }, "required": [ - "management_url", + "tenant_id", + "client_id", + "client_secret", + "subscription_id", + "resource_group", "type" ], + "type": "object" + }, + { + "description": "Pebble challtestsrv mock DNS (LOCAL DEV/TEST ONLY)", "properties": { "management_url": { - "type": "string", - "example": "http://localhost:8055" + "example": "http://localhost:8055", + "type": "string" }, "type": { - "type": "string", "enum": [ "pebble" - ] + ], + "type": "string" } - } + }, + "required": [ + "management_url", + "type" + ], + "type": "object" } - ], - "description": "DNS provider credentials (API-facing)" + ] }, "DnsProviderResponse": { - "type": "object", "description": "DNS provider response", - "required": [ - "id", - "name", - "provider_type", - "credentials", - "is_active", - "flat_hostnames_supported", - "created_at", - "updated_at" - ], "properties": { "created_at": { "type": "string" @@ -10942,12 +10991,12 @@ ] }, "flat_hostnames_supported": { - "type": "boolean", - "description": "Whether this provider benefits from the flat hostname mode (e.g. Cloudflare\nUniversal SSL). The UI surfaces/recommends the Flat toggle when true." + "description": "Whether this provider benefits from the flat hostname mode (e.g. Cloudflare\nUniversal SSL). The UI surfaces/recommends the Flat toggle when true.", + "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -10973,30 +11022,37 @@ "updated_at": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "provider_type", + "credentials", + "is_active", + "flat_hostnames_supported", + "created_at", + "updated_at" + ], + "type": "object" }, "DnsProviderSettings": { - "type": "object", "properties": { "cloudflare_api_key": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "provider": { - "type": "string", - "default": "manual" + "default": "manual", + "type": "string" } - } + }, + "type": "object" }, "DnsProviderSettingsMasked": { - "type": "object", "description": "DNS provider settings with masked sensitive fields", - "required": [ - "provider" - ], "properties": { "cloudflare_api_key": { "type": [ @@ -11007,10 +11063,13 @@ "provider": { "type": "string" } - } + }, + "required": [ + "provider" + ], + "type": "object" }, "DnsProviderType": { - "type": "string", "description": "Supported DNS provider types", "enum": [ "cloudflare", @@ -11021,346 +11080,337 @@ "azure", "manual", "pebble" - ] + ], + "type": "string" }, "DnsRecord": { - "type": "object", "description": "A DNS record", - "required": [ - "zone", - "name", - "fqdn", - "content", - "ttl" - ], "properties": { "content": { "$ref": "#/components/schemas/DnsRecordContent", "description": "Record content" }, "fqdn": { - "type": "string", "description": "Fully qualified domain name", - "example": "www.example.com" + "example": "www.example.com", + "type": "string" }, "id": { + "description": "Provider-specific record ID (if exists)", + "example": "abc123", "type": [ "string", "null" - ], - "description": "Provider-specific record ID (if exists)", - "example": "abc123" + ] }, "metadata": { - "type": "object", - "description": "Provider-specific metadata", "additionalProperties": { "type": "string" }, + "description": "Provider-specific metadata", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "name": { - "type": "string", "description": "Record name (without zone, e.g., \"www\" or \"@\" for root)", - "example": "www" + "example": "www", + "type": "string" }, "proxied": { - "type": "boolean", - "description": "Whether this record is proxied (Cloudflare-specific)" + "description": "Whether this record is proxied (Cloudflare-specific)", + "type": "boolean" }, "ttl": { - "type": "integer", - "format": "int32", "description": "Time to live in seconds", "example": 300, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "zone": { - "type": "string", "description": "Zone/domain this record belongs to", - "example": "example.com" + "example": "example.com", + "type": "string" } - } - }, - "DnsRecordChange": { - "type": "object", - "description": "A single DNS record change the Cloudflare sync would make.", + }, "required": [ - "action", + "zone", "name", - "record_type", - "value" + "fqdn", + "content", + "ttl" ], + "type": "object" + }, + "DnsRecordChange": { + "description": "A single DNS record change the Cloudflare sync would make.", "properties": { "action": { - "type": "string", - "description": "`\"create\"`, `\"update\"`, or `\"delete\"`." + "description": "`\"create\"`, `\"update\"`, or `\"delete\"`.", + "type": "string" }, "name": { "type": "string" }, "record_type": { - "type": "string", - "description": "Record type, e.g. `\"A\"` or `\"CNAME\"`." + "description": "Record type, e.g. `\"A\"` or `\"CNAME\"`.", + "type": "string" }, "value": { "type": "string" } - } + }, + "required": [ + "action", + "name", + "record_type", + "value" + ], + "type": "object" }, "DnsRecordContent": { + "description": "DNS record content - varies by record type", "oneOf": [ { - "type": "object", "description": "A record - IPv4 address (as string, e.g., \"192.0.2.1\")", - "required": [ - "value", - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "A" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "A record - IPv4 address (as string, e.g., \"192.0.2.1\")", - "required": [ - "address" - ], "properties": { "address": { - "type": "string", - "example": "192.0.2.1" + "example": "192.0.2.1", + "type": "string" } - } + }, + "required": [ + "address" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "AAAA record - IPv6 address (as string, e.g., \"2001:db8::1\")", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "AAAA record - IPv6 address (as string, e.g., \"2001:db8::1\")", "properties": { "type": { - "type": "string", "enum": [ "AAAA" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "AAAA record - IPv6 address (as string, e.g., \"2001:db8::1\")", - "required": [ - "address" - ], "properties": { "address": { - "type": "string", - "example": "2001:db8::1" + "example": "2001:db8::1", + "type": "string" } - } + }, + "required": [ + "address" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "CNAME record - canonical name", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "CNAME record - canonical name", "properties": { "type": { - "type": "string", "enum": [ "CNAME" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "CNAME record - canonical name", - "required": [ - "target" - ], "properties": { "target": { "type": "string" } - } + }, + "required": [ + "target" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "TXT record - text content", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "TXT record - text content", "properties": { "type": { - "type": "string", "enum": [ "TXT" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "TXT record - text content", - "required": [ - "content" - ], "properties": { "content": { "type": "string" } - } + }, + "required": [ + "content" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "MX record - mail exchange", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "MX record - mail exchange", "properties": { "type": { - "type": "string", "enum": [ "MX" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "MX record - mail exchange", - "required": [ - "priority", - "target" - ], "properties": { "priority": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "target": { "type": "string" } - } + }, + "required": [ + "priority", + "target" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "NS record - nameserver", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "NS record - nameserver", "properties": { "type": { - "type": "string", "enum": [ "NS" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "NS record - nameserver", - "required": [ - "nameserver" - ], "properties": { "nameserver": { "type": "string" } - } + }, + "required": [ + "nameserver" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "SRV record - service", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "SRV record - service", "properties": { "type": { - "type": "string", "enum": [ "SRV" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "SRV record - service", - "required": [ - "priority", - "weight", - "port", - "target" - ], "properties": { "port": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "priority": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "target": { "type": "string" }, "weight": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "priority", + "weight", + "port", + "target" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "CAA record - certification authority authorization", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "CAA record - certification authority authorization", "properties": { "type": { - "type": "string", "enum": [ "CAA" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "CAA record - certification authority authorization", - "required": [ - "flags", - "tag", - "value" - ], "properties": { "flags": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "tag": { "type": "string" @@ -11368,243 +11418,248 @@ "value": { "type": "string" } - } + }, + "required": [ + "flags", + "tag", + "value" + ], + "type": "object" } - } - }, - { - "type": "object", - "description": "PTR record - pointer", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "PTR record - pointer", "properties": { "type": { - "type": "string", "enum": [ "PTR" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "PTR record - pointer", - "required": [ - "target" - ], "properties": { "target": { "type": "string" } - } + }, + "required": [ + "target" + ], + "type": "object" } - } + }, + "required": [ + "value", + "type" + ], + "type": "object" } - ], - "description": "DNS record content - varies by record type" + ] }, "DnsRecordResponse": { - "type": "object", - "required": [ - "record_type", - "name", - "value", - "status" - ], "properties": { "name": { - "type": "string", "description": "DNS record name (host)", - "example": "temps._domainkey.example.com" + "example": "temps._domainkey.example.com", + "type": "string" }, "priority": { + "description": "Priority (for MX records)", + "example": "10", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Priority (for MX records)", - "example": "10", - "minimum": 0 + ] }, "record_type": { - "type": "string", "description": "Record type: TXT, CNAME, MX", - "example": "TXT" + "example": "TXT", + "type": "string" }, "status": { "$ref": "#/components/schemas/DnsRecordStatusResponse", "description": "Verification status: unknown, verified, pending, failed" }, "value": { - "type": "string", "description": "DNS record value", - "example": "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3..." + "example": "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3...", + "type": "string" } - } - }, - "DnsRecordSetupResult": { - "type": "object", - "description": "Result of a single DNS record creation", + }, "required": [ "record_type", "name", - "success", - "automatic", - "message" + "value", + "status" ], + "type": "object" + }, + "DnsRecordSetupResult": { + "description": "Result of a single DNS record creation", "properties": { "automatic": { - "type": "boolean", - "description": "Whether the operation was automatic or manual" + "description": "Whether the operation was automatic or manual", + "type": "boolean" }, "message": { - "type": "string", - "description": "Human-readable message" + "description": "Human-readable message", + "type": "string" }, "name": { - "type": "string", - "description": "Record name" + "description": "Record name", + "type": "string" }, "record_type": { - "type": "string", - "description": "Record type (TXT, CNAME, MX)" + "description": "Record type (TXT, CNAME, MX)", + "type": "string" }, "success": { - "type": "boolean", - "description": "Whether the record was created successfully" + "description": "Whether the record was created successfully", + "type": "boolean" } - } + }, + "required": [ + "record_type", + "name", + "success", + "automatic", + "message" + ], + "type": "object" }, "DnsRecordStatusResponse": { - "type": "string", "description": "DNS record verification status", "enum": [ "unknown", "verified", "pending", "failed" - ] + ], + "type": "string" }, "DnsZone": { - "type": "object", "description": "A DNS zone (domain managed by the provider)", - "required": [ - "id", - "name", - "status", - "nameservers" - ], "properties": { "id": { - "type": "string", "description": "Provider-specific zone ID", - "example": "zone123" + "example": "zone123", + "type": "string" }, "metadata": { - "type": "object", - "description": "Provider-specific metadata", "additionalProperties": { "type": "string" }, + "description": "Provider-specific metadata", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "name": { - "type": "string", "description": "Zone name (domain)", - "example": "example.com" + "example": "example.com", + "type": "string" }, "nameservers": { - "type": "array", + "description": "Nameservers for this zone", "items": { "type": "string" }, - "description": "Nameservers for this zone" + "type": "array" }, "status": { - "type": "string", "description": "Zone status", - "example": "active" + "example": "active", + "type": "string" } - } + }, + "required": [ + "id", + "name", + "status", + "nameservers" + ], + "type": "object" }, "DockerComposePresetConfig": { - "type": "object", "description": "Configuration for Docker Compose deployments.", "properties": { "composeOverride": { + "description": "User-provided docker-compose.override.yml content.", "type": [ "string", "null" - ], - "description": "User-provided docker-compose.override.yml content." + ] }, "composePath": { + "description": "Path to the Compose file relative to the project directory.", "type": [ "string", "null" - ], - "description": "Path to the Compose file relative to the project directory." + ] }, "publicPorts": { - "type": "array", + "description": "Compose service ports that should be publicly routed.", "items": { "$ref": "#/components/schemas/ComposePublicPort" }, - "description": "Compose service ports that should be publicly routed." + "type": "array" } - } + }, + "type": "object" }, "DockerRegistrySettings": { - "type": "object", "properties": { "ca_certificate": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "enabled": { - "type": "boolean", - "default": false + "default": false, + "type": "boolean" }, "password": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "registry_url": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "tls_verify": { - "type": "boolean", - "default": true + "default": true, + "type": "boolean" }, "username": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] } - } + }, + "type": "object" }, "DockerRegistrySettingsMasked": { - "type": "object", "description": "Docker registry settings with masked sensitive fields", - "required": [ - "enabled", - "tls_verify" - ], "properties": { "ca_certificate": { "type": [ @@ -11636,27 +11691,31 @@ "null" ] } - } + }, + "required": [ + "enabled", + "tls_verify" + ], + "type": "object" }, "DockerfilePresetConfig": { - "type": "object", "description": "Configuration for Dockerfile preset\nAllows customizing the Dockerfile path and build context for Docker-based deployments", "properties": { "buildContext": { + "description": "Custom build context path (relative to repository root)\nIf not specified, uses the project's directory setting", + "example": "./api", "type": [ "string", "null" - ], - "description": "Custom build context path (relative to repository root)\nIf not specified, uses the project's directory setting", - "example": "./api" + ] }, "dockerfilePath": { + "description": "Custom Dockerfile path (relative to build context)\nIf not specified, defaults to \"Dockerfile\" in the build context", + "example": "docker/Dockerfile", "type": [ "string", "null" - ], - "description": "Custom Dockerfile path (relative to build context)\nIf not specified, defaults to \"Dockerfile\" in the build context", - "example": "docker/Dockerfile" + ] }, "variant": { "oneOf": [ @@ -11669,31 +11728,26 @@ } ] } - } + }, + "type": "object" }, "DockerfileVariant": { - "type": "string", "description": "Catalog variant persisted under the canonical Dockerfile preset.\n\nExisting rows predate this discriminator and therefore deserialize as\n[`DockerfileVariant::File`].", "enum": [ "file", "custom" - ] + ], + "type": "string" }, "DomainAction": { - "type": "string", "description": "What to do with a domain during migration", "enum": [ "import", "skip" - ] + ], + "type": "string" }, "DomainChallengeResponse": { - "type": "object", - "required": [ - "domain", - "txt_records", - "status" - ], "properties": { "domain": { "type": "string" @@ -11702,25 +11756,25 @@ "type": "string" }, "txt_records": { - "type": "array", + "description": "Array of TXT records to add to DNS. For wildcards, multiple records are required.", "items": { "$ref": "#/components/schemas/TxtRecord" }, - "description": "Array of TXT records to add to DNS. For wildcards, multiple records are required." + "type": "array" } - } - }, - "DomainEnvironmentResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "slug" + "domain", + "txt_records", + "status" ], + "type": "object" + }, + "DomainEnvironmentResponse": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -11728,14 +11782,15 @@ "slug": { "type": "string" } - } - }, - "DomainError": { - "type": "object", + }, "required": [ - "message", - "code" + "id", + "name", + "slug" ], + "type": "object" + }, + "DomainError": { "properties": { "code": { "type": "string" @@ -11749,80 +11804,75 @@ "message": { "type": "string" } - } + }, + "required": [ + "message", + "code" + ], + "type": "object" }, "DomainPlan": { - "type": "object", "description": "Plan for migrating a single custom domain", - "required": [ - "domain", - "environment", - "action", - "action_description" - ], "properties": { "action": { "$ref": "#/components/schemas/DomainAction", "description": "What to do with this domain" }, "action_description": { - "type": "string", - "description": "Human-readable explanation" + "description": "Human-readable explanation", + "type": "string" }, "domain": { - "type": "string", - "description": "Full domain name" + "description": "Full domain name", + "type": "string" }, "environment": { - "type": "string", - "description": "Which environment to associate with (\"production\")" + "description": "Which environment to associate with (\"production\")", + "type": "string" }, "redirect_to": { + "description": "Redirect target (if this is a redirect domain)", "type": [ "string", "null" - ], - "description": "Redirect target (if this is a redirect domain)" + ] }, "replacement": { + "description": "The temps-side address that replaces this domain when it is skipped.\n\nSource-generated domains (sslip.io / traefik.me / platform subdomains)\nembed the source server's IP and would keep pointing at the old\nmachine — this tells the user where the app will be reachable on\ntemps instead.", "type": [ "string", "null" - ], - "description": "The temps-side address that replaces this domain when it is skipped.\n\nSource-generated domains (sslip.io / traefik.me / platform subdomains)\nembed the source server's IP and would keep pointing at the old\nmachine \u2014 this tells the user where the app will be reachable on\ntemps instead." + ] }, "status_code": { + "description": "Redirect status code", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Redirect status code" + ] } - } - }, - "DomainResponse": { - "type": "object", + }, "required": [ - "id", "domain", - "status", - "is_wildcard", - "verification_method", - "created_at", - "updated_at" + "environment", + "action", + "action_description" ], + "type": "object" + }, + "DomainResponse": { "properties": { "certificate": { + "description": "The PEM-encoded certificate chain (can be displayed in browser or downloaded)", "type": [ "string", "null" - ], - "description": "The PEM-encoded certificate chain (can be displayed in browser or downloaded)" + ] }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "dns_challenge_token": { "type": [ @@ -11840,15 +11890,15 @@ "type": "string" }, "expiration_time": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_wildcard": { "type": "boolean" @@ -11866,49 +11916,51 @@ ] }, "last_renewed": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "on_demand_backoff_until": { + "description": "On-demand TLS negative-cache deadline (epoch millis), when this hostname's\non-demand HTTP-01 issuance is in backoff after a failure (ADR-018 §4).\n`None` means no active backoff.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "On-demand TLS negative-cache deadline (epoch millis), when this hostname's\non-demand HTTP-01 issuance is in backoff after a failure (ADR-018 \u00a74).\n`None` means no active backoff." + ] }, "status": { "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "verification_method": { "type": "string" } - } - }, - "DrainNodeResponse": { - "type": "object", + }, "required": [ "id", - "name", + "domain", "status", - "affected_environments", - "message" + "is_wildcard", + "verification_method", + "created_at", + "updated_at" ], + "type": "object" + }, + "DrainNodeResponse": { "properties": { "affected_environments": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -11919,120 +11971,119 @@ "status": { "type": "string" } - } - }, - "DrainStatusResponse": { - "type": "object", - "description": "Progress of a node drain operation.", + }, "required": [ - "node_id", - "node_name", + "id", + "name", "status", - "remaining_containers", - "drain_complete", - "can_remove", + "affected_environments", "message" ], + "type": "object" + }, + "DrainStatusResponse": { + "description": "Progress of a node drain operation.", "properties": { "can_remove": { - "type": "boolean", - "description": "Can the node be safely removed?" + "description": "Can the node be safely removed?", + "type": "boolean" }, "drain_complete": { - "type": "boolean", - "description": "Whether the drain is complete (all containers migrated)" + "description": "Whether the drain is complete (all containers migrated)", + "type": "boolean" }, "message": { "type": "string" }, "node_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "node_name": { "type": "string" }, "remaining_containers": { - "type": "integer", "description": "Number of containers still on this node", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "status": { "type": "string" } - } - }, - "DropArchiveUpload": { - "type": "object", + }, "required": [ - "file" + "node_id", + "node_name", + "status", + "remaining_containers", + "drain_complete", + "can_remove", + "message" ], + "type": "object" + }, + "DropArchiveUpload": { "properties": { "file": { - "type": "string", - "format": "binary" + "format": "binary", + "type": "string" } - } - }, - "DropInspectionResponse": { - "type": "object", + }, "required": [ - "suggestedName", - "candidates" + "file" ], + "type": "object" + }, + "DropInspectionResponse": { "properties": { "candidates": { - "type": "array", "items": { "$ref": "#/components/schemas/DropPresetCandidate" - } + }, + "type": "array" }, "suggestedName": { "type": "string" } - } + }, + "required": [ + "suggestedName", + "candidates" + ], + "type": "object" }, "DropOffPoint": { - "type": "object", "description": "Drop-off point: pages where visitors leave the site", - "required": [ - "page_path", - "exit_count", - "total_views", - "exit_rate" - ], "properties": { "exit_count": { - "type": "integer", + "description": "Number of exits from this page", "format": "int64", - "description": "Number of exits from this page" + "type": "integer" }, "exit_rate": { - "type": "number", + "description": "Exit rate for this page (exit_count / total_views)", "format": "double", - "description": "Exit rate for this page (exit_count / total_views)" + "type": "number" }, "page_path": { - "type": "string", - "description": "The page path where visitors drop off" + "description": "The page path where visitors drop off", + "type": "string" }, "total_views": { - "type": "integer", + "description": "Total views of this page", "format": "int64", - "description": "Total views of this page" + "type": "integer" } - } - }, - "DropPresetCandidate": { - "type": "object", + }, "required": [ - "directory", - "preset", - "label", - "confidence", - "reason", - "isStatic" + "page_path", + "exit_count", + "total_views", + "exit_rate" ], + "type": "object" + }, + "DropPresetCandidate": { "properties": { "confidence": { "type": "string" @@ -12052,18 +12103,18 @@ "reason": { "type": "string" } - } - }, - "EmailConfig": { - "type": "object", + }, "required": [ - "smtp_host", - "smtp_port", - "username", - "password", - "from_address", - "to_addresses" + "directory", + "preset", + "label", + "confidence", + "reason", + "isStatic" ], + "type": "object" + }, + "EmailConfig": { "properties": { "accept_invalid_certs": { "type": "boolean" @@ -12084,9 +12135,9 @@ "type": "string" }, "smtp_port": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "starttls_required": { "type": "boolean" @@ -12095,38 +12146,38 @@ "$ref": "#/components/schemas/TlsMode" }, "to_addresses": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "username": { "type": "string" } - } + }, + "required": [ + "smtp_host", + "smtp_port", + "username", + "password", + "from_address", + "to_addresses" + ], + "type": "object" }, "EmailDomainResponse": { - "type": "object", - "required": [ - "id", - "provider_id", - "domain", - "status", - "created_at", - "updated_at" - ], "properties": { "created_at": { - "type": "string", - "example": "2025-12-03T10:30:00Z" + "example": "2025-12-03T10:30:00Z", + "type": "string" }, "domain": { - "type": "string", - "example": "updates.example.com" + "example": "updates.example.com", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_verified_at": { "type": [ @@ -12135,16 +12186,16 @@ ] }, "provider_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { - "type": "string", - "example": "verified" + "example": "verified", + "type": "string" }, "updated_at": { - "type": "string", - "example": "2025-12-03T10:30:00Z" + "example": "2025-12-03T10:30:00Z", + "type": "string" }, "verification_error": { "type": [ @@ -12152,63 +12203,61 @@ "null" ] } - } - }, - "EmailDomainWithDnsResponse": { - "type": "object", + }, "required": [ + "id", + "provider_id", "domain", - "dns_records" + "status", + "created_at", + "updated_at" ], + "type": "object" + }, + "EmailDomainWithDnsResponse": { "properties": { "dns_records": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsRecordResponse" - } + }, + "type": "array" }, "domain": { "$ref": "#/components/schemas/EmailDomainResponse" } - } - }, - "EmailProviderResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "provider_type", - "region", - "is_active", - "credentials", - "created_at", - "updated_at" + "domain", + "dns_records" ], + "type": "object" + }, + "EmailProviderResponse": { "properties": { "created_at": { - "type": "string", - "example": "2025-12-03T10:30:00Z" + "example": "2025-12-03T10:30:00Z", + "type": "string" }, "credentials": { "description": "Masked credentials for display" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" }, "name": { - "type": "string", - "example": "My AWS SES" + "example": "My AWS SES", + "type": "string" }, "provider_type": { "$ref": "#/components/schemas/EmailProviderTypeRoute" }, "region": { - "type": "string", - "example": "us-east-1" + "example": "us-east-1", + "type": "string" }, "sns_topic_arn": { "type": [ @@ -12217,79 +12266,77 @@ ] }, "updated_at": { - "type": "string", - "example": "2025-12-03T10:30:00Z" + "example": "2025-12-03T10:30:00Z", + "type": "string" } - } + }, + "required": [ + "id", + "name", + "provider_type", + "region", + "is_active", + "credentials", + "created_at", + "updated_at" + ], + "type": "object" }, "EmailProviderTypeRoute": { - "type": "string", "enum": [ "ses", "scaleway", "smtp" - ] + ], + "type": "string" }, "EmailRequest": { - "type": "object", "description": "Request body carrying just an email address (password-reset request).", - "required": [ - "email" - ], "properties": { "email": { "type": "string" } - } - }, - "EmailResponse": { - "type": "object", + }, "required": [ - "id", - "from_address", - "to_addresses", - "subject", - "status", - "created_at", - "track_opens", - "track_clicks", - "open_count", - "click_count" + "email" ], + "type": "object" + }, + "EmailResponse": { "properties": { "bcc_addresses": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "cc_addresses": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "click_count": { - "type": "integer", + "description": "Number of times links in the email were clicked", "format": "int32", - "description": "Number of times links in the email were clicked" + "type": "integer" }, "created_at": { - "type": "string", - "example": "2025-12-03T10:30:00Z" + "example": "2025-12-03T10:30:00Z", + "type": "string" }, "domain_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_message": { "type": [ @@ -12298,22 +12345,22 @@ ] }, "first_clicked_at": { + "description": "When a link was first clicked", "type": [ "string", "null" - ], - "description": "When a link was first clicked" + ] }, "first_opened_at": { + "description": "When the email was first opened", "type": [ "string", "null" - ], - "description": "When the email was first opened" + ] }, "from_address": { - "type": "string", - "example": "hello@updates.example.com" + "example": "hello@updates.example.com", + "type": "string" }, "from_name": { "type": [ @@ -12322,16 +12369,16 @@ ] }, "headers": { - "type": [ - "object", - "null" - ], "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": [ + "object", + "null" + ] }, "html_body": { "type": [ @@ -12340,20 +12387,20 @@ ] }, "id": { - "type": "string", - "example": "550e8400-e29b-41d4-a716-446655440000" + "example": "550e8400-e29b-41d4-a716-446655440000", + "type": "string" }, "open_count": { - "type": "integer", + "description": "Number of times the email was opened", "format": "int32", - "description": "Number of times the email was opened" + "type": "integer" }, "project_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "provider_message_id": { "type": [ @@ -12374,20 +12421,20 @@ ] }, "status": { - "type": "string", - "example": "sent" + "example": "sent", + "type": "string" }, "subject": { "type": "string" }, "tags": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "text_body": { "type": [ @@ -12396,105 +12443,107 @@ ] }, "to_addresses": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "track_clicks": { - "type": "boolean", - "description": "Whether click tracking is enabled" + "description": "Whether click tracking is enabled", + "type": "boolean" }, "track_opens": { - "type": "boolean", - "description": "Whether open tracking is enabled" + "description": "Whether open tracking is enabled", + "type": "boolean" }, "tracked_html_body": { + "description": "The final HTML sent to the provider (with tracking pixel and rewritten links)", "type": [ "string", "null" - ], - "description": "The final HTML sent to the provider (with tracking pixel and rewritten links)" + ] } - } - }, - "EmailStatsResponse": { - "type": "object", + }, "required": [ - "total", - "sent", - "failed", - "queued", - "captured" + "id", + "from_address", + "to_addresses", + "subject", + "status", + "created_at", + "track_opens", + "track_clicks", + "open_count", + "click_count" ], + "type": "object" + }, + "EmailStatsResponse": { "properties": { "captured": { - "type": "integer", - "format": "int64", "description": "Emails captured without sending (Mailhog mode - no provider configured)", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "failed": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "queued": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sent": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "EmailStatusResponse": { - "type": "object", + }, "required": [ - "email_configured", - "password_reset_available", - "oidc_providers" + "total", + "sent", + "failed", + "queued", + "captured" ], + "type": "object" + }, + "EmailStatusResponse": { "properties": { "email_configured": { "type": "boolean" }, "oidc_providers": { - "type": "array", "items": { "$ref": "#/components/schemas/OidcProviderSummary" - } + }, + "type": "array" }, "password_reset_available": { "type": "boolean" } - } + }, + "required": [ + "email_configured", + "password_reset_available", + "oidc_providers" + ], + "type": "object" }, "EmailTrackingResponse": { - "type": "object", "description": "Email tracking summary", - "required": [ - "email_id", - "track_opens", - "track_clicks", - "open_count", - "click_count", - "unique_opens", - "unique_clicks", - "links" - ], "properties": { "click_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "email_id": { "type": "string" @@ -12512,14 +12561,14 @@ ] }, "links": { - "type": "array", "items": { "$ref": "#/components/schemas/TrackedLinkResponse" - } + }, + "type": "array" }, "open_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "track_clicks": { "type": "boolean" @@ -12528,59 +12577,65 @@ "type": "boolean" }, "unique_clicks": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "unique_opens": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "email_id", + "track_opens", + "track_clicks", + "open_count", + "click_count", + "unique_opens", + "unique_clicks", + "links" + ], + "type": "object" }, "EmailTrackingSetupResponse": { - "type": "object", "description": "Result of the one-click AWS-side event-tracking setup.", - "required": [ - "topic_arn", - "webhook_url", - "subscription_requested", - "event_destination_attached" - ], "properties": { "event_destination_attached": { - "type": "boolean", - "description": "The SESv2 event destination (bounce/complaint/delivery) is attached\nto the `temps-tracking` configuration set." + "description": "The SESv2 event destination (bounce/complaint/delivery) is attached\nto the `temps-tracking` configuration set.", + "type": "boolean" }, "subscription_requested": { - "type": "boolean", - "description": "The webhook subscription was requested; SNS confirms it\nasynchronously through the webhook itself." + "description": "The webhook subscription was requested; SNS confirms it\nasynchronously through the webhook itself.", + "type": "boolean" }, "topic_arn": { - "type": "string", - "example": "arn:aws:sns:us-east-1:123456789012:temps-email-events-1" + "example": "arn:aws:sns:us-east-1:123456789012:temps-email-events-1", + "type": "string" }, "webhook_url": { "type": "string" } - } - }, - "EmailTrackingStatusResponse": { - "type": "object", - "description": "Live status of the SES event-tracking pipeline for one provider.", + }, "required": [ + "topic_arn", "webhook_url", - "supports_event_tracking" + "subscription_requested", + "event_destination_attached" ], + "type": "object" + }, + "EmailTrackingStatusResponse": { + "description": "Live status of the SES event-tracking pipeline for one provider.", "properties": { "last_event_at": { + "description": "Most recent delivered/bounced/complained event recorded for an email\nsent through this provider. `null` means no provider feedback has\narrived yet.", + "example": "2026-07-18T10:31:00Z", "type": [ "string", "null" - ], - "description": "Most recent delivered/bounced/complained event recorded for an email\nsent through this provider. `null` means no provider feedback has\narrived yet.", - "example": "2026-07-18T10:31:00Z" + ] }, "sns_topic_arn": { "type": [ @@ -12589,47 +12644,52 @@ ] }, "subscription_confirmed_at": { + "description": "When the SNS subscription for the current topic was confirmed.\n`null` with a topic set usually means the subscription is still\npending — most often because the endpoint was subscribed before the\ntopic ARN was saved here.", + "example": "2026-07-18T10:30:00Z", "type": [ "string", "null" - ], - "description": "When the SNS subscription for the current topic was confirmed.\n`null` with a topic set usually means the subscription is still\npending \u2014 most often because the endpoint was subscribed before the\ntopic ARN was saved here.", - "example": "2026-07-18T10:30:00Z" + ] }, "supports_event_tracking": { - "type": "boolean", - "description": "Only SES providers support SNS event tracking." + "description": "Only SES providers support SNS event tracking.", + "type": "boolean" }, "webhook_url": { - "type": "string", "description": "Public webhook endpoint SNS must deliver events to.", - "example": "https://temps.example.com/api/t/webhook/ses" + "example": "https://temps.example.com/api/t/webhook/ses", + "type": "string" } - } - }, - "EmbeddingData": { - "type": "object", + }, "required": [ - "object", - "embedding", - "index" + "webhook_url", + "supports_event_tracking" ], + "type": "object" + }, + "EmbeddingData": { "properties": { "embedding": { - "type": "array", "items": { - "type": "number", - "format": "double" - } + "format": "double", + "type": "number" + }, + "type": "array" }, "index": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "object": { "type": "string" } - } + }, + "required": [ + "object", + "embedding", + "index" + ], + "type": "object" }, "EmbeddingInput": { "oneOf": [ @@ -12637,26 +12697,21 @@ "type": "string" }, { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } ] }, "EmbeddingRequest": { - "type": "object", - "required": [ - "model", - "input" - ], "properties": { "dimensions": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "encoding_format": { "type": [ @@ -12670,22 +12725,20 @@ "model": { "type": "string" } - } - }, - "EmbeddingResponse": { - "type": "object", + }, "required": [ - "object", - "data", "model", - "usage" + "input" ], + "type": "object" + }, + "EmbeddingResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/EmbeddingData" - } + }, + "type": "array" }, "model": { "type": "string" @@ -12696,175 +12749,172 @@ "usage": { "$ref": "#/components/schemas/EmbeddingUsage" } - } - }, - "EmbeddingUsage": { - "type": "object", + }, "required": [ - "prompt_tokens", - "total_tokens" + "object", + "data", + "model", + "usage" ], + "type": "object" + }, + "EmbeddingUsage": { "properties": { "prompt_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "prompt_tokens", + "total_tokens" + ], + "type": "object" }, "EnableBlobRequest": { - "type": "object", "description": "Request to enable Blob service", "properties": { "docker_image": { + "description": "Docker image to use (optional, defaults to RustFS)", + "example": "ghcr.io/rustfs/rustfs:0.5.0", "type": [ "string", "null" - ], - "description": "Docker image to use (optional, defaults to RustFS)", - "example": "ghcr.io/rustfs/rustfs:0.5.0" + ] }, "root_password": { + "description": "Root password for S3 access", "type": [ "string", "null" - ], - "description": "Root password for S3 access" + ] }, "root_user": { + "description": "Root user for S3 access", "type": [ "string", "null" - ], - "description": "Root user for S3 access" + ] } - } + }, + "type": "object" }, "EnableBlobResponse": { - "type": "object", "description": "Response after enabling Blob service", - "required": [ - "success", - "message", - "status" - ], "properties": { "message": { - "type": "string", "description": "Human-readable message", - "example": "Blob service enabled successfully" + "example": "Blob service enabled successfully", + "type": "string" }, "status": { "$ref": "#/components/schemas/BlobStatusResponse", "description": "Current status" }, "success": { - "type": "boolean", "description": "Whether the operation succeeded", - "example": true + "example": true, + "type": "boolean" } - } + }, + "required": [ + "success", + "message", + "status" + ], + "type": "object" }, "EnableKvRequest": { - "type": "object", "description": "Request to enable the KV service", "properties": { "docker_image": { + "description": "Docker image to use (optional, uses default if not provided)", + "example": "gotempsh/redis-walg:8-bookworm", "type": [ "string", "null" - ], - "description": "Docker image to use (optional, uses default if not provided)", - "example": "gotempsh/redis-walg:8-bookworm" + ] }, "max_memory": { + "description": "Maximum memory allocation (e.g., \"256mb\", \"1gb\")", + "example": "256mb", "type": [ "string", "null" - ], - "description": "Maximum memory allocation (e.g., \"256mb\", \"1gb\")", - "example": "256mb" + ] }, "persistence": { - "type": "boolean", - "description": "Enable data persistence" + "description": "Enable data persistence", + "type": "boolean" } - } + }, + "type": "object" }, "EnableKvResponse": { - "type": "object", "description": "Response after enabling KV service", - "required": [ - "success", - "message", - "status" - ], "properties": { "message": { - "type": "string", "description": "Status message", - "example": "KV service enabled successfully" + "example": "KV service enabled successfully", + "type": "string" }, "status": { "$ref": "#/components/schemas/KvStatusResponse", "description": "Current service status" }, "success": { - "type": "boolean", - "description": "Whether the service was successfully enabled" + "description": "Whether the service was successfully enabled", + "type": "boolean" } - } + }, + "required": [ + "success", + "message", + "status" + ], + "type": "object" }, "EnablePgStatStatementsResponse": { - "type": "object", "description": "Response for the enable pg_stat_statements endpoint.", - "required": [ - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable message confirming the action." + "description": "Human-readable message confirming the action.", + "type": "string" } - } + }, + "required": [ + "message" + ], + "type": "object" }, "EndpointDto": { - "type": "object", "description": "One DNS record on the wire. Mirrors `service_endpoints::Model` but\nkeeps the API stable across entity evolution. `target_ip` is a string\n(v4 or v6 literal, or CNAME target hostname) parsed by the resolver.", - "required": [ - "id", - "fqdn", - "record_type", - "ttl", - "owner_kind", - "owner_id", - "generation" - ], "properties": { "fqdn": { "type": "string" }, "generation": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "node_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "owner_id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "owner_kind": { "type": "string" @@ -12879,69 +12929,73 @@ ] }, "target_port": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "ttl": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "id", + "fqdn", + "record_type", + "ttl", + "owner_kind", + "owner_id", + "generation" + ], + "type": "object" }, "EnqueuedJob": { - "type": "object", "description": "A single job that was successfully enqueued during a fan-out run.", - "required": [ - "backup_id", - "job_id", - "engine" - ], "properties": { "backup_id": { - "type": "integer", + "description": "FK to `backups.id` for this job.", "format": "int32", - "description": "FK to `backups.id` for this job." + "type": "integer" }, "engine": { - "type": "string", - "description": "Engine key (e.g. `\"control_plane\"`, `\"redis\"`, `\"postgres_pgdump\"`)." + "description": "Engine key (e.g. `\"control_plane\"`, `\"redis\"`, `\"postgres_pgdump\"`).", + "type": "string" }, "job_id": { - "type": "integer", + "description": "FK to `backup_jobs.id` for this job.", "format": "int64", - "description": "FK to `backup_jobs.id` for this job." + "type": "integer" }, "target_service_id": { + "description": "FK to `external_services.id` when this is an external-service job.\n`None` for the control-plane job.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "FK to `external_services.id` when this is an external-service job.\n`None` for the control-plane job." + ] } - } - }, - "EnrichVisitorRequest": { - "type": "object", + }, "required": [ - "custom_data" + "backup_id", + "job_id", + "engine" ], + "type": "object" + }, + "EnrichVisitorRequest": { "properties": { "custom_data": { "type": "object" } - } - }, - "EnrichVisitorResponse": { - "type": "object", + }, "required": [ - "success", - "visitor_id", - "message" + "custom_data" ], + "type": "object" + }, + "EnrichVisitorResponse": { "properties": { "message": { "type": "string" @@ -12952,17 +13006,15 @@ "visitor_id": { "type": "string" } - } - }, - "EnrollmentTokenInfo": { - "type": "object", + }, "required": [ - "id", - "expires_at", - "used_count", - "max_uses", - "created_at" + "success", + "visitor_id", + "message" ], + "type": "object" + }, + "EnrollmentTokenInfo": { "properties": { "bound_node_name": { "type": [ @@ -12977,165 +13029,166 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "max_uses": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "used_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "EnrollmentTokenListResponse": { - "type": "object", + }, "required": [ - "tokens" + "id", + "expires_at", + "used_count", + "max_uses", + "created_at" ], + "type": "object" + }, + "EnrollmentTokenListResponse": { "properties": { "tokens": { - "type": "array", "items": { "$ref": "#/components/schemas/EnrollmentTokenInfo" - } + }, + "type": "array" } - } - }, - "EntityInfoResponse": { - "type": "object", + }, "required": [ - "container_path", - "entity", - "entity_type", - "fields" + "tokens" ], + "type": "object" + }, + "EntityInfoResponse": { "properties": { "container_path": { - "type": "array", - "items": { - "type": "string" - }, "description": "Full container path", "example": [ "mydb", "public" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "entity": { - "type": "string", "description": "Entity name", - "example": "users" + "example": "users", + "type": "string" }, "entity_type": { - "type": "string", "description": "Entity type", - "example": "table" + "example": "table", + "type": "string" }, "fields": { - "type": "array", + "description": "Field definitions", "items": { "$ref": "#/components/schemas/FieldResponse" }, - "description": "Field definitions" + "type": "array" }, "metadata": { "description": "Additional metadata (content_type, last_modified, etag, etc.)" }, "row_count": { + "description": "Approximate row count (for tables/collections)", + "example": 1234, + "minimum": 0, "type": [ "integer", "null" - ], - "description": "Approximate row count (for tables/collections)", - "example": 1234, - "minimum": 0 + ] }, "size_bytes": { + "description": "Size in bytes (for objects/files)", + "example": 1048576, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size in bytes (for objects/files)", - "example": 1048576, - "minimum": 0 + ] }, "sort_schema": { "description": "JSON Schema for sort options (if supported)" } - } - }, - "EntityResponse": { - "type": "object", + }, "required": [ - "name", - "entity_type" + "container_path", + "entity", + "entity_type", + "fields" ], + "type": "object" + }, + "EntityResponse": { "properties": { "entity_type": { - "type": "string", "description": "Entity type (table, view, collection, etc.)", - "example": "table" + "example": "table", + "type": "string" }, "name": { - "type": "string", "description": "Entity name (table/collection)", - "example": "users" + "example": "users", + "type": "string" }, "row_count": { + "description": "Approximate row count", + "example": 1234, + "minimum": 0, "type": [ "integer", "null" - ], - "description": "Approximate row count", - "example": 1234, - "minimum": 0 + ] }, "size_bytes": { + "description": "Size in bytes (for files/objects)", + "example": 1048576, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size in bytes (for files/objects)", - "example": 1048576, - "minimum": 0 + ] } - } - }, - "EnvVarInput": { - "type": "object", - "description": "Input for environment variable", + }, "required": [ "name", - "value" + "entity_type" ], + "type": "object" + }, + "EnvVarInput": { + "description": "Input for environment variable", "properties": { "name": { - "type": "string", - "description": "Variable name" + "description": "Variable name", + "type": "string" }, "value": { - "type": "string", - "description": "Variable value" + "description": "Variable value", + "type": "string" } - } - }, - "EnvVarIntegrationInfo": { - "type": "object", + }, "required": [ - "service_id", - "service_name", - "service_type", - "service_updated_at" + "name", + "value" ], + "type": "object" + }, + "EnvVarIntegrationInfo": { "properties": { "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "service_name": { "type": "string" @@ -13152,20 +13205,21 @@ "service_updated_at": { "type": "string" } - } + }, + "required": [ + "service_id", + "service_name", + "service_type", + "service_updated_at" + ], + "type": "object" }, "EnvVarResponse": { - "type": "object", "description": "Environment variable with masked sensitive values", - "required": [ - "key", - "value", - "is_masked" - ], "properties": { "is_masked": { - "type": "boolean", - "description": "Whether this is a sensitive/masked value" + "description": "Whether this is a sensitive/masked value", + "type": "boolean" }, "key": { "type": "string" @@ -13173,127 +13227,127 @@ "value": { "type": "string" } - } + }, + "required": [ + "key", + "value", + "is_masked" + ], + "type": "object" }, "EnvVarTemplateResponse": { - "type": "object", "description": "Environment variable template response", - "required": [ - "name", - "required" - ], "properties": { "default": { + "description": "Default value if not provided by user", "type": [ "string", "null" - ], - "description": "Default value if not provided by user" + ] }, "default_generator": { + "description": "Frontend-side generator hint for the default value\n(e.g. `app_url`, `random_secret`, `random_hex_32`)", "type": [ "string", "null" - ], - "description": "Frontend-side generator hint for the default value\n(e.g. `app_url`, `random_secret`, `random_hex_32`)" + ] }, "description": { + "description": "Description of what this variable is used for", "type": [ "string", "null" - ], - "description": "Description of what this variable is used for" + ] }, "example": { + "description": "Example value for documentation", "type": [ "string", "null" - ], - "description": "Example value for documentation" + ] }, "name": { - "type": "string", - "description": "Name of the environment variable" + "description": "Name of the environment variable", + "type": "string" }, "required": { - "type": "boolean", - "description": "Whether this variable is required" + "description": "Whether this variable is required", + "type": "boolean" } - } - }, - "EnvironmentConfiguration": { - "type": "object", - "description": "Environment-level configuration", + }, "required": [ "name", - "subdomain", - "resources" + "required" ], + "type": "object" + }, + "EnvironmentConfiguration": { + "description": "Environment-level configuration", "properties": { "name": { - "type": "string", - "description": "Environment name" + "description": "Environment name", + "type": "string" }, "resources": { "$ref": "#/components/schemas/ResourceLimits", "description": "Resource limits for environment" }, "subdomain": { - "type": "string", - "description": "Proposed subdomain" + "description": "Proposed subdomain", + "type": "string" } - } - }, - "EnvironmentDomainResponse": { - "type": "object", + }, "required": [ - "id", - "environment_id", - "domain", - "created_at", - "url" + "name", + "subdomain", + "resources" ], + "type": "object" + }, + "EnvironmentDomainResponse": { "properties": { "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "domain": { "type": "string" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "url": { - "type": "string", "description": "Full URL for this domain (e.g., https://buildtolearndev-production.example.com)", - "example": "https://buildtolearndev-production.example.com" + "example": "https://buildtolearndev-production.example.com", + "type": "string" } - } - }, - "EnvironmentInfo": { - "type": "object", + }, "required": [ "id", - "name", - "main_url" + "environment_id", + "domain", + "created_at", + "url" ], + "type": "object" + }, + "EnvironmentInfo": { "properties": { "current_deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "main_url": { "type": "string" @@ -13301,30 +13355,22 @@ "name": { "type": "string" } - } - }, - "EnvironmentResponse": { - "type": "object", + }, "required": [ "id", - "project_id", "name", - "slug", - "main_url", - "subdomain", - "created_at", - "updated_at", - "is_preview", - "protected", - "sleeping" + "main_url" ], + "type": "object" + }, + "EnvironmentResponse": { "properties": { "attack_mode": { + "description": "Per-environment CAPTCHA attack-mode override.\n`null` means inherit the project-level `attack_mode`; `true`/`false`\nexplicitly enable/disable the challenge for this environment. Always\nserialized (NOT skipped) so the UI can distinguish `null` from `false`.", "type": [ "boolean", "null" - ], - "description": "Per-environment CAPTCHA attack-mode override.\n`null` means inherit the project-level `attack_mode`; `true`/`false`\nexplicitly enable/disable the challenge for this environment. Always\nserialized (NOT skipped) so the UI can distinguish `null` from `false`." + ] }, "branch": { "type": [ @@ -13333,15 +13379,15 @@ ] }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "current_deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "deployment_config": { "oneOf": [ @@ -13355,35 +13401,35 @@ ] }, "estimated_sleep_at": { + "description": "Estimated time (epoch millis) when the environment will go to sleep\nbased on last activity + idle timeout. NULL when sleeping or on-demand disabled.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Estimated time (epoch millis) when the environment will go to sleep\nbased on last activity + idle timeout. NULL when sleeping or on-demand disabled." + ] }, "force_https": { + "description": "Per-environment HTTP→HTTPS redirect override.\n`null` means inherit the proxy default (redirect only when the host has\nan active TLS certificate); `true` always redirects plain HTTP for this\nenvironment, `false` never does. Always serialized (NOT skipped) so the\nUI can distinguish `null` from `false`.", "type": [ "boolean", "null" - ], - "description": "Per-environment HTTP\u2192HTTPS redirect override.\n`null` means inherit the proxy default (redirect only when the host has\nan active TLS certificate); `true` always redirects plain HTTP for this\nenvironment, `false` never does. Always serialized (NOT skipped) so the\nUI can distinguish `null` from `false`." + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_preview": { - "type": "boolean", - "description": "Indicates if this is a preview environment (auto-created per branch)\nFor preview environments, 'branch' contains the feature branch name" + "description": "Indicates if this is a preview environment (auto-created per branch)\nFor preview environments, 'branch' contains the feature branch name", + "type": "boolean" }, "last_activity_at": { + "description": "Last proxied request timestamp (epoch millis) for on-demand environments.\nNULL when on-demand is disabled or no traffic has been received yet.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Last proxied request timestamp (epoch millis) for on-demand environments.\nNULL when on-demand is disabled or no traffic has been received yet." + ] }, "main_url": { "type": "string" @@ -13392,148 +13438,157 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "protected": { - "type": "boolean", - "description": "When true, git pushes do NOT auto-deploy to this environment.\nDeployments must be promoted from another environment." + "description": "When true, git pushes do NOT auto-deploy to this environment.\nDeployments must be promoted from another environment.", + "type": "boolean" }, "sleeping": { - "type": "boolean", - "description": "When true, the environment's containers are currently stopped due to\ninactivity (on-demand mode) and will start on the next request." + "description": "When true, the environment's containers are currently stopped due to\ninactivity (on-demand mode) and will start on the next request.", + "type": "boolean" }, "slug": { "type": "string" }, "subdomain": { - "type": "string", - "description": "The host label stored for this environment (e.g.\n`myproject-production`). This is the prefix that is combined with the\nplatform's preview domain at request time to produce `main_url`. Edit\nthis via the rename-subdomain endpoint, not the full URL." + "description": "The host label stored for this environment (e.g.\n`myproject-production`). This is the prefix that is combined with the\nplatform's preview domain at request time to produce `main_url`. Edit\nthis via the rename-subdomain endpoint, not the full URL.", + "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "id", + "project_id", + "name", + "slug", + "main_url", + "subdomain", + "created_at", + "updated_at", + "is_preview", + "protected", + "sleeping" + ], + "type": "object" }, "EnvironmentVariable": { - "type": "object", "description": "Environment variable", - "required": [ - "key", - "value", - "is_secret" - ], "properties": { "is_secret": { - "type": "boolean", - "description": "Whether this is a secret (should be encrypted)" + "description": "Whether this is a secret (should be encrypted)", + "type": "boolean" }, "key": { - "type": "string", - "description": "Variable name" + "description": "Variable name", + "type": "string" }, "source_description": { + "description": "Where this env var originates from (for traceability)", "type": [ "string", "null" - ], - "description": "Where this env var originates from (for traceability)" + ] }, "value": { - "type": "string", - "description": "Variable value (may be redacted for secrets)" + "description": "Variable value (may be redacted for secrets)", + "type": "string" } - } - }, - "EnvironmentVariableInfo": { - "type": "object", + }, "required": [ - "name", + "key", "value", - "sensitive" + "is_secret" ], + "type": "object" + }, + "EnvironmentVariableInfo": { "properties": { "name": { "type": "string" }, "sensitive": { - "type": "boolean", "description": "Whether this variable contains sensitive data (passwords, keys, tokens)", - "example": false + "example": false, + "type": "boolean" }, "value": { "type": "string" } - } - }, - "EnvironmentVariableResponse": { - "type": "object", + }, "required": [ - "id", - "key", - "created_at", - "updated_at", - "environments", - "include_in_preview", - "is_secret" + "name", + "value", + "sensitive" ], + "type": "object" + }, + "EnvironmentVariableResponse": { "properties": { "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "environments": { - "type": "array", "items": { "$ref": "#/components/schemas/EnvironmentInfo" - } + }, + "type": "array" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "include_in_preview": { - "type": "boolean", - "description": "Include this environment variable in preview environments" + "description": "Include this environment variable in preview environments", + "type": "boolean" }, "is_secret": { - "type": "boolean", - "description": "Whether the variable is a write-only secret. Secrets always have\n`value: None` in responses." + "description": "Whether the variable is a write-only secret. Secrets always have\n`value: None` in responses.", + "type": "boolean" }, "key": { "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "value": { + "description": "Plaintext value for non-secret vars (or `\"***\"` mask for list responses).\n`None` for secret vars — secrets are write-only.", "type": [ "string", "null" - ], - "description": "Plaintext value for non-secret vars (or `\"***\"` mask for list responses).\n`None` for secret vars \u2014 secrets are write-only." + ] } - } - }, - "EnvironmentVariableValueResponse": { - "type": "object", + }, "required": [ - "value" + "id", + "key", + "created_at", + "updated_at", + "environments", + "include_in_preview", + "is_secret" ], + "type": "object" + }, + "EnvironmentVariableValueResponse": { "properties": { "value": { "type": "string" } - } - }, - "ErrorDashboardStatsQuery": { - "type": "object", + }, "required": [ - "start_time", - "end_time" + "value" ], + "type": "object" + }, + "ErrorDashboardStatsQuery": { "properties": { "compare_to_previous": { "type": [ @@ -13542,86 +13597,84 @@ ] }, "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "ErrorDashboardStatsResponse": { - "type": "object", + }, "required": [ - "total_errors", - "total_errors_previous_period", - "total_errors_change_percent", - "error_groups", - "error_groups_previous_period", "start_time", "end_time" ], + "type": "object" + }, + "ErrorDashboardStatsResponse": { "properties": { "comparison_end_time": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "comparison_start_time": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "error_groups": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "error_groups_previous_period": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "total_errors": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_errors_change_percent": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "total_errors_previous_period": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ErrorEventResponse": { - "type": "object", + }, "required": [ - "id", - "error_group_id", - "timestamp", - "created_at" + "total_errors", + "total_errors_previous_period", + "total_errors_change_percent", + "error_groups", + "error_groups_previous_period", + "start_time", + "end_time" ], + "type": "object" + }, + "ErrorEventResponse": { "properties": { "created_at": { "type": "string" @@ -13630,39 +13683,33 @@ "description": "Full error event data (contains raw Sentry event or custom error data)" }, "error_group_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "source": { + "description": "Source of the error event (e.g., \"sentry\", \"custom\", \"bugsnag\")", "type": [ "string", "null" - ], - "description": "Source of the error event (e.g., \"sentry\", \"custom\", \"bugsnag\")" + ] }, "timestamp": { "type": "string" } - } - }, - "ErrorGroupResponse": { - "type": "object", + }, "required": [ "id", - "title", - "error_type", - "first_seen", - "last_seen", - "total_count", - "status", - "project_id", - "created_at", - "updated_at" + "error_group_id", + "timestamp", + "created_at" ], + "type": "object" + }, + "ErrorGroupResponse": { "properties": { "assigned_to": { "type": [ @@ -13674,18 +13721,18 @@ "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_type": { "type": "string" @@ -13694,8 +13741,8 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_seen": { "type": "string" @@ -13707,8 +13754,8 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { "type": "string" @@ -13717,53 +13764,62 @@ "type": "string" }, "total_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { "type": "string" }, "visitor_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } - }, - "ErrorGroupStatsResponse": { - "type": "object", + }, "required": [ - "total_groups", - "unresolved_groups", - "resolved_groups", - "ignored_groups" + "id", + "title", + "error_type", + "first_seen", + "last_seen", + "total_count", + "status", + "project_id", + "created_at", + "updated_at" ], + "type": "object" + }, + "ErrorGroupStatsResponse": { "properties": { "ignored_groups": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "resolved_groups": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_groups": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "unresolved_groups": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ErrorResponse": { - "type": "object", + }, "required": [ - "error" + "total_groups", + "unresolved_groups", + "resolved_groups", + "ignored_groups" ], + "type": "object" + }, + "ErrorResponse": { "properties": { "details": { "type": [ @@ -13774,47 +13830,41 @@ "error": { "type": "string" } - } - }, - "ErrorRow": { - "type": "object", + }, "required": [ - "id", - "ts", - "error_group_id", - "fingerprint", - "error_class", - "stacktrace_preview", - "stacktrace_truncated" + "error" ], + "type": "object" + }, + "ErrorRow": { "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_class": { "type": "string" }, "error_group_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "fingerprint": { "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "message": { "type": [ @@ -13833,512 +13883,515 @@ ] }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "ErrorTimeSeriesDataResponse": { - "type": "object", + }, "required": [ - "timestamp", - "count" + "id", + "ts", + "error_group_id", + "fingerprint", + "error_class", + "stacktrace_preview", + "stacktrace_truncated" ], + "type": "object" + }, + "ErrorTimeSeriesDataResponse": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "timestamp": { "type": "string" } - } - }, - "ErrorTimeSeriesQuery": { - "type": "object", + }, "required": [ - "start_time", - "end_time" + "timestamp", + "count" ], + "type": "object" + }, + "ErrorTimeSeriesQuery": { "properties": { "bucket": { - "type": "string", "description": "Time bucket size (e.g., \"1h\", \"15m\", \"1d\", \"1 hour\", \"30 minutes\")", - "example": "1h" + "example": "1h", + "type": "string" }, "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_time", + "end_time" + ], + "type": "object" }, "EventActivityBucket": { - "type": "object", "description": "Time bucket data point for event activity graph", - "required": [ - "timestamp", - "count", - "unique_visitors" - ], "properties": { "count": { - "type": "integer", + "description": "Number of event occurrences in this bucket", "format": "int64", - "description": "Number of event occurrences in this bucket" + "type": "integer" }, "timestamp": { - "type": "string", - "description": "Timestamp for this bucket (ISO 8601)" + "description": "Timestamp for this bucket (ISO 8601)", + "type": "string" }, "unique_visitors": { - "type": "integer", + "description": "Number of unique visitors in this bucket", "format": "int64", - "description": "Number of unique visitors in this bucket" + "type": "integer" } - } + }, + "required": [ + "timestamp", + "count", + "unique_visitors" + ], + "type": "object" }, "EventBreakdown": { - "type": "string", "enum": [ "country", "region", "city" - ] + ], + "type": "string" }, "EventBrowserStats": { - "type": "object", "description": "Browser stats for an event", - "required": [ - "browser", - "count", - "percentage" - ], "properties": { "browser": { - "type": "string", - "description": "Browser name" + "description": "Browser name", + "type": "string" }, "count": { - "type": "integer", + "description": "Number of event occurrences from this browser", "format": "int64", - "description": "Number of event occurrences from this browser" + "type": "integer" }, "percentage": { - "type": "number", + "description": "Percentage of total events", "format": "double", - "description": "Percentage of total events" + "type": "number" } - } - }, - "EventCount": { - "type": "object", + }, "required": [ - "event_name", + "browser", "count", "percentage" ], + "type": "object" + }, + "EventCount": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "event_name": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "EventCountryStats": { - "type": "object", - "description": "Country stats for an event", + }, "required": [ - "country", + "event_name", "count", "percentage" ], + "type": "object" + }, + "EventCountryStats": { + "description": "Country stats for an event", "properties": { "count": { - "type": "integer", + "description": "Number of event occurrences from this country", "format": "int64", - "description": "Number of event occurrences from this country" + "type": "integer" }, "country": { - "type": "string", - "description": "Country name" + "description": "Country name", + "type": "string" }, "country_code": { + "description": "ISO country code (2-letter)", "type": [ "string", "null" - ], - "description": "ISO country code (2-letter)" + ] }, "percentage": { - "type": "number", + "description": "Percentage of total events", "format": "double", - "description": "Percentage of total events" + "type": "number" } - } + }, + "required": [ + "country", + "count", + "percentage" + ], + "type": "object" }, "EventDetailQuery": { - "type": "object", "description": "Query parameters for event detail analytics", - "required": [ - "event_name", - "project_id", - "start_date", - "end_date" - ], "properties": { "bucket_interval": { + "description": "Bucket interval for time series: 'hour', 'day', 'week', 'month' (default: auto)", "type": [ "string", "null" - ], - "description": "Bucket interval for time series: 'hour', 'day', 'week', 'month' (default: auto)" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_name": { - "type": "string", - "description": "The specific event name to get details for" + "description": "The specific event name to get details for", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventDetailResponse": { - "type": "object", - "description": "Summary response for a specific event's analytics", + }, "required": [ "event_name", - "total_count", - "unique_visitors", - "unique_sessions", - "activity_over_time", - "referrers", - "countries", - "browsers", - "bucket_interval" + "project_id", + "start_date", + "end_date" ], + "type": "object" + }, + "EventDetailResponse": { + "description": "Summary response for a specific event's analytics", "properties": { "activity_over_time": { - "type": "array", + "description": "Time series data for event activity graph", "items": { "$ref": "#/components/schemas/EventActivityBucket" }, - "description": "Time series data for event activity graph" + "type": "array" }, "browsers": { - "type": "array", + "description": "Browser distribution of visitors who triggered this event", "items": { "$ref": "#/components/schemas/EventBrowserStats" }, - "description": "Browser distribution of visitors who triggered this event" + "type": "array" }, "bucket_interval": { - "type": "string", - "description": "Bucket interval used for time series ('hour', 'day', etc.)" + "description": "Bucket interval used for time series ('hour', 'day', etc.)", + "type": "string" }, "countries": { - "type": "array", + "description": "Geographic distribution of visitors who triggered this event", "items": { "$ref": "#/components/schemas/EventCountryStats" }, - "description": "Geographic distribution of visitors who triggered this event" + "type": "array" }, "event_name": { - "type": "string", - "description": "The event name being analyzed" + "description": "The event name being analyzed", + "type": "string" }, "referrers": { - "type": "array", + "description": "Top referrer hostnames for visitors who triggered this event", "items": { "$ref": "#/components/schemas/EventReferrerStats" }, - "description": "Top referrer hostnames for visitors who triggered this event" + "type": "array" }, "total_count": { - "type": "integer", + "description": "Total number of times this event was triggered in the date range", "format": "int64", - "description": "Total number of times this event was triggered in the date range" + "type": "integer" }, "unique_sessions": { - "type": "integer", + "description": "Number of unique sessions where this event occurred", "format": "int64", - "description": "Number of unique sessions where this event occurred" + "type": "integer" }, "unique_visitors": { - "type": "integer", + "description": "Number of unique visitors who triggered this event", "format": "int64", - "description": "Number of unique visitors who triggered this event" + "type": "integer" } - } - }, - "EventEntriesQuery": { - "type": "object", - "description": "Query parameters for the raw event entries list", + }, "required": [ "event_name", - "project_id", - "start_date", - "end_date" + "total_count", + "unique_visitors", + "unique_sessions", + "activity_over_time", + "referrers", + "countries", + "browsers", + "bucket_interval" ], + "type": "object" + }, + "EventEntriesQuery": { + "description": "Query parameters for the raw event entries list", "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_name": { - "type": "string", - "description": "The specific event name to list occurrences for" + "description": "The specific event name to list occurrences for", + "type": "string" }, "page": { + "description": "Page number (1-based, default: 1)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Page number (1-based, default: 1)", - "minimum": 0 + ] }, "per_page": { + "description": "Items per page (default: 20, max: 100)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Items per page (default: 20, max: 100)", - "minimum": 0 + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventEntriesResponse": { - "type": "object", - "description": "Paginated response for raw event entries", + }, "required": [ "event_name", - "total_count", - "page", - "per_page", - "entries" + "project_id", + "start_date", + "end_date" ], + "type": "object" + }, + "EventEntriesResponse": { + "description": "Paginated response for raw event entries", "properties": { "entries": { - "type": "array", + "description": "Individual event occurrences, most recent first", "items": { "$ref": "#/components/schemas/EventEntryInfo" }, - "description": "Individual event occurrences, most recent first" + "type": "array" }, "event_name": { - "type": "string", - "description": "The event name" + "description": "The event name", + "type": "string" }, "page": { - "type": "integer", - "format": "int64", "description": "Current page number", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "per_page": { - "type": "integer", - "format": "int64", "description": "Items per page", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "total_count": { - "type": "integer", + "description": "Total number of occurrences of this event in the date range", "format": "int64", - "description": "Total number of occurrences of this event in the date range" + "type": "integer" } - } + }, + "required": [ + "event_name", + "total_count", + "page", + "per_page", + "entries" + ], + "type": "object" }, "EventEntryInfo": { - "type": "object", "description": "A single raw occurrence of an event, including its custom JSON properties", - "required": [ - "id", - "timestamp", - "page_path", - "href" - ], "properties": { "browser": { + "description": "Browser name", "type": [ "string", "null" - ], - "description": "Browser name" + ] }, "city": { + "description": "City of the visitor at the time of the event", "type": [ "string", "null" - ], - "description": "City of the visitor at the time of the event" + ] }, "country": { + "description": "Country of the visitor at the time of the event", "type": [ "string", "null" - ], - "description": "Country of the visitor at the time of the event" + ] }, "country_code": { + "description": "ISO country code (2-letter)", "type": [ "string", "null" - ], - "description": "ISO country code (2-letter)" + ] }, "device_type": { + "description": "Device type (Desktop, Mobile, Tablet)", "type": [ "string", "null" - ], - "description": "Device type (Desktop, Mobile, Tablet)" + ] }, "href": { - "type": "string", - "description": "Full URL where the event was triggered" + "description": "Full URL where the event was triggered", + "type": "string" }, "id": { - "type": "integer", + "description": "Event row ID", "format": "int64", - "description": "Event row ID" + "type": "integer" }, "page_path": { - "type": "string", - "description": "Page path where the event was triggered" + "description": "Page path where the event was triggered", + "type": "string" }, "props": { + "description": "Custom event properties as JSON (null when the event carried no data)", "type": [ "object", "null" - ], - "description": "Custom event properties as JSON (null when the event carried no data)" + ] }, "session_id": { + "description": "Session ID the event belongs to (if any)", "type": [ "string", "null" - ], - "description": "Session ID the event belongs to (if any)" + ] }, "timestamp": { - "type": "string", + "description": "When the event occurred", "format": "date-time", - "description": "When the event occurred" + "type": "string" }, "visitor_id": { + "description": "Visitor numeric ID (if known)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Visitor numeric ID (if known)" + ] }, "visitor_uuid": { + "description": "Visitor UUID (if known)", "type": [ "string", "null" - ], - "description": "Visitor UUID (if known)" + ] } - } + }, + "required": [ + "id", + "timestamp", + "page_path", + "href" + ], + "type": "object" }, "EventKind": { - "type": "string", "description": "Tag enum for filter parameters and routing. Matches the variant\ndiscriminator used by `ObservabilityEvent`.", "enum": [ "request", "span", "error", "revenue" - ] + ], + "type": "string" }, "EventMetricsPayload": { - "type": "object", - "required": [ - "event_name", - "event_data", - "request_path", - "request_query" - ], "properties": { "cls": { + "description": "Cumulative Layout Shift (score)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Cumulative Layout Shift (score)" + ] }, "event_data": {}, "event_name": { "type": "string" }, "fcp": { + "description": "First Contentful Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "First Contentful Paint (milliseconds)" + ] }, "fid": { + "description": "First Input Delay (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "First Input Delay (milliseconds)" + ] }, "inp": { + "description": "Interaction to Next Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Interaction to Next Paint (milliseconds)" + ] }, "language": { "type": [ @@ -14347,12 +14400,12 @@ ] }, "lcp": { + "description": "Largest Contentful Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Largest Contentful Paint (milliseconds)" + ] }, "page_title": { "type": [ @@ -14361,11 +14414,11 @@ ] }, "referrer": { + "description": "Referrer URL (falls back to Referer header if not provided)", "type": [ "string", "null" - ], - "description": "Referrer URL (falls back to Referer header if not provided)" + ] }, "request_path": { "type": "string" @@ -14374,117 +14427,119 @@ "type": "string" }, "screen_height": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "screen_width": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "ttfb": { + "description": "Time to First Byte (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Time to First Byte (milliseconds)" + ] }, "viewport_height": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "viewport_width": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] } - } + }, + "required": [ + "event_name", + "event_data", + "request_path", + "request_query" + ], + "type": "object" }, "EventReferrerStats": { - "type": "object", "description": "Referrer stats for an event", - "required": [ - "referrer", - "count", - "percentage" - ], "properties": { "count": { - "type": "integer", + "description": "Number of event occurrences from this referrer", "format": "int64", - "description": "Number of event occurrences from this referrer" + "type": "integer" }, "percentage": { - "type": "number", + "description": "Percentage of total events", "format": "double", - "description": "Percentage of total events" + "type": "number" }, "referrer": { - "type": "string", - "description": "Referrer hostname or \"Direct\"" + "description": "Referrer hostname or \"Direct\"", + "type": "string" } - } - }, - "EventTimeline": { - "type": "object", + }, "required": [ - "date", - "count" + "referrer", + "count", + "percentage" ], + "type": "object" + }, + "EventTimeline": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventTimelineQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date" + "date", + "count" ], + "type": "object" + }, + "EventTimelineQuery": { "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level: events (raw count), sessions (unique sessions), or visitors (unique visitors)" }, "bucket_size": { + "description": "Bucket size: hour, day, or week (auto-detected if not specified)", "type": [ "string", "null" - ], - "description": "Bucket size: hour, day, or week (auto-detected if not specified)" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_name": { "type": [ @@ -14493,83 +14548,82 @@ ] }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventType": { - "type": "object", + }, "required": [ - "name", - "count" + "start_date", + "end_date" ], + "type": "object" + }, + "EventType": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "name": { "type": "string" } - } - }, - "EventTypeBreakdown": { - "type": "object", + }, "required": [ - "event_type", - "count", - "percentage" + "name", + "count" ], + "type": "object" + }, + "EventTypeBreakdown": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "event_type": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "EventTypeBreakdownQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date" + "event_type", + "count", + "percentage" ], + "type": "object" + }, + "EventTypeBreakdownQuery": { "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level: events (raw count), sessions (unique sessions), or visitors (unique visitors)" }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventTypeResponse": { - "type": "object", + }, "required": [ - "event_type", - "description", - "category" + "start_date", + "end_date" ], + "type": "object" + }, + "EventTypeResponse": { "properties": { "category": { "type": "string" @@ -14580,288 +14634,291 @@ "event_type": { "type": "string" } - } - }, - "EventTypesResponse": { - "type": "object", + }, "required": [ - "events", - "total", - "page", - "page_size" + "event_type", + "description", + "category" ], + "type": "object" + }, + "EventTypesResponse": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/EventType" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "events", + "total", + "page", + "page_size" + ], + "type": "object" }, "EventVisitorInfo": { - "type": "object", "description": "A visitor who triggered a specific event", - "required": [ - "visitor_id", - "visitor_uuid", - "event_count", - "first_triggered", - "last_triggered" - ], "properties": { "browser": { + "description": "Browser name", "type": [ "string", "null" - ], - "description": "Browser name" + ] }, "city": { + "description": "Visitor's city", "type": [ "string", "null" - ], - "description": "Visitor's city" + ] }, "country": { + "description": "Visitor's country", "type": [ "string", "null" - ], - "description": "Visitor's country" + ] }, "country_code": { + "description": "Visitor's country code", "type": [ "string", "null" - ], - "description": "Visitor's country code" + ] }, "device_type": { + "description": "Device type (Desktop, Mobile, Tablet)", "type": [ "string", "null" - ], - "description": "Device type (Desktop, Mobile, Tablet)" + ] }, "event_count": { - "type": "integer", + "description": "Number of times this visitor triggered the event", "format": "int64", - "description": "Number of times this visitor triggered the event" + "type": "integer" }, "first_triggered": { - "type": "string", + "description": "When the visitor first triggered the event in the date range", "format": "date-time", - "description": "When the visitor first triggered the event in the date range" + "type": "string" }, "last_triggered": { - "type": "string", + "description": "When the visitor last triggered the event in the date range", "format": "date-time", - "description": "When the visitor last triggered the event in the date range" + "type": "string" }, "referrer_hostname": { + "description": "Referrer hostname for the event", "type": [ "string", "null" - ], - "description": "Referrer hostname for the event" + ] }, "visitor_id": { - "type": "integer", + "description": "Visitor numeric ID", "format": "int32", - "description": "Visitor numeric ID" + "type": "integer" }, "visitor_uuid": { - "type": "string", - "description": "Visitor UUID" + "description": "Visitor UUID", + "type": "string" } - } + }, + "required": [ + "visitor_id", + "visitor_uuid", + "event_count", + "first_triggered", + "last_triggered" + ], + "type": "object" }, "EventVisitorsQuery": { - "type": "object", "description": "Query parameters for event visitors list", - "required": [ - "event_name", - "project_id", - "start_date", - "end_date" - ], "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_name": { - "type": "string", - "description": "The specific event name to list visitors for" + "description": "The specific event name to list visitors for", + "type": "string" }, "page": { + "description": "Page number (1-based, default: 1)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Page number (1-based, default: 1)", - "minimum": 0 + ] }, "per_page": { + "description": "Items per page (default: 20, max: 100)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Items per page (default: 20, max: 100)", - "minimum": 0 + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventVisitorsResponse": { - "type": "object", - "description": "Paginated response for event visitors", + }, "required": [ "event_name", - "total_count", - "page", - "per_page", - "visitors" + "project_id", + "start_date", + "end_date" ], + "type": "object" + }, + "EventVisitorsResponse": { + "description": "Paginated response for event visitors", "properties": { "event_name": { - "type": "string", - "description": "The event name" + "description": "The event name", + "type": "string" }, "page": { - "type": "integer", - "format": "int64", "description": "Current page number", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "per_page": { - "type": "integer", - "format": "int64", "description": "Items per page", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "total_count": { - "type": "integer", + "description": "Total number of unique visitors who triggered this event", "format": "int64", - "description": "Total number of unique visitors who triggered this event" + "type": "integer" }, "visitors": { - "type": "array", + "description": "Individual visitors who triggered this event", "items": { "$ref": "#/components/schemas/EventVisitorInfo" }, - "description": "Individual visitors who triggered this event" + "type": "array" } - } - }, - "EventsCountQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date" + "event_name", + "total_count", + "page", + "per_page", + "visitors" ], + "type": "object" + }, + "EventsCountQuery": { "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level: events (raw count), sessions (unique sessions), or visitors (unique visitors)" }, "custom_events_only": { + "description": "Only return custom events, excluding system events like page_view, page_leave, heartbeat (default: true)", "type": [ "boolean", "null" - ], - "description": "Only return custom events, excluding system events like page_view, page_leave, heartbeat (default: true)" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "EventsResponse": { - "type": "object", + }, "required": [ - "events", - "applied_kinds" + "start_date", + "end_date" ], + "type": "object" + }, + "EventsResponse": { "properties": { "applied_kinds": { - "type": "array", + "description": "Echo of the kinds filter actually applied (server-resolved). Useful\nfor clients that pass `kinds=` empty and want to know what they got.", "items": { "$ref": "#/components/schemas/EventKind" }, - "description": "Echo of the kinds filter actually applied (server-resolved). Useful\nfor clients that pass `kinds=` empty and want to know what they got." + "type": "array" }, "events": { - "type": "array", "items": { "$ref": "#/components/schemas/ObservabilityEvent" - } + }, + "type": "array" } - } - }, - "ExecBody": { - "type": "object", + }, "required": [ - "cmd" + "events", + "applied_kinds" ], + "type": "object" + }, + "ExecBody": { + "additionalProperties": false, "properties": { "cmd": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "cwd": { "type": [ @@ -14870,39 +14927,36 @@ ] }, "env": { - "type": "object", "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": "object" } }, - "additionalProperties": false - }, - "ExecDetachedResponse": { - "type": "object", "required": [ - "job_id" + "cmd" ], + "type": "object" + }, + "ExecDetachedResponse": { "properties": { "job_id": { "type": "string" } - } - }, - "ExecResponse": { - "type": "object", + }, "required": [ - "exit_code", - "stdout", - "stderr" + "job_id" ], + "type": "object" + }, + "ExecResponse": { "properties": { "exit_code": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "stderr": { "type": "string" @@ -14910,240 +14964,238 @@ "stdout": { "type": "string" } - } + }, + "required": [ + "exit_code", + "stdout", + "stderr" + ], + "type": "object" }, "ExecuteImportRequest": { - "type": "object", "description": "Request to execute an import", - "required": [ - "session_id", - "project_name", - "preset", - "directory", - "main_branch" - ], "properties": { "directory": { - "type": "string", "description": "Project directory", - "example": "." + "example": ".", + "type": "string" }, "dry_run": { + "description": "Dry run mode (don't create resources)", "type": [ "boolean", "null" - ], - "description": "Dry run mode (don't create resources)" + ] }, "main_branch": { - "type": "string", "description": "Main branch name", - "example": "main" + "example": "main", + "type": "string" }, "preset": { - "type": "string", - "description": "Preset to use for the project (e.g., \"nextjs\", \"express\", \"docker\")" + "description": "Preset to use for the project (e.g., \"nextjs\", \"express\", \"docker\")", + "type": "string" }, "project_name": { - "type": "string", "description": "Project name to use (overrides the name from the plan)", - "example": "my-app" + "example": "my-app", + "type": "string" }, "session_id": { - "type": "string", - "description": "Session ID from plan creation" + "description": "Session ID from plan creation", + "type": "string" } - } - }, - "ExecuteImportResponse": { - "type": "object", - "description": "Response from import execution", + }, "required": [ "session_id", - "status", - "step_results" + "project_name", + "preset", + "directory", + "main_branch" ], + "type": "object" + }, + "ExecuteImportResponse": { + "description": "Response from import execution", "properties": { "deployment_id": { + "description": "Created deployment ID (if completed)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created deployment ID (if completed)" + ] }, "environment_id": { + "description": "Created environment ID (if completed)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created environment ID (if completed)" + ] }, "project_id": { + "description": "Created project ID (if completed)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created project ID (if completed)" + ] }, "session_id": { - "type": "string", - "description": "Session ID" + "description": "Session ID", + "type": "string" }, "status": { "$ref": "#/components/schemas/ImportExecutionStatus", "description": "Execution status" }, "step_results": { - "type": "array", + "description": "Per-step results (in execution order)", "items": { "$ref": "#/components/schemas/StepResult" }, - "description": "Per-step results (in execution order)" + "type": "array" } - } - }, - "ExecuteOperationRequest": { - "type": "object", + }, "required": [ - "operation" + "session_id", + "status", + "step_results" ], + "type": "object" + }, + "ExecuteOperationRequest": { "properties": { "operation": { "type": "string" } - } + }, + "required": [ + "operation" + ], + "type": "object" }, "ExpireRequest": { - "type": "object", "description": "Request to set expiration on a key", - "required": [ - "key", - "seconds" - ], "properties": { "key": { - "type": "string", "description": "The key to set expiration on", - "example": "session:abc" + "example": "session:abc", + "type": "string" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] }, "seconds": { - "type": "integer", - "format": "int64", "description": "Expiration time in seconds", - "example": 3600 + "example": 3600, + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "key", + "seconds" + ], + "type": "object" }, "ExpireResponse": { - "type": "object", "description": "Response for expire operation", - "required": [ - "success" - ], "properties": { "success": { - "type": "boolean", - "description": "True if expiration was set, false if key doesn't exist" + "description": "True if expiration was set, false if key doesn't exist", + "type": "boolean" } - } - }, - "ExplorerSupportResponse": { - "type": "object", + }, "required": [ - "supported", - "service_type", - "capabilities", - "hierarchy" + "success" ], + "type": "object" + }, + "ExplorerSupportResponse": { "properties": { "capabilities": { - "type": "array", - "items": { - "type": "string" - }, "description": "Capabilities supported by this service", "example": [ "sql" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "filter_schema": { "description": "JSON Schema for filter format with embedded UI hints (if supported)" }, "hierarchy": { - "type": "array", + "description": "Hierarchy levels (describes the navigation structure)", "items": { "$ref": "#/components/schemas/HierarchyLevel" }, - "description": "Hierarchy levels (describes the navigation structure)" + "type": "array" }, "reason": { + "description": "Reason why explorer is not supported (if applicable)", "type": [ "string", "null" - ], - "description": "Reason why explorer is not supported (if applicable)" + ] }, "service_type": { - "type": "string", "description": "Service type", - "example": "postgres" + "example": "postgres", + "type": "string" }, "supported": { - "type": "boolean", "description": "Whether the service supports query explorer functionality", - "example": true + "example": true, + "type": "boolean" } - } + }, + "required": [ + "supported", + "service_type", + "capabilities", + "hierarchy" + ], + "type": "object" }, "ExtendTimeoutBody": { - "type": "object", "properties": { "duration": { + "description": "`@vercel/sandbox`-compatible alternative — duration in milliseconds.\nUsed when `extra_secs` is absent.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "`@vercel/sandbox`-compatible alternative \u2014 duration in milliseconds.\nUsed when `extra_secs` is absent.", - "minimum": 0 + ] }, "extra_secs": { + "description": "Extra seconds to add to the existing `expires_at` (temps-native).", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Extra seconds to add to the existing `expires_at` (temps-native).", - "minimum": 0 + ] } - } + }, + "type": "object" }, "ExternalImageResponse": { - "type": "object", - "required": [ - "id", - "project_id", - "image_ref", - "pushed_at", - "created_at" - ], "properties": { "created_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "digest": { "type": [ @@ -15152,28 +15204,28 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "image_ref": { "type": "string" }, "metadata": {}, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "pushed_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "size_bytes": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "tag": { "type": [ @@ -15181,27 +15233,22 @@ "null" ] } - } - }, - "ExternalServiceBackupResponse": { - "type": "object", - "description": "Response type for external service backup", + }, "required": [ "id", - "service_id", - "backup_id", - "backup_type", - "state", - "started_at", - "s3_location", - "metadata", - "compression_type", - "created_by" + "project_id", + "image_ref", + "pushed_at", + "created_at" ], + "type": "object" + }, + "ExternalServiceBackupResponse": { + "description": "Response type for external service backup", "properties": { "backup_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "backup_type": { "type": "string" @@ -15216,8 +15263,8 @@ "type": "string" }, "created_by": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "error_message": { "type": [ @@ -15226,90 +15273,93 @@ ] }, "expires_at": { + "example": "2025-02-15T14:30:00.123Z", "type": [ "string", "null" - ], - "example": "2025-02-15T14:30:00.123Z" + ] }, "finished_at": { + "example": "2025-01-15T14:35:00.456Z", "type": [ "string", "null" - ], - "example": "2025-01-15T14:35:00.456Z" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "metadata": {}, "s3_location": { "type": "string" }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "size_bytes": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "started_at": { - "type": "string", - "example": "2025-01-15T14:30:00.123Z" + "example": "2025-01-15T14:30:00.123Z", + "type": "string" }, "state": { "type": "string" } - } - }, - "ExternalServiceDetails": { - "type": "object", + }, "required": [ - "service", - "sensitive_parameters" + "id", + "service_id", + "backup_id", + "backup_type", + "state", + "started_at", + "s3_location", + "metadata", + "compression_type", + "created_by" ], + "type": "object" + }, + "ExternalServiceDetails": { "properties": { "current_parameters": { - "type": [ - "object", - "null" - ], "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": [ + "object", + "null" + ] }, "parameter_schema": {}, "sensitive_parameters": { - "type": "array", + "description": "Parameter names whose values are masked in `current_parameters` and\nmay be fetched only through the audited reveal endpoint.", "items": { "type": "string" }, - "description": "Parameter names whose values are masked in `current_parameters` and\nmay be fetched only through the audited reveal endpoint." + "type": "array" }, "service": { "$ref": "#/components/schemas/ExternalServiceInfo" } - } - }, - "ExternalServiceInfo": { - "type": "object", + }, "required": [ - "id", - "name", - "service_type", - "status", - "created_at", - "updated_at", - "topology" + "service", + "sensitive_parameters" ], + "type": "object" + }, + "ExternalServiceInfo": { "properties": { "connection_info": { "type": [ @@ -15321,37 +15371,37 @@ "type": "string" }, "error_message": { + "description": "Error message from failed initialization.", "type": [ "string", "null" - ], - "description": "Error message from failed initialization." + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "members": { - "type": "array", + "description": "Cluster members (empty for standalone services).", "items": { "$ref": "#/components/schemas/ServiceMemberInfo" }, - "description": "Cluster members (empty for standalone services)." + "type": "array" }, "metrics_enabled": { - "type": "boolean", - "description": "Whether metric collection is enabled for this service. The UI uses this\nto decide whether to poll the monitoring endpoints." + "description": "Whether metric collection is enabled for this service. The UI uses this\nto decide whether to poll the monitoring endpoints.", + "type": "boolean" }, "name": { "type": "string" }, "node_id": { + "description": "Node ID where the service runs. Null means control plane (local).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Node ID where the service runs. Null means control plane (local)." + ] }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute" @@ -15360,9 +15410,9 @@ "type": "string" }, "topology": { - "type": "string", "description": "Service topology: \"standalone\" (single container) or \"cluster\" (HA multi-member).", - "example": "standalone" + "example": "standalone", + "type": "string" }, "updated_at": { "type": "string" @@ -15373,78 +15423,82 @@ "null" ] } - } - }, - "ExternalServiceSummary": { - "type": "object", - "description": "Summary of the external service that owns a backup. Only populated for\nexternal-service backups (Redis, Postgres, etc.); absent for control-plane\nbackups.", + }, "required": [ "id", "name", - "service_type" + "service_type", + "status", + "created_at", + "updated_at", + "topology" ], + "type": "object" + }, + "ExternalServiceSummary": { + "description": "Summary of the external service that owns a backup. Only populated for\nexternal-service backups (Redis, Postgres, etc.); absent for control-plane\nbackups.", "properties": { "id": { - "type": "integer", + "description": "Database id of the external service.", "format": "int32", - "description": "Database id of the external service." + "type": "integer" }, "name": { - "type": "string", - "description": "Human-readable service name (e.g. \"redis-prod\")." + "description": "Human-readable service name (e.g. \"redis-prod\").", + "type": "string" }, "service_type": { - "type": "string", "description": "Service type string (e.g. \"postgres\", \"redis\", \"mongodb\").", - "example": "postgres" + "example": "postgres", + "type": "string" } - } - }, - "FieldResponse": { - "type": "object", + }, "required": [ + "id", "name", - "field_type", - "nullable" + "service_type" ], + "type": "object" + }, + "FieldResponse": { "properties": { "field_type": { - "type": "string", "description": "Field type (Int32, String, Timestamp, etc.)", - "example": "Int64" + "example": "Int64", + "type": "string" }, "name": { - "type": "string", "description": "Field name", - "example": "id" + "example": "id", + "type": "string" }, "nullable": { - "type": "boolean", "description": "Whether the field is nullable", - "example": false + "example": false, + "type": "boolean" } - } + }, + "required": [ + "name", + "field_type", + "nullable" + ], + "type": "object" }, "FiringSeriesEntry": { - "type": "object", "description": "A single currently-firing series for a dynamic alert rule, snapshotted from\nthe evaluator's in-memory per-series firing map at read time (ADR-026 Phase 3).", - "required": [ - "series_key", - "series_label" - ], "properties": { "alarm_id": { + "description": "The open alarm's id, when one was created (absent if suppressed).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "The open alarm's id, when one was created (absent if suppressed)." + ] }, "series_key": { - "type": "array", + "description": "The series' label pairs, e.g. `[[\"endpoint\",\"/checkout\"],[\"region\",\"eu-west\"]]`.", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -15453,85 +15507,80 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "The series' label pairs, e.g. `[[\"endpoint\",\"/checkout\"],[\"region\",\"eu-west\"]]`." + "type": "array" }, "series_label": { - "type": "string", - "description": "The human-readable joined label, e.g. `endpoint=/checkout, region=eu-west`." + "description": "The human-readable joined label, e.g. `endpoint=/checkout, region=eu-west`.", + "type": "string" } - } - }, - "FlagEnvironmentResponse": { - "type": "object", + }, "required": [ - "environment_id", - "enabled" + "series_key", + "series_label" ], + "type": "object" + }, + "FlagEnvironmentResponse": { "properties": { "enabled": { "type": "boolean" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "value": {} - } + }, + "required": [ + "environment_id", + "enabled" + ], + "type": "object" }, "FlagListResponse": { - "type": "object", "description": "Note the absence of `salt`: it is never exposed. Publishing the bucketing\nsalt would let a client predict, and self-select into, a rollout cohort.", - "required": [ - "flags", - "total", - "page", - "page_size", - "total_pages" - ], "properties": { "flags": { - "type": "array", "items": { "$ref": "#/components/schemas/FlagResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", - "format": "int64", "description": "Total flags matching the filter, across all pages.", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "total_pages": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "FlagResponse": { - "type": "object", + }, "required": [ - "id", - "key", - "value_type", - "default_value", - "client_visible", - "created_at", - "updated_at", - "environments" + "flags", + "total", + "page", + "page_size", + "total_pages" ], + "type": "object" + }, + "FlagResponse": { "properties": { "archived_at": { "type": [ @@ -15553,25 +15602,25 @@ ] }, "environments": { - "type": "array", + "description": "Per-environment overrides. Empty means the flag inherits its default\neverywhere.", "items": { "$ref": "#/components/schemas/FlagEnvironmentResponse" }, - "description": "Per-environment overrides. Empty means the flag inherits its default\neverywhere." + "type": "array" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "key": { "type": "string" }, "last_evaluated_at": { + "description": "When an app last actually evaluated this flag. `None` means never seen,\nwhich is a real answer rather than missing data.", "type": [ "string", "null" - ], - "description": "When an app last actually evaluated this flag. `None` means never seen,\nwhich is a real answer rather than missing data." + ] }, "updated_at": { "type": "string" @@ -15579,24 +15628,28 @@ "value_type": { "type": "string" } - } - }, - "FlagSnapshot": { - "type": "object", - "description": "A single flag, already resolved down to one environment. This is what the\nevaluator sees and what the SDK caches in memory.", + }, "required": [ + "id", "key", "value_type", "default_value", - "enabled" + "client_visible", + "created_at", + "updated_at", + "environments" ], + "type": "object" + }, + "FlagSnapshot": { + "description": "A single flag, already resolved down to one environment. This is what the\nevaluator sees and what the SDK caches in memory.", "properties": { "default_value": { - "description": "Served whenever evaluation cannot do better. Genuinely polymorphic by\ndesign \u2014 the surrounding struct carries the type." + "description": "Served whenever evaluation cannot do better. Genuinely polymorphic by\ndesign — the surrounding struct carries the type." }, "enabled": { - "type": "boolean", - "description": "False means the kill switch is engaged for this environment." + "description": "False means the kill switch is engaged for this environment.", + "type": "boolean" }, "environment_value": { "description": "`None` means \"inherit `default_value`\"." @@ -15607,54 +15660,55 @@ "value_type": { "$ref": "#/components/schemas/FlagValueType" } - } - }, - "FlagSnapshotResponse": { - "type": "object", + }, "required": [ - "environment_id", - "flags" + "key", + "value_type", + "default_value", + "enabled" ], + "type": "object" + }, + "FlagSnapshotResponse": { "properties": { "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "flags": { - "type": "array", + "description": "Flags collapsed to what the evaluator needs, sorted by key so the\nserialized form — and therefore the ETag — is stable.", "items": { "$ref": "#/components/schemas/FlagSnapshot" }, - "description": "Flags collapsed to what the evaluator needs, sorted by key so the\nserialized form \u2014 and therefore the ETag \u2014 is stable." + "type": "array" } - } + }, + "required": [ + "environment_id", + "flags" + ], + "type": "object" }, "FlagValueType": { - "type": "string", "description": "The declared type of a flag's value. Fixed at create time.", "enum": [ "bool", "string", "number", "json" - ] + ], + "type": "string" }, "ForecastAlgorithm": { - "type": "string", "description": "Forecast model family.", "enum": [ "linear", "seasonal" - ] + ], + "type": "string" }, "ForecastParams": { - "type": "object", - "description": "Forecast detector parameters (stub \u2014 not yet evaluated).", - "required": [ - "forecast_horizon_secs", - "comparator", - "threshold" - ], + "description": "Forecast detector parameters (stub — not yet evaluated).", "properties": { "algorithm": { "$ref": "#/components/schemas/ForecastAlgorithm" @@ -15664,60 +15718,58 @@ "description": "Comparator + threshold the *forecast* is checked against." }, "deviations": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "forecast_horizon_secs": { - "type": "integer", + "description": "How far ahead to project before checking the breach condition.", "format": "int32", - "description": "How far ahead to project before checking the breach condition." + "type": "integer" }, "threshold": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "FullError": { - "type": "object", + }, "required": [ - "id", - "ts", - "error_group_id", - "fingerprint", - "error_class" + "forecast_horizon_secs", + "comparator", + "threshold" ], + "type": "object" + }, + "FullError": { "properties": { "data": { - "description": "Full JSONB blob from `error_events.data` \u2014 stack trace, breadcrumbs,\nrequest context, everything. Schema is documented per source SDK." + "description": "Full JSONB blob from `error_events.data` — stack trace, breadcrumbs,\nrequest context, everything. Schema is documented per source SDK." }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_class": { "type": "string" }, "error_group_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "fingerprint": { "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "message": { "type": [ @@ -15732,12 +15784,21 @@ ] }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "id", + "ts", + "error_group_id", + "fingerprint", + "error_class" + ], + "type": "object" }, "FullEvent": { + "description": "One un-truncated row, returned by the `/full/{type}/{id}` endpoint when\nthe user clicks \"Show full\". Same shape as the list rows, but with the\nraw heavy fields restored (no truncation flags) so the side panel can\nrender the long form.", "oneOf": [ { "allOf": [ @@ -15745,18 +15806,18 @@ "$ref": "#/components/schemas/FullRequest" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "request" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -15766,18 +15827,18 @@ "$ref": "#/components/schemas/FullError" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "error" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -15787,18 +15848,18 @@ "$ref": "#/components/schemas/RevenueRow" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "revenue" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -15809,35 +15870,25 @@ "description": "`SpanRow.attributes` is the truncated form; re-fetching returns\nthe same shape so the panel has a stable contract." }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "span" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ], "description": "`SpanRow.attributes` is the truncated form; re-fetching returns\nthe same shape so the panel has a stable contract." } - ], - "description": "One un-truncated row, returned by the `/full/{type}/{id}` endpoint when\nthe user clicks \"Show full\". Same shape as the list rows, but with the\nraw heavy fields restored (no truncation flags) so the side panel can\nrender the long form." + ] }, "FullRequest": { - "type": "object", - "required": [ - "id", - "ts", - "method", - "host", - "path", - "status" - ], "properties": { "client_ip": { "type": [ @@ -15846,39 +15897,39 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_group_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "host": { "type": "string" }, "id": { - "type": "string", - "description": "The request's unique `request_id` \u2014 same identity the list rows carry\n(backend-agnostic; ClickHouse rows have no serial PK)." + "description": "The request's unique `request_id` — same identity the list rows carry\n(backend-agnostic; ClickHouse rows have no serial PK).", + "type": "string" }, "latency_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "method": { "type": "string" @@ -15895,8 +15946,8 @@ "request_headers": {}, "response_headers": {}, "status": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trace_id": { "type": [ @@ -15905,8 +15956,8 @@ ] }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "user_agent": { "type": [ @@ -15914,56 +15965,57 @@ "null" ] } - } - }, - "FunnelMetricsResponse": { - "type": "object", + }, "required": [ - "funnel_id", - "funnel_name", - "total_entries", - "step_conversions", - "overall_conversion_rate", - "average_completion_time_seconds" + "id", + "ts", + "method", + "host", + "path", + "status" ], + "type": "object" + }, + "FunnelMetricsResponse": { "properties": { "average_completion_time_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "funnel_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "funnel_name": { "type": "string" }, "overall_conversion_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "step_conversions": { - "type": "array", "items": { "$ref": "#/components/schemas/StepConversionResponse" - } + }, + "type": "array" }, "total_entries": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "FunnelResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "is_active", - "created_at", - "updated_at" + "funnel_id", + "funnel_name", + "total_entries", + "step_conversions", + "overall_conversion_rate", + "average_completion_time_seconds" ], + "type": "object" + }, + "FunnelResponse": { "properties": { "created_at": { "type": "string" @@ -15975,8 +16027,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -15987,131 +16039,131 @@ "updated_at": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "is_active", + "created_at", + "updated_at" + ], + "type": "object" }, "GatewayStatus": { - "type": "object", "description": "Detailed gateway container status surfaced to the settings UI.", - "required": [ - "present", - "running", - "health", - "container_name", - "expected_image", - "drift", - "auto_upgrade" - ], "properties": { "auto_upgrade": { - "type": "boolean", - "description": "True if `auto_upgrade` is enabled in settings." + "description": "True if `auto_upgrade` is enabled in settings.", + "type": "boolean" }, "container_name": { - "type": "string", - "description": "Container name." + "description": "Container name.", + "type": "string" }, "drift": { - "type": "boolean", - "description": "True when `image != expected_image` and the container is present." + "description": "True when `image != expected_image` and the container is present.", + "type": "boolean" }, "expected_image": { - "type": "string", - "description": "The image the supervisor *expects* (from settings/constant). If this\ndiffers from `image`, the UI shows a \"drift\" badge." + "description": "The image the supervisor *expects* (from settings/constant). If this\ndiffers from `image`, the UI shows a \"drift\" badge.", + "type": "string" }, "health": { - "type": "string", - "description": "Higher-level health label: \"running\" | \"restarting\" | \"crash_looping\"\n| \"stopped\" | \"missing\". UI should prefer this over `running`." + "description": "Higher-level health label: \"running\" | \"restarting\" | \"crash_looping\"\n| \"stopped\" | \"missing\". UI should prefer this over `running`.", + "type": "string" }, "host_port": { + "description": "Host port that the container's :8080 is published on.", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Host port that the container's :8080 is published on.", - "minimum": 0 + ] }, "image": { + "description": "Image reference the container was created with (e.g.\n`ghcr.io/gotempsh/temps-preview-gateway:latest`).", "type": [ "string", "null" - ], - "description": "Image reference the container was created with (e.g.\n`ghcr.io/gotempsh/temps-preview-gateway:latest`)." + ] }, "image_digest": { + "description": "Image digest if available (e.g. `sha256:…`).", "type": [ "string", "null" - ], - "description": "Image digest if available (e.g. `sha256:\u2026`)." + ] }, "last_error": { + "description": "Error string Docker recorded for the container (e.g. startup failure).", "type": [ "string", "null" - ], - "description": "Error string Docker recorded for the container (e.g. startup failure)." + ] }, "last_exit_code": { + "description": "Exit code of the last run, if the container is not currently running.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Exit code of the last run, if the container is not currently running." + ] }, "network": { + "description": "Network the container is attached to (should be `temps-sandbox-net`).", "type": [ "string", "null" - ], - "description": "Network the container is attached to (should be `temps-sandbox-net`)." + ] }, "present": { - "type": "boolean", - "description": "Whether the container exists at all." + "description": "Whether the container exists at all.", + "type": "boolean" }, "restart_count": { + "description": "Number of times Docker has restarted the container.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Number of times Docker has restarted the container." + ] }, "running": { - "type": "boolean", - "description": "Whether the container is currently running." + "description": "Whether the container is currently running.", + "type": "boolean" }, "started_at": { + "description": "ISO 8601 timestamp the container was started at, if running.", "type": [ "string", "null" - ], - "description": "ISO 8601 timestamp the container was started at, if running." + ] } - } + }, + "required": [ + "present", + "running", + "health", + "container_name", + "expected_image", + "drift", + "auto_upgrade" + ], + "type": "object" }, "GenAiEvent": { - "type": "object", "description": "A GenAI-related event extracted from span events.\n\nCovers `gen_ai.client.inference.operation.details` and `gen_ai.evaluation.result`\nevents per the OTel GenAI semantic conventions.", - "required": [ - "span_id", - "trace_id", - "event_name", - "timestamp", - "attributes" - ], "properties": { "attributes": { - "type": "object", - "description": "All event attributes.", "additionalProperties": { "type": "string" }, + "description": "All event attributes.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "event_name": { "type": "string" @@ -16120,176 +16172,174 @@ "type": "string" }, "timestamp": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "trace_id": { "type": "string" } - } - }, - "GenAiSpanDetail": { - "type": "object", - "description": "A single GenAI span with extracted semantic convention fields.\n\nFields are aligned with the OpenTelemetry GenAI Semantic Conventions spec:\n", + }, "required": [ "span_id", - "name", - "kind", - "start_time", - "duration_ms", - "status_code", + "trace_id", + "event_name", + "timestamp", "attributes" ], + "type": "object" + }, + "GenAiSpanDetail": { + "description": "A single GenAI span with extracted semantic convention fields.\n\nFields are aligned with the OpenTelemetry GenAI Semantic Conventions spec:\n", "properties": { "agent_description": { + "description": "Agent description from `gen_ai.agent.description`.", "type": [ "string", "null" - ], - "description": "Agent description from `gen_ai.agent.description`." + ] }, "agent_id": { + "description": "Agent identifier from `gen_ai.agent.id`.", "type": [ "string", "null" - ], - "description": "Agent identifier from `gen_ai.agent.id`." + ] }, "agent_name": { + "description": "Agent name from `gen_ai.agent.name`.", "type": [ "string", "null" - ], - "description": "Agent name from `gen_ai.agent.name`." + ] }, "agent_version": { + "description": "Agent version from `gen_ai.agent.version`.", "type": [ "string", "null" - ], - "description": "Agent version from `gen_ai.agent.version`." + ] }, "attributes": { - "type": "object", - "description": "All span attributes for extensibility.", "additionalProperties": { "type": "string" }, + "description": "All span attributes for extensibility.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "aws_bedrock_guardrail_id": { + "description": "AWS Bedrock guardrail ID from `aws.bedrock.guardrail.id`.", "type": [ "string", "null" - ], - "description": "AWS Bedrock guardrail ID from `aws.bedrock.guardrail.id`." + ] }, "aws_bedrock_knowledge_base_id": { + "description": "AWS Bedrock knowledge base ID from `aws.bedrock.knowledge_base.id`.", "type": [ "string", "null" - ], - "description": "AWS Bedrock knowledge base ID from `aws.bedrock.knowledge_base.id`." + ] }, "azure_resource_provider_namespace": { + "description": "Azure resource provider namespace from `azure.resource_provider.namespace`.", "type": [ "string", "null" - ], - "description": "Azure resource provider namespace from `azure.resource_provider.namespace`." + ] }, "cache_creation_input_tokens": { + "description": "Tokens written to provider cache from `gen_ai.usage.cache_creation.input_tokens`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Tokens written to provider cache from `gen_ai.usage.cache_creation.input_tokens`." + ] }, "cache_read_input_tokens": { + "description": "Tokens served from provider cache from `gen_ai.usage.cache_read.input_tokens`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Tokens served from provider cache from `gen_ai.usage.cache_read.input_tokens`." + ] }, "conversation_id": { + "description": "Unique conversation/session/thread ID from `gen_ai.conversation.id`.", "type": [ "string", "null" - ], - "description": "Unique conversation/session/thread ID from `gen_ai.conversation.id`." + ] }, "data_source_id": { + "description": "Data source identifier from `gen_ai.data_source.id`.", "type": [ "string", "null" - ], - "description": "Data source identifier from `gen_ai.data_source.id`." + ] }, "duration_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "embeddings_dimension_count": { + "description": "Output embedding dimensions from `gen_ai.embeddings.dimension.count`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Output embedding dimensions from `gen_ai.embeddings.dimension.count`." + ] }, "error_type": { + "description": "Error type from `error.type` when the span status is ERROR.", "type": [ "string", "null" - ], - "description": "Error type from `error.type` when the span status is ERROR." + ] }, "gen_ai_model": { + "description": "The requested model from `gen_ai.request.model`.", "type": [ "string", "null" - ], - "description": "The requested model from `gen_ai.request.model`." + ] }, "gen_ai_operation": { + "description": "The operation type from `gen_ai.operation.name` (e.g. \"chat\", \"embeddings\", \"execute_tool\").", "type": [ "string", "null" - ], - "description": "The operation type from `gen_ai.operation.name` (e.g. \"chat\", \"embeddings\", \"execute_tool\")." + ] }, "gen_ai_response_model": { + "description": "The model that actually generated the response from `gen_ai.response.model`.", "type": [ "string", "null" - ], - "description": "The model that actually generated the response from `gen_ai.response.model`." + ] }, "gen_ai_system": { + "description": "The GenAI provider from `gen_ai.provider.name` (falls back to deprecated `gen_ai.system`).", "type": [ "string", "null" - ], - "description": "The GenAI provider from `gen_ai.provider.name` (falls back to deprecated `gen_ai.system`)." + ] }, "input_messages": { + "description": "Chat history input from `gen_ai.input.messages` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Chat history input from `gen_ai.input.messages` (opt-in, JSON string)." + ] }, "input_tokens": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "kind": { "$ref": "#/components/schemas/SpanKind" @@ -16298,53 +16348,53 @@ "type": "string" }, "openai_api_type": { + "description": "OpenAI API type from `openai.api.type` (chat_completions, responses).", "type": [ "string", "null" - ], - "description": "OpenAI API type from `openai.api.type` (chat_completions, responses)." + ] }, "openai_request_service_tier": { + "description": "Requested service tier from `openai.request.service_tier`.", "type": [ "string", "null" - ], - "description": "Requested service tier from `openai.request.service_tier`." + ] }, "openai_response_service_tier": { + "description": "Actual service tier from `openai.response.service_tier`.", "type": [ "string", "null" - ], - "description": "Actual service tier from `openai.response.service_tier`." + ] }, "openai_system_fingerprint": { + "description": "System fingerprint from `openai.response.system_fingerprint`.", "type": [ "string", "null" - ], - "description": "System fingerprint from `openai.response.system_fingerprint`." + ] }, "output_messages": { + "description": "Model output from `gen_ai.output.messages` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Model output from `gen_ai.output.messages` (opt-in, JSON string)." + ] }, "output_tokens": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "output_type": { + "description": "Output content type from `gen_ai.output.type` (text, json, image, speech).", "type": [ "string", "null" - ], - "description": "Output content type from `gen_ai.output.type` (text, json, image, speech)." + ] }, "parent_span_id": { "type": [ @@ -16353,299 +16403,299 @@ ] }, "request_choice_count": { + "description": "Number of choices requested from `gen_ai.request.choice.count`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Number of choices requested from `gen_ai.request.choice.count`." + ] }, "request_encoding_formats": { - "type": [ - "array", - "null" - ], + "description": "Requested encoding formats from `gen_ai.request.encoding_formats`.", "items": { "type": "string" }, - "description": "Requested encoding formats from `gen_ai.request.encoding_formats`." + "type": [ + "array", + "null" + ] }, "request_frequency_penalty": { + "description": "Frequency penalty from `gen_ai.request.frequency_penalty`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Frequency penalty from `gen_ai.request.frequency_penalty`." + ] }, "request_max_tokens": { + "description": "Max tokens from `gen_ai.request.max_tokens`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Max tokens from `gen_ai.request.max_tokens`." + ] }, "request_presence_penalty": { + "description": "Presence penalty from `gen_ai.request.presence_penalty`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Presence penalty from `gen_ai.request.presence_penalty`." + ] }, "request_seed": { + "description": "Seed for reproducibility from `gen_ai.request.seed`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Seed for reproducibility from `gen_ai.request.seed`." + ] }, "request_stop_sequences": { - "type": [ - "array", - "null" - ], + "description": "Stop sequences from `gen_ai.request.stop_sequences`.", "items": { "type": "string" }, - "description": "Stop sequences from `gen_ai.request.stop_sequences`." + "type": [ + "array", + "null" + ] }, "request_temperature": { + "description": "Temperature setting from `gen_ai.request.temperature`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Temperature setting from `gen_ai.request.temperature`." + ] }, "request_top_k": { + "description": "Top-k setting from `gen_ai.request.top_k`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Top-k setting from `gen_ai.request.top_k`." + ] }, "request_top_p": { + "description": "Top-p setting from `gen_ai.request.top_p`.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Top-p setting from `gen_ai.request.top_p`." + ] }, "response_finish_reasons": { - "type": [ - "array", - "null" - ], + "description": "Reasons the model stopped from `gen_ai.response.finish_reasons` (e.g. [\"stop\"]).", "items": { "type": "string" }, - "description": "Reasons the model stopped from `gen_ai.response.finish_reasons` (e.g. [\"stop\"])." + "type": [ + "array", + "null" + ] }, "response_id": { + "description": "Unique completion ID from `gen_ai.response.id` (e.g. \"chatcmpl-123\").", "type": [ "string", "null" - ], - "description": "Unique completion ID from `gen_ai.response.id` (e.g. \"chatcmpl-123\")." + ] }, "retrieval_documents": { + "description": "Retrieved documents from `gen_ai.retrieval.documents` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Retrieved documents from `gen_ai.retrieval.documents` (opt-in, JSON string)." + ] }, "retrieval_query_text": { + "description": "Retrieval query text from `gen_ai.retrieval.query.text` (opt-in).", "type": [ "string", "null" - ], - "description": "Retrieval query text from `gen_ai.retrieval.query.text` (opt-in)." + ] }, "server_address": { + "description": "GenAI server address from `server.address`.", "type": [ "string", "null" - ], - "description": "GenAI server address from `server.address`." + ] }, "server_port": { + "description": "GenAI server port from `server.port`.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "GenAI server port from `server.port`." + ] }, "span_id": { "type": "string" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "status_code": { "$ref": "#/components/schemas/SpanStatusCode" }, "system_instructions": { + "description": "System instructions from `gen_ai.system_instructions` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "System instructions from `gen_ai.system_instructions` (opt-in, JSON string)." + ] }, "tool_call_arguments": { + "description": "Tool call arguments from `gen_ai.tool.call.arguments` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Tool call arguments from `gen_ai.tool.call.arguments` (opt-in, JSON string)." + ] }, "tool_call_id": { + "description": "Tool call ID from `gen_ai.tool.call.id`.", "type": [ "string", "null" - ], - "description": "Tool call ID from `gen_ai.tool.call.id`." + ] }, "tool_call_result": { + "description": "Tool call result from `gen_ai.tool.call.result` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Tool call result from `gen_ai.tool.call.result` (opt-in, JSON string)." + ] }, "tool_definitions": { + "description": "Tool definitions from `gen_ai.tool.definitions` (opt-in, JSON string).", "type": [ "string", "null" - ], - "description": "Tool definitions from `gen_ai.tool.definitions` (opt-in, JSON string)." + ] }, "tool_description": { + "description": "Tool description from `gen_ai.tool.description`.", "type": [ "string", "null" - ], - "description": "Tool description from `gen_ai.tool.description`." + ] }, "tool_name": { + "description": "Tool name from `gen_ai.tool.name`.", "type": [ "string", "null" - ], - "description": "Tool name from `gen_ai.tool.name`." + ] }, "tool_type": { + "description": "Tool type from `gen_ai.tool.type` (function, extension, datastore).", "type": [ "string", "null" - ], - "description": "Tool type from `gen_ai.tool.type` (function, extension, datastore)." + ] } - } - }, - "GenAiTraceDetailResponse": { - "type": "object", + }, "required": [ - "trace_id", - "spans", - "span_count", - "events", - "event_count" + "span_id", + "name", + "kind", + "start_time", + "duration_ms", + "status_code", + "attributes" ], + "type": "object" + }, + "GenAiTraceDetailResponse": { "properties": { "event_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "events": { - "type": "array", "items": { "$ref": "#/components/schemas/GenAiEvent" - } + }, + "type": "array" }, "span_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "spans": { - "type": "array", "items": { "$ref": "#/components/schemas/GenAiSpanDetail" - } + }, + "type": "array" }, "trace_id": { "type": "string" } - } - }, - "GenAiTraceSummariesResponse": { - "type": "object", + }, "required": [ - "data", - "total" + "trace_id", + "spans", + "span_count", + "events", + "event_count" ], + "type": "object" + }, + "GenAiTraceSummariesResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/GenAiTraceSummary" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "GenAiTraceSummary": { - "type": "object", - "description": "Summary of a GenAI conversation \u2014 aggregated from OTel spans with `gen_ai.*` attributes.", + }, "required": [ - "trace_id", - "root_span_name", - "service_name", - "start_time", - "duration_ms", - "span_count", - "error_count" + "data", + "total" ], + "type": "object" + }, + "GenAiTraceSummary": { + "description": "Summary of a GenAI conversation — aggregated from OTel spans with `gen_ai.*` attributes.", "properties": { "duration_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "error_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "gen_ai_model": { + "description": "The requested model from `gen_ai.request.model`.", "type": [ "string", "null" - ], - "description": "The requested model from `gen_ai.request.model`." + ] }, "gen_ai_operation": { + "description": "The operation type from `gen_ai.operation.name` (e.g. \"chat\", \"embeddings\").", "type": [ "string", "null" - ], - "description": "The operation type from `gen_ai.operation.name` (e.g. \"chat\", \"embeddings\")." + ] }, "gen_ai_system": { + "description": "The GenAI provider (e.g. \"openai\", \"anthropic\") from `gen_ai.provider.name`.", "type": [ "string", "null" - ], - "description": "The GenAI provider (e.g. \"openai\", \"anthropic\") from `gen_ai.provider.name`." + ] }, "root_span_name": { "type": "string" @@ -16654,398 +16704,407 @@ "type": "string" }, "span_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "total_cache_creation_input_tokens": { + "description": "Total cache-creation input tokens across all spans.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total cache-creation input tokens across all spans." + ] }, "total_cache_read_input_tokens": { + "description": "Total cache-read input tokens across all spans.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total cache-read input tokens across all spans." + ] }, "total_input_tokens": { + "description": "Total input tokens across all spans in this trace.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total input tokens across all spans in this trace." + ] }, "total_output_tokens": { + "description": "Total output tokens across all spans in this trace.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total output tokens across all spans in this trace." + ] }, "trace_id": { "type": "string" } - } - }, - "GeneralStatsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date" + "trace_id", + "root_span_name", + "service_name", + "start_time", + "duration_ms", + "span_count", + "error_count" ], + "type": "object" + }, + "GeneralStatsQuery": { "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "GeneralStatsResponse": { - "type": "object", + }, "required": [ - "total_unique_visitors", - "total_visits", - "total_page_views", - "total_events", - "total_projects", - "avg_bounce_rate", - "avg_engagement_rate", - "project_breakdown" + "start_date", + "end_date" ], + "type": "object" + }, + "GeneralStatsResponse": { "properties": { "avg_bounce_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "avg_engagement_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "page_views_trend_percentage": { + "description": "Percentage change in page views vs previous period", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Percentage change in page views vs previous period" + ] }, "previous_page_views": { + "description": "Previous period page views", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Previous period page views" + ] }, "previous_unique_visitors": { + "description": "Previous period unique visitors (same duration, shifted back)", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Previous period unique visitors (same duration, shifted back)" + ] }, "project_breakdown": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectStatsBreakdown" - } + }, + "type": "array" }, "total_events": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_projects": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_unique_visitors": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_visits": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "visitors_trend_percentage": { + "description": "Percentage change in unique visitors vs previous period", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Percentage change in unique visitors vs previous period" + ] } - } + }, + "required": [ + "total_unique_visitors", + "total_visits", + "total_page_views", + "total_events", + "total_projects", + "avg_bounce_rate", + "avg_engagement_rate", + "project_breakdown" + ], + "type": "object" }, "GenerateDockerfileRequest": { - "type": "object", "description": "Request body for generating a Dockerfile from a preset", "properties": { "build_command": { + "description": "Custom build command (overrides preset default)", + "example": "npm run build", "type": [ "string", "null" - ], - "description": "Custom build command (overrides preset default)", - "example": "npm run build" + ] }, "install_command": { + "description": "Custom install command (overrides preset default)", + "example": "npm ci", "type": [ "string", "null" - ], - "description": "Custom install command (overrides preset default)", - "example": "npm ci" + ] }, "output_dir": { + "description": "Output directory for static builds", + "example": "dist", "type": [ "string", "null" - ], - "description": "Output directory for static builds", - "example": "dist" + ] }, "package_manager": { + "description": "Package manager used by the project (npm, yarn, pnpm, bun)\nIf not provided, defaults to npm", + "example": "npm", "type": [ "string", "null" - ], - "description": "Package manager used by the project (npm, yarn, pnpm, bun)\nIf not provided, defaults to npm", - "example": "npm" + ] }, "project_name": { + "description": "Project name/slug used for container naming", + "example": "my-app", "type": [ "string", "null" - ], - "description": "Project name/slug used for container naming", - "example": "my-app" + ] }, "use_buildkit": { - "type": "boolean", - "description": "Whether to use BuildKit cache mounts for faster builds" + "description": "Whether to use BuildKit cache mounts for faster builds", + "type": "boolean" } - } + }, + "type": "object" }, "GenerateDockerfileResponse": { - "type": "object", "description": "Response containing a generated Dockerfile and build arguments", - "required": [ - "dockerfile", - "build_args", - "preset" - ], "properties": { "build_args": { - "type": "object", - "description": "Build arguments to pass to `docker build --build-arg KEY=VALUE`", "additionalProperties": { "type": "string" }, + "description": "Build arguments to pass to `docker build --build-arg KEY=VALUE`", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "dockerfile": { - "type": "string", - "description": "The generated Dockerfile content" + "description": "The generated Dockerfile content", + "type": "string" }, "preset": { - "type": "string", - "description": "The preset slug used for generation" + "description": "The preset slug used for generation", + "type": "string" } - } + }, + "required": [ + "dockerfile", + "build_args", + "preset" + ], + "type": "object" }, "GenerateJoinTokenResponse": { - "type": "object", "description": "Response returned when a join token is generated (plaintext shown once)", - "required": [ - "token", - "message" - ], "properties": { "message": { "type": "string" }, "token": { - "type": "string", - "description": "The plaintext join token \u2014 shown only once, save it now" + "description": "The plaintext join token — shown only once, save it now", + "type": "string" } - } + }, + "required": [ + "token", + "message" + ], + "type": "object" }, "GeoLocationResponse": { - "type": "object", "description": "Response containing geolocation information for an IP address", - "required": [ - "ip", - "is_eu" - ], "properties": { "city": { + "description": "City name", + "example": "Mountain View", "type": [ "string", "null" - ], - "description": "City name", - "example": "Mountain View" + ] }, "country": { + "description": "Country name", + "example": "United States", "type": [ "string", "null" - ], - "description": "Country name", - "example": "United States" + ] }, "country_code": { + "description": "ISO country code (2 letters)", + "example": "US", "type": [ "string", "null" - ], - "description": "ISO country code (2 letters)", - "example": "US" + ] }, "ip": { - "type": "string", "description": "IP address that was geolocated", - "example": "8.8.8.8" + "example": "8.8.8.8", + "type": "string" }, "is_eu": { - "type": "boolean", "description": "Whether the IP is in the European Union", - "example": false + "example": false, + "type": "boolean" }, "latitude": { + "description": "Latitude coordinate", + "example": 37.386, + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Latitude coordinate", - "example": 37.386 + ] }, "longitude": { + "description": "Longitude coordinate", + "example": -122.0838, + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Longitude coordinate", - "example": -122.0838 + ] }, "region": { + "description": "Region/state name", + "example": "California", "type": [ "string", "null" - ], - "description": "Region/state name", - "example": "California" + ] }, "timezone": { + "description": "Timezone identifier", + "example": "America/Los_Angeles", "type": [ "string", "null" - ], - "description": "Timezone identifier", - "example": "America/Los_Angeles" + ] } - } + }, + "required": [ + "ip", + "is_eu" + ], + "type": "object" }, "GeoRestrictionsConfig": { - "type": "object", "description": "Geographic restrictions configuration (future feature)", "properties": { "allowedCountries": { - "type": "array", + "description": "Allow traffic only from specific countries", "items": { "type": "string" }, - "description": "Allow traffic only from specific countries" + "type": "array" }, "blockedCountries": { - "type": "array", + "description": "Block traffic from specific countries (ISO 3166-1 alpha-2 codes)", "items": { "type": "string" }, - "description": "Block traffic from specific countries (ISO 3166-1 alpha-2 codes)" + "type": "array" } - } + }, + "type": "object" }, "GetDeploymentsParams": { - "type": "object", "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "per_page": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } - } + }, + "type": "object" }, "GetEnvironmentVariablesQuery": { - "type": "object", "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "service_id": { + "description": "Required by integration-value reveals to bind the plaintext response to\nthe exact service displayed by the client.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Required by integration-value reveals to bind the plaintext response to\nthe exact service displayed by the client." + ] }, "var_id": { + "description": "Exact manual env-var row to reveal. Required by the dashboard so\nduplicate keys on disjoint environments cannot cross-reveal.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Exact manual env-var row to reveal. Required by the dashboard so\nduplicate keys on disjoint environments cannot cross-reveal." + ] } - } + }, + "type": "object" }, "GetFunnelMetricsQuery": { - "type": "object", "properties": { "country_code": { "type": [ @@ -17054,30 +17113,30 @@ ] }, "end_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "start_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } - } + }, + "type": "object" }, "GetOrCreateDSNRequest": { - "type": "object", "properties": { "base_url": { "type": [ @@ -17086,316 +17145,307 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "GetProjectSecretsQuery": { - "type": "object", "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "GetProjectSessionReplaysQuery": { - "type": "object", - "required": [ - "project_id" - ], "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "per_page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "GetProjectSessionReplaysResponse": { - "type": "object", + }, "required": [ - "sessions", - "page", - "per_page", - "total_count" + "project_id" ], + "type": "object" + }, + "GetProjectSessionReplaysResponse": { "properties": { "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "per_page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sessions": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionReplayWithVisitorDto" - } + }, + "type": "array" }, "total_count": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "sessions", + "page", + "per_page", + "total_count" + ], + "type": "object" }, "GetRequest": { - "type": "object", "description": "Request to get a value by key", - "required": [ - "key" - ], "properties": { "key": { - "type": "string", "description": "The key to retrieve", - "example": "user:123" + "example": "user:123", + "type": "string" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "key" + ], + "type": "object" }, "GetResponse": { - "type": "object", "description": "Response for get operation", "properties": { "value": { "description": "The value, or null if not found" } - } + }, + "type": "object" }, "GetSessionReplayResponse": { - "type": "object", - "required": [ - "session" - ], "properties": { "session": { "$ref": "#/components/schemas/SessionReplayWithVisitorDto" } - } + }, + "required": [ + "session" + ], + "type": "object" }, "GetUniqueEventsQuery": { - "type": "object", "properties": { "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "page_size": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } - } + }, + "type": "object" }, "GetVisitorSessionsQuery": { - "type": "object", "properties": { "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "per_page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } - } + }, + "type": "object" }, "GetVisitorSessionsResponse": { - "type": "object", - "required": [ - "sessions", - "page", - "per_page", - "total_count" - ], "properties": { "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "per_page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sessions": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionReplayWithVisitorDto" - } + }, + "type": "array" }, "total_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "sessions", + "page", + "per_page", + "total_count" + ], + "type": "object" }, "GitPushEvent": { - "type": "object", "description": "Git push event information that triggered the deployment", - "required": [ - "repo", - "owner", - "branch", - "commit" - ], "properties": { "branch": { - "type": "string", - "description": "Branch that was pushed" + "description": "Branch that was pushed", + "type": "string" }, "commit": { - "type": "string", - "description": "Commit SHA" + "description": "Commit SHA", + "type": "string" }, "owner": { - "type": "string", - "description": "Repository owner/organization" + "description": "Repository owner/organization", + "type": "string" }, "repo": { - "type": "string", - "description": "Repository name" + "description": "Repository name", + "type": "string" } - } + }, + "required": [ + "repo", + "owner", + "branch", + "commit" + ], + "type": "object" }, "GitRefResponse": { - "type": "object", "description": "Git repository reference response", - "required": [ - "url", - "ref" - ], "properties": { "path": { + "description": "Path within the repository (for monorepos)", "type": [ "string", "null" - ], - "description": "Path within the repository (for monorepos)" + ] }, "ref": { - "type": "string", - "description": "Git reference (branch, tag, or commit)" + "description": "Git reference (branch, tag, or commit)", + "type": "string" }, "url": { - "type": "string", - "description": "Git repository URL" + "description": "Git repository URL", + "type": "string" } - } + }, + "required": [ + "url", + "ref" + ], + "type": "object" }, "GitSourcePlan": { - "type": "object", "description": "Git repository the source platform deploys from", - "required": [ - "owner", - "repo", - "branch", - "is_public" - ], "properties": { "branch": { - "type": "string", - "description": "Branch the source platform deploys" + "description": "Branch the source platform deploys", + "type": "string" }, "clone_url": { + "description": "Full clone URL, e.g. `https://github.com/owner/repo.git`", "type": [ "string", "null" - ], - "description": "Full clone URL, e.g. `https://github.com/owner/repo.git`" + ] }, "is_public": { - "type": "boolean", - "description": "True when the repository is public (no credentials on the source\nplatform) \u2014 the project can then build without a git provider\nconnection." + "description": "True when the repository is public (no credentials on the source\nplatform) — the project can then build without a git provider\nconnection.", + "type": "boolean" }, "owner": { - "type": "string", - "description": "Repository owner (organization or user)" + "description": "Repository owner (organization or user)", + "type": "string" }, "repo": { - "type": "string", - "description": "Repository name" + "description": "Repository name", + "type": "string" } - } + }, + "required": [ + "owner", + "repo", + "branch", + "is_public" + ], + "type": "object" }, "GlobalConversationResponse": { - "type": "object", "description": "A conversation in the unified cross-project switcher: carries the project it\nbelongs to (name/slug) so the UI can show where the chat was started and\nlink back to the source.", - "required": [ - "public_id", - "project_id", - "context_type", - "context_id", - "status", - "created_at", - "last_activity_at" - ], "properties": { "context_id": { "type": "string" @@ -17410,8 +17460,8 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": [ @@ -17437,112 +17487,114 @@ "null" ] } - } - }, - "GlobalEventStatsResponse": { - "type": "object", + }, "required": [ - "delivered", - "opened", - "clicked", - "bounced", - "complained" + "public_id", + "project_id", + "context_type", + "context_id", + "status", + "created_at", + "last_activity_at" ], + "type": "object" + }, + "GlobalEventStatsResponse": { "properties": { "bounce_rate": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "bounced": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "click_rate": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "clicked": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "complained": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "delivered": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "open_rate": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "opened": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "GlobalMrrResponse": { - "type": "object", + }, "required": [ - "currency", - "current_mrr_minor", - "previous_mrr_minor" + "delivered", + "opened", + "clicked", + "bounced", + "complained" ], + "type": "object" + }, + "GlobalMrrResponse": { "properties": { "change_percentage": { + "description": "Percentage change vs 24h ago. Null when previous MRR is zero\n(no baseline to compare against).", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Percentage change vs 24h ago. Null when previous MRR is zero\n(no baseline to compare against)." + ] }, "currency": { "type": "string" }, "current_mrr_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "previous_mrr_minor": { - "type": "integer", + "description": "MRR 24h before now, reconstructed from the event log.", "format": "int64", - "description": "MRR 24h before now, reconstructed from the event log." + "type": "integer" } - } - }, - "GlobalRecentEventResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "project_name", - "occurred_at", - "event_type" + "currency", + "current_mrr_minor", + "previous_mrr_minor" ], + "type": "object" + }, + "GlobalRecentEventResponse": { "properties": { "amount_minor": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "currency": { "type": [ @@ -17560,458 +17612,454 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "mrr_minor": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "occurred_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" } - } - }, - "GlobalRevenueSummaryResponse": { - "type": "object", + }, "required": [ - "currency", - "current_mrr_minor", - "paid_last_30d_minor", - "refunded_last_30d_minor", - "paid_all_time_minor", - "refunded_all_time_minor", - "active_subscriptions", - "active_customers", - "transactions_last_30d" + "id", + "project_id", + "project_name", + "occurred_at", + "event_type" ], + "type": "object" + }, + "GlobalRevenueSummaryResponse": { "properties": { "active_customers": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "active_subscriptions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "currency": { "type": "string" }, "current_mrr_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "paid_all_time_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "paid_last_30d_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "refunded_all_time_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "refunded_last_30d_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "transactions_last_30d": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "GroupedPageMetric": { - "type": "object", + }, "required": [ - "group_key", - "events" + "currency", + "current_mrr_minor", + "paid_last_30d_minor", + "refunded_last_30d_minor", + "paid_all_time_minor", + "refunded_all_time_minor", + "active_subscriptions", + "active_customers", + "transactions_last_30d" ], + "type": "object" + }, + "GroupedPageMetric": { "properties": { "cls": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "country_code": { + "description": "ISO 3166-1 alpha-2 code of the group's country. Populated for the\ngeographic dimensions (country/region/city) so clients can match map\ngeometries without name-based lookups; null otherwise.", "type": [ "string", "null" - ], - "description": "ISO 3166-1 alpha-2 code of the group's country. Populated for the\ngeographic dimensions (country/region/city) so clients can match map\ngeometries without name-based lookups; null otherwise." + ] }, "events": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "fcp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "group_key": { "type": "string" }, "inp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] } - } + }, + "required": [ + "group_key", + "events" + ], + "type": "object" }, "GroupedPageMetricsQuery": { "allOf": [ { "$ref": "#/components/schemas/SpeedSegmentFilters", - "description": "Segment filters \u2014 same shape as `PerformanceMetricsQuery`." + "description": "Segment filters — same shape as `PerformanceMetricsQuery`." }, { - "type": "object", - "required": [ - "start_date", - "end_date", - "project_id", - "group_by" - ], "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "device_type": { + "description": "Device type filter: \"desktop\" or \"mobile\"", "type": [ "string", "null" - ], - "description": "Device type filter: \"desktop\" or \"mobile\"" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "group_by": { "type": "string" }, "include_bots": { + "description": "Include crawler/datacenter (bot) samples. Defaults to false.", "type": [ "boolean", "null" - ], - "description": "Include crawler/datacenter (bot) samples. Defaults to false." + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id", + "group_by" + ], + "type": "object" } ] }, "GroupedPageMetricsResponse": { - "type": "object", - "required": [ - "groups", - "total_events", - "grouped_by" - ], "properties": { "grouped_by": { "type": "string" }, "groups": { - "type": "array", "items": { "$ref": "#/components/schemas/GroupedPageMetric" - } + }, + "type": "array" }, "total_events": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "HasAnalyticsEventsResponse": { - "type": "object", + }, "required": [ - "has_events" + "groups", + "total_events", + "grouped_by" ], + "type": "object" + }, + "HasAnalyticsEventsResponse": { "properties": { "has_events": { "type": "boolean" } - } - }, - "HasErrorGroupsResponse": { - "type": "object", + }, "required": [ - "has_error_groups" + "has_events" ], + "type": "object" + }, + "HasErrorGroupsResponse": { "properties": { "has_error_groups": { "type": "boolean" } - } - }, - "HasEventsQuery": { - "type": "object", + }, "required": [ - "project_id" + "has_error_groups" ], + "type": "object" + }, + "HasEventsQuery": { "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "HasEventsResponse": { - "type": "object", + }, "required": [ - "has_events" + "project_id" ], + "type": "object" + }, + "HasEventsResponse": { "properties": { "has_events": { "type": "boolean" } - } - }, - "HasMetricsQuery": { - "type": "object", + }, "required": [ - "project_id" + "has_events" ], + "type": "object" + }, + "HasMetricsQuery": { "properties": { "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "HasMetricsResponse": { - "type": "object", + }, "required": [ - "has_metrics" + "project_id" ], + "type": "object" + }, + "HasMetricsResponse": { "properties": { "has_metrics": { "type": "boolean" } - } + }, + "required": [ + "has_metrics" + ], + "type": "object" }, "HealthCheckConfiguration": { - "type": "object", "description": "Health check configuration", - "required": [ - "port", - "interval", - "timeout", - "retries" - ], "properties": { "http_path": { + "description": "HTTP path to check (if applicable)", "type": [ "string", "null" - ], - "description": "HTTP path to check (if applicable)" + ] }, "interval": { - "type": "integer", - "format": "int32", "description": "Interval between checks (seconds)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "port": { - "type": "integer", - "format": "int32", "description": "Port to check", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "retries": { - "type": "integer", - "format": "int32", "description": "Number of retries before marking unhealthy", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "timeout": { - "type": "integer", - "format": "int32", "description": "Timeout for each check (seconds)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" } - } - }, - "HealthCheckEntryResponse": { - "type": "object", + }, "required": [ - "checked_at", - "status" + "port", + "interval", + "timeout", + "retries" ], + "type": "object" + }, + "HealthCheckEntryResponse": { "properties": { "checked_at": { - "type": "string", "description": "ISO 8601 timestamp of when the probe ran.", - "example": "2026-04-22T11:30:00Z" + "example": "2026-04-22T11:30:00Z", + "type": "string" }, "error_message": { + "description": "Present only when the probe failed or was degraded.", "type": [ "string", "null" - ], - "description": "Present only when the probe failed or was degraded." + ] }, "response_time_ms": { + "description": "TCP connect latency in milliseconds.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "TCP connect latency in milliseconds." + ] }, "status": { - "type": "string", "description": "\"operational\" | \"degraded\" | \"down\"", - "example": "operational" + "example": "operational", + "type": "string" } - } - }, - "HealthResponse": { - "type": "object", + }, "required": [ - "summaries" + "checked_at", + "status" ], + "type": "object" + }, + "HealthResponse": { "properties": { "summaries": { - "type": "array", "items": { "$ref": "#/components/schemas/HealthSummary" - } + }, + "type": "array" } - } + }, + "required": [ + "summaries" + ], + "type": "object" }, "HealthStatus": { - "type": "string", "description": "Overall health status.", "enum": [ "healthy", "degraded", "down", "unknown" - ] + ], + "type": "string" }, "HealthSummary": { - "type": "object", "description": "Pre-computed health summary for a project environment.", - "required": [ - "project_id", - "service_name", - "status", - "uptime_pct", - "error_rate", - "p95_latency_ms", - "cpu_usage_pct", - "memory_usage_pct", - "computed_at" - ], "properties": { "computed_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "cpu_usage_pct": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "last_deploy_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "last_deploy_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "memory_usage_pct": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "p95_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "service_name": { "type": "string" @@ -18020,45 +18068,52 @@ "$ref": "#/components/schemas/HealthStatus" }, "uptime_pct": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "project_id", + "service_name", + "status", + "uptime_pct", + "error_rate", + "p95_latency_ms", + "cpu_usage_pct", + "memory_usage_pct", + "computed_at" + ], + "type": "object" }, "HeartbeatApiRequest": { - "type": "object", "properties": { "architecture": { + "description": "Container platform of this node's Docker daemon (`linux/amd64`,\n`linux/arm64`), read from `docker info` by the agent. Absent from\npre-multi-arch agents; the stored value is then left untouched.", "type": [ "string", "null" - ], - "description": "Container platform of this node's Docker daemon (`linux/amd64`,\n`linux/arm64`), read from `docker info` by the agent. Absent from\npre-multi-arch agents; the stored value is then left untouched." + ] }, "capacity": { "description": "Resource capacity/usage info as JSON (cpu_usage, memory_usage, etc.)" }, "containers": { - "type": [ - "array", - "null" - ], + "description": "Container inventory for reconciliation (sent on first heartbeat after agent startup).\nEach entry has `container_id` and `container_name` of temps-managed containers.", "items": { "$ref": "#/components/schemas/ContainerInventoryItem" }, - "description": "Container inventory for reconciliation (sent on first heartbeat after agent startup).\nEach entry has `container_id` and `container_name` of temps-managed containers." + "type": [ + "array", + "null" + ] }, "labels": { "description": "Updated node labels for scheduling (allows runtime label changes)." } - } + }, + "type": "object" }, "HeartbeatResponse": { - "type": "object", - "required": [ - "status", - "message" - ], "properties": { "message": { "type": "string" @@ -18066,122 +18121,120 @@ "status": { "type": "string" } - } + }, + "required": [ + "status", + "message" + ], + "type": "object" }, "HierarchyLevel": { - "type": "object", "description": "Describes a level in the data source hierarchy", - "required": [ - "level", - "name", - "container_type", - "can_list_containers", - "can_list_entities" - ], "properties": { "can_list_containers": { - "type": "boolean", "description": "Can list containers at this level?", - "example": true + "example": true, + "type": "boolean" }, "can_list_entities": { - "type": "boolean", "description": "Can list entities at this level?", - "example": false + "example": false, + "type": "boolean" }, "container_type": { - "type": "string", "description": "Type of container at this level", - "example": "database" + "example": "database", + "type": "string" }, "level": { - "type": "integer", - "format": "int32", "description": "Level number (0 = root)", "example": 0, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "name": { - "type": "string", "description": "Human-readable name for this level", - "example": "root" + "example": "root", + "type": "string" } - } - }, - "HistogramSummary": { - "type": "object", - "description": "An explicit-bucket histogram aggregated over a time bucket.\n\nCarries the reduced scalars (count/sum/min/max) plus the explicit bucket\nlayout \u2014 `bounds` (the upper bounds) and `bucket_counts` (observation counts,\nsummed element-wise across the window; length is `bounds.len() + 1`, the last\nentry being the +Inf overflow bucket). With these, a caller can reconstruct\nany quantile (e.g. p95) via cumulative-count interpolation.", + }, "required": [ - "count", - "sum", - "bounds", - "bucket_counts" + "level", + "name", + "container_type", + "can_list_containers", + "can_list_entities" ], + "type": "object" + }, + "HistogramSummary": { + "description": "An explicit-bucket histogram aggregated over a time bucket.\n\nCarries the reduced scalars (count/sum/min/max) plus the explicit bucket\nlayout — `bounds` (the upper bounds) and `bucket_counts` (observation counts,\nsummed element-wise across the window; length is `bounds.len() + 1`, the last\nentry being the +Inf overflow bucket). With these, a caller can reconstruct\nany quantile (e.g. p95) via cumulative-count interpolation.", "properties": { "bounds": { - "type": "array", + "description": "Explicit bucket upper bounds (OTLP `explicit_bounds`), ascending.", "items": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, - "description": "Explicit bucket upper bounds (OTLP `explicit_bounds`), ascending." + "type": "array" }, "bucket_counts": { - "type": "array", + "description": "Per-bucket observation counts summed element-wise across the window.\nLength is `bounds.len() + 1` (the trailing element is the +Inf bucket).", "items": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, - "description": "Per-bucket observation counts summed element-wise across the window.\nLength is `bounds.len() + 1` (the trailing element is the +Inf bucket)." + "type": "array" }, "count": { - "type": "integer", - "format": "int64", "description": "Total observation count summed across the bucket window.", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "max": { + "description": "Maximum observed value, when reported by the producer.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Maximum observed value, when reported by the producer." + ] }, "min": { + "description": "Minimum observed value, when reported by the producer.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Minimum observed value, when reported by the producer." + ] }, "sum": { - "type": "number", + "description": "Sum of observed values across the bucket window.", "format": "double", - "description": "Sum of observed values across the bucket window." + "type": "number" } - } + }, + "required": [ + "count", + "sum", + "bounds", + "bucket_counts" + ], + "type": "object" }, "HostnameChange": { - "type": "object", "description": "A single generated-hostname change in a flatten preview/apply.", - "required": [ - "kind", - "id", - "old", - "new" - ], "properties": { "id": { - "type": "integer", + "description": "Row id of the affected record.", "format": "int32", - "description": "Row id of the affected record." + "type": "integer" }, "kind": { - "type": "string", - "description": "`\"deployment\"` or `\"environment\"`." + "description": "`\"deployment\"` or `\"environment\"`.", + "type": "string" }, "new": { "type": "string" @@ -18189,104 +18242,104 @@ "old": { "type": "string" } - } + }, + "required": [ + "kind", + "id", + "old", + "new" + ], + "type": "object" }, "HostnamePreviewResponse": { - "type": "object", "description": "Combined preview of a hostname-mode change.", - "required": [ - "hostname_changes", - "dns_changes", - "total" - ], "properties": { "dns_changes": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsRecordChange" - } + }, + "type": "array" }, "hostname_changes": { - "type": "array", "items": { "$ref": "#/components/schemas/HostnameChange" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "zone_access_ok": { + "description": "Whether the provider token can manage this zone (None if not checked).", "type": [ "boolean", "null" - ], - "description": "Whether the provider token can manage this zone (None if not checked)." + ] } - } - }, - "HourlyPageSessions": { - "type": "object", + }, "required": [ - "timestamp", - "session_count", - "event_count", - "avg_duration_seconds" + "hostname_changes", + "dns_changes", + "total" ], + "type": "object" + }, + "HourlyPageSessions": { "properties": { "avg_duration_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "event_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "session_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "timestamp": { "type": "string" } - } - }, - "HourlyVisitsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date" + "timestamp", + "session_count", + "event_count", + "avg_duration_seconds" ], + "type": "object" + }, + "HourlyVisitsQuery": { "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level: events (page views), sessions (unique sessions), or visitors (unique visitors)" }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "HttpChallengeDebugResponse": { - "type": "object", + }, "required": [ - "domain", - "challenge_exists", - "dns_a_records", - "dns_aaaa_records" + "start_date", + "end_date" ], + "type": "object" + }, + "HttpChallengeDebugResponse": { "properties": { "challenge_exists": { "type": "boolean" @@ -18298,192 +18351,188 @@ ] }, "challenge_url": { + "description": "The full URL that Let's Encrypt will try to access to validate the challenge", "type": [ "string", "null" - ], - "description": "The full URL that Let's Encrypt will try to access to validate the challenge" + ] }, "dns_a_records": { - "type": "array", + "description": "IPv4 addresses the domain points to", "items": { "type": "string" }, - "description": "IPv4 addresses the domain points to" + "type": "array" }, "dns_aaaa_records": { - "type": "array", + "description": "IPv6 addresses the domain points to", "items": { "type": "string" }, - "description": "IPv6 addresses the domain points to" + "type": "array" }, "dns_error": { + "description": "Any DNS resolution errors", "type": [ "string", "null" - ], - "description": "Any DNS resolution errors" + ] }, "domain": { "type": "string" }, "validation_url": { + "description": "The ACME validation URL (internal to ACME protocol)", "type": [ "string", "null" - ], - "description": "The ACME validation URL (internal to ACME protocol)" + ] } - } + }, + "required": [ + "domain", + "challenge_exists", + "dns_a_records", + "dns_aaaa_records" + ], + "type": "object" }, "ImportCredentials": { - "type": "object", "description": "Platform-specific credentials for accessing the source system.\n\nFor platforms like Vercel and Railway, this contains the API token.\nFor self-hosted platforms like Coolify and Dokploy, this also contains\nthe `base_url` of the instance.\n\nLocal importers (Docker) can use `ImportCredentials::none()`.", "properties": { "base_url": { + "description": "Base URL override (for self-hosted platforms like Coolify, Dokploy)\n\nExample: `https://coolify.example.com`", "type": [ "string", "null" - ], - "description": "Base URL override (for self-hosted platforms like Coolify, Dokploy)\n\nExample: `https://coolify.example.com`" + ] }, "extra": { - "type": "object", - "description": "Additional platform-specific parameters", "additionalProperties": { "type": "string" }, + "description": "Additional platform-specific parameters", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "team_id": { + "description": "Team or organization ID (for platforms with team scoping like Vercel)", "type": [ "string", "null" - ], - "description": "Team or organization ID (for platforms with team scoping like Vercel)" + ] }, "token": { + "description": "API token / bearer token for the source platform", "type": [ "string", "null" - ], - "description": "API token / bearer token for the source platform" + ] } - } + }, + "type": "object" }, "ImportExecutionStatus": { - "type": "string", "description": "Import execution status", "enum": [ "pending", "inprogress", "completed", "failed" - ] + ], + "type": "string" }, "ImportExternalServiceRequest": { - "type": "object", "description": "Request to import a Docker container as a managed service", - "required": [ - "name", - "service_type", - "parameters", - "container_id" - ], "properties": { "container_id": { - "type": "string", "description": "Container ID or name to import", - "example": "abc123def456" + "example": "abc123def456", + "type": "string" }, "name": { - "type": "string", "description": "Name to register the service as in Temps", - "example": "production-database" + "example": "production-database", + "type": "string" }, "parameters": { - "type": "object", - "description": "Service configuration parameters", "additionalProperties": {}, + "description": "Service configuration parameters", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute", "description": "Service type" }, "version": { + "description": "Optional version override", "type": [ "string", "null" - ], - "description": "Optional version override" + ] } - } - }, - "ImportOutcomeResponse": { - "type": "object", + }, "required": [ - "rows_read", - "inserted", - "updated", - "skipped_stale", - "skipped_invalid", - "errors" + "name", + "service_type", + "parameters", + "container_id" ], + "type": "object" + }, + "ImportOutcomeResponse": { "properties": { "errors": { - "type": "array", "items": { "$ref": "#/components/schemas/ImportRowErrorResponse" - } + }, + "type": "array" }, "inserted": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "rows_read": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "skipped_invalid": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "skipped_stale": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "updated": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "rows_read", + "inserted", + "updated", + "skipped_stale", + "skipped_invalid", + "errors" + ], + "type": "object" }, "ImportPlan": { - "type": "object", "description": "Complete import plan describing all operations to onboard a workload.\n\nThe plan is generated from a snapshot and presented to the user for review\nbefore any resources are created. Users can modify individual items\n(skip services, change actions) before approving execution.", - "required": [ - "version", - "source", - "source_id", - "project", - "environment", - "deployment", - "summary", - "metadata" - ], "properties": { "additional_deployments": { - "type": "array", + "description": "Additional deployments (workers, cron jobs, etc.)", "items": { "$ref": "#/components/schemas/DeploymentConfiguration" }, - "description": "Additional deployments (workers, cron jobs, etc.)" + "type": "array" }, "cost_analysis": { "oneOf": [ @@ -18501,11 +18550,11 @@ "description": "Primary deployment configuration" }, "domains": { - "type": "array", + "description": "Custom domains to migrate", "items": { "$ref": "#/components/schemas/DomainPlan" }, - "description": "Custom domains to migrate" + "type": "array" }, "environment": { "$ref": "#/components/schemas/EnvironmentConfiguration", @@ -18520,109 +18569,119 @@ "description": "Project configuration" }, "services": { - "type": "array", + "description": "Services to migrate (databases, caches, blob stores)\n\nEach service has an `action` field the user can change before execution.", "items": { "$ref": "#/components/schemas/ServicePlan" }, - "description": "Services to migrate (databases, caches, blob stores)\n\nEach service has an `action` field the user can change before execution." + "type": "array" }, "source": { - "type": "string", - "description": "Source system this plan was generated from" + "description": "Source system this plan was generated from", + "type": "string" }, "source_id": { - "type": "string", - "description": "Source workload / project ID in the source system" + "description": "Source workload / project ID in the source system", + "type": "string" }, "steps": { - "type": "array", + "description": "Ordered list of migration steps that will be executed.\n\nThis is the human-readable execution plan. Each step describes what\nwill happen, what risks are involved, and what the user should verify.\nSteps are executed in order. If a step fails, execution stops and\nalready-created resources are reported for manual cleanup.", "items": { "$ref": "#/components/schemas/MigrationStep" }, - "description": "Ordered list of migration steps that will be executed.\n\nThis is the human-readable execution plan. Each step describes what\nwill happen, what risks are involved, and what the user should verify.\nSteps are executed in order. If a step fails, execution stops and\nalready-created resources are reported for manual cleanup." + "type": "array" }, "summary": { "$ref": "#/components/schemas/MigrationSummary", "description": "Human-readable summary of the entire migration" }, "version": { - "type": "string", - "description": "Plan version for compatibility tracking" + "description": "Plan version for compatibility tracking", + "type": "string" } - } - }, - "ImportRowErrorResponse": { - "type": "object", + }, "required": [ - "row", - "reason" + "version", + "source", + "source_id", + "project", + "environment", + "deployment", + "summary", + "metadata" ], + "type": "object" + }, + "ImportRowErrorResponse": { "properties": { "reason": { "type": "string" }, "row": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "row", + "reason" + ], + "type": "object" }, "ImportSelector": { - "type": "object", "description": "Selector for discovering workloads", "properties": { "label_filter": { - "type": [ - "object", - "null" - ], - "description": "Filter by labels/tags", "additionalProperties": { "type": "string" }, + "description": "Filter by labels/tags", "propertyNames": { "type": "string" - } + }, + "type": [ + "object", + "null" + ] }, "limit": { + "description": "Limit number of results", + "minimum": 0, "type": [ "integer", "null" - ], - "description": "Limit number of results", - "minimum": 0 + ] }, "name_pattern": { + "description": "Filter by name pattern (glob/regex)", "type": [ "string", "null" - ], - "description": "Filter by name pattern (glob/regex)" + ] }, "status_filter": { - "type": [ - "array", - "null" - ], + "description": "Filter by status (running, stopped, deployed, etc.)", "items": { "type": "string" }, - "description": "Filter by status (running, stopped, deployed, etc.)" - }, - "workload_type_filter": { "type": [ "array", "null" - ], + ] + }, + "workload_type_filter": { + "description": "Filter by workload type (container, function, static-site, etc.)", "items": { "type": "string" }, - "description": "Filter by workload type (container, function, static-site, etc.)" + "type": [ + "array", + "null" + ] } - } + }, + "type": "object" }, "ImportSource": { - "type": "string", "description": "Import source identifier", "enum": [ "docker", @@ -18638,38 +18697,26 @@ "portainer", "kamal", "custom" - ] + ], + "type": "string" }, "ImportSourceCapabilities": { - "type": "object", "description": "Source capabilities", - "required": [ - "supports_volumes", - "supports_networks", - "supports_health_checks", - "supports_resource_limits", - "supports_build", - "supports_services", - "supports_domains", - "supports_project_snapshot", - "supports_cost_analysis", - "requires_credentials" - ], "properties": { "requires_credentials": { - "type": "boolean", - "description": "Whether this source requires API credentials (token, base URL)" + "description": "Whether this source requires API credentials (token, base URL)", + "type": "boolean" }, "supports_build": { "type": "boolean" }, "supports_cost_analysis": { - "type": "boolean", - "description": "Supports cluster cost + overprovisioning analysis in the plan" + "description": "Supports cluster cost + overprovisioning analysis in the plan", + "type": "boolean" }, "supports_domains": { - "type": "boolean", - "description": "Supports custom domain migration" + "description": "Supports custom domain migration", + "type": "boolean" }, "supports_health_checks": { "type": "boolean" @@ -18678,93 +18725,97 @@ "type": "boolean" }, "supports_project_snapshot": { - "type": "boolean", - "description": "Supports full project-level snapshots" + "description": "Supports full project-level snapshots", + "type": "boolean" }, "supports_resource_limits": { "type": "boolean" }, "supports_services": { - "type": "boolean", - "description": "Supports service migration (databases, caches, etc.)" + "description": "Supports service migration (databases, caches, etc.)", + "type": "boolean" }, "supports_volumes": { "type": "boolean" } - } + }, + "required": [ + "supports_volumes", + "supports_networks", + "supports_health_checks", + "supports_resource_limits", + "supports_build", + "supports_services", + "supports_domains", + "supports_project_snapshot", + "supports_cost_analysis", + "requires_credentials" + ], + "type": "object" }, "ImportSourceInfo": { - "type": "object", "description": "Information about an import source", - "required": [ - "source", - "name", - "version", - "available", - "capabilities" - ], "properties": { "available": { - "type": "boolean", - "description": "Whether the source is currently available" + "description": "Whether the source is currently available", + "type": "boolean" }, "capabilities": { "$ref": "#/components/schemas/ImportSourceCapabilities", "description": "Capabilities" }, "name": { - "type": "string", - "description": "Human-readable name" + "description": "Human-readable name", + "type": "string" }, "source": { "$ref": "#/components/schemas/ImportSource", "description": "Source identifier" }, "version": { - "type": "string", - "description": "Source version" + "description": "Source version", + "type": "string" } - } + }, + "required": [ + "source", + "name", + "version", + "available", + "capabilities" + ], + "type": "object" }, "ImportStatusResponse": { - "type": "object", "description": "Response with import status", - "required": [ - "session_id", - "status", - "errors", - "warnings", - "created_at", - "updated_at" - ], "properties": { "created_at": { - "type": "string", + "description": "Created at timestamp", "format": "date-time", - "description": "Created at timestamp" + "type": "string" }, "deployment_id": { + "description": "Created deployment ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created deployment ID" + ] }, "environment_id": { + "description": "Created environment ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created environment ID" + ] }, "errors": { - "type": "array", + "description": "Errors (if any)", "items": { "type": "string" }, - "description": "Errors (if any)" + "type": "array" }, "plan": { "oneOf": [ @@ -18778,25 +18829,25 @@ ] }, "project_id": { + "description": "Created project ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Created project ID" + ] }, "session_id": { - "type": "string", - "description": "Session ID" + "description": "Session ID", + "type": "string" }, "status": { "$ref": "#/components/schemas/ImportExecutionStatus", "description": "Current status" }, "updated_at": { - "type": "string", + "description": "Updated at timestamp", "format": "date-time", - "description": "Updated at timestamp" + "type": "string" }, "validation": { "oneOf": [ @@ -18810,109 +18861,107 @@ ] }, "warnings": { - "type": "array", + "description": "Warnings (if any)", "items": { "type": "string" }, - "description": "Warnings (if any)" + "type": "array" } - } - }, - "IncidentBucket": { - "type": "object", + }, "required": [ - "bucket_start", - "total_incidents", - "minor_incidents", - "major_incidents", - "critical_incidents", - "resolved_incidents", - "active_incidents" + "session_id", + "status", + "errors", + "warnings", + "created_at", + "updated_at" ], + "type": "object" + }, + "IncidentBucket": { "properties": { "active_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "avg_resolution_time_minutes": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "bucket_start": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "critical_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "major_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "minor_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "resolved_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_incidents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "IncidentBucketedResponse": { - "type": "object", + }, "required": [ - "project_id", - "interval", - "buckets" + "bucket_start", + "total_incidents", + "minor_incidents", + "major_incidents", + "critical_incidents", + "resolved_incidents", + "active_incidents" ], + "type": "object" + }, + "IncidentBucketedResponse": { "properties": { "buckets": { - "type": "array", "items": { "$ref": "#/components/schemas/IncidentBucket" - } + }, + "type": "array" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "interval": { "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "IncidentResponse": { - "type": "object", + }, "required": [ - "id", "project_id", - "title", - "severity", - "status", - "started_at", - "created_at", - "updated_at" + "interval", + "buckets" ], + "type": "object" + }, + "IncidentResponse": { "properties": { "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "description": { "type": [ @@ -18921,40 +18970,40 @@ ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "monitor_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "resolved_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "severity": { "type": "string" }, "started_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "status": { "type": "string" @@ -18963,32 +19012,35 @@ "type": "string" }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "IncidentUpdateResponse": { - "type": "object", + }, "required": [ "id", - "incident_id", + "project_id", + "title", + "severity", "status", - "message", - "created_at" + "started_at", + "created_at", + "updated_at" ], + "type": "object" + }, + "IncidentUpdateResponse": { "properties": { "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "incident_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -18996,60 +19048,63 @@ "status": { "type": "string" } - } + }, + "required": [ + "id", + "incident_id", + "status", + "message", + "created_at" + ], + "type": "object" }, "IncrRequest": { - "type": "object", "description": "Request to increment a value", - "required": [ - "key" - ], "properties": { "amount": { + "description": "Amount to increment by (default: 1)", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Amount to increment by (default: 1)" + ] }, "key": { - "type": "string", "description": "The key to increment", - "example": "counter" + "example": "counter", + "type": "string" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "key" + ], + "type": "object" }, "IncrResponse": { - "type": "object", "description": "Response for increment operation", - "required": [ - "value" - ], "properties": { "value": { - "type": "integer", - "format": "int64", "description": "New value after increment", - "example": 42 + "example": 42, + "format": "int64", + "type": "integer" } - } - }, - "InitAuthResponse": { - "type": "object", + }, "required": [ - "auth_url", - "session_token" + "value" ], + "type": "object" + }, + "InitAuthResponse": { "properties": { "auth_url": { "type": "string" @@ -19057,42 +19112,33 @@ "session_token": { "type": "string" } - } + }, + "required": [ + "auth_url", + "session_token" + ], + "type": "object" }, "Insight": { - "type": "object", "description": "An anomaly insight.", - "required": [ - "id", - "project_id", - "service_name", - "severity", - "status", - "title", - "description", - "anomaly_ids", - "started_at", - "created_at", - "updated_at" - ], "properties": { "anomaly_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int64" - } + "format": "int64", + "type": "integer" + }, + "type": "array" }, "correlated_deploy_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "description": { "type": "string" @@ -19104,8 +19150,8 @@ ] }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "metric_name": { "type": [ @@ -19114,15 +19160,15 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "resolved_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "service_name": { "type": "string" @@ -19131,8 +19177,8 @@ "$ref": "#/components/schemas/InsightSeverity" }, "started_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "status": { "$ref": "#/components/schemas/InsightStatus" @@ -19141,60 +19187,63 @@ "type": "string" }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "service_name", + "severity", + "status", + "title", + "description", + "anomaly_ids", + "started_at", + "created_at", + "updated_at" + ], + "type": "object" }, "InsightSeverity": { - "type": "string", "description": "Severity of an anomaly insight.", "enum": [ "low", "medium", "high", "critical" - ] + ], + "type": "string" }, "InsightStatus": { - "type": "string", "description": "Status of an insight.", "enum": [ "active", "resolved" - ] + ], + "type": "string" }, "InsightsResponse": { - "type": "object", - "required": [ - "data", - "count" - ], "properties": { "count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "data": { - "type": "array", "items": { "$ref": "#/components/schemas/Insight" - } + }, + "type": "array" } - } - }, - "IntegrationResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "provider", - "webhook_path_token", - "webhook_path", - "status", - "has_secret", - "created_at" + "data", + "count" ], + "type": "object" + }, + "IntegrationResponse": { "properties": { "config": { "oneOf": [ @@ -19203,31 +19252,31 @@ }, { "$ref": "#/components/schemas/ProviderConfig", - "description": "Typed provider config \u2014 allowlist and metered-billing mode. Null\nwhen the operator hasn't configured one yet (accept everything)." + "description": "Typed provider config — allowlist and metered-billing mode. Null\nwhen the operator hasn't configured one yet (accept everything)." } ] }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "has_secret": { "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_event_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "provider": { "type": "string" @@ -19236,56 +19285,59 @@ "type": "string" }, "webhook_path": { - "type": "string", - "description": "Relative path the UI can display and copy. The frontend builds\nthe full URL by prefixing its own origin." + "description": "Relative path the UI can display and copy. The frontend builds\nthe full URL by prefixing its own origin.", + "type": "string" }, "webhook_path_token": { - "type": "string", - "description": "Unguessable token embedded in the public webhook URL. The full\nURL is `{api_origin}/webhooks/revenue/{provider}/{webhook_path_token}`." + "description": "Unguessable token embedded in the public webhook URL. The full\nURL is `{api_origin}/webhooks/revenue/{provider}/{webhook_path_token}`.", + "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "provider", + "webhook_path_token", + "webhook_path", + "status", + "has_secret", + "created_at" + ], + "type": "object" }, "IpAccessControlQuery": { - "type": "object", "description": "Query parameters for listing IP access control rules", "properties": { "action": { + "description": "Filter by action (\"block\" or \"allow\")", "type": [ "string", "null" - ], - "description": "Filter by action (\"block\" or \"allow\")" + ] } - } + }, + "type": "object" }, "IpAccessControlResponse": { - "type": "object", "description": "Response model for IP access control rules", - "required": [ - "id", - "ip_address", - "action", - "created_at", - "updated_at" - ], "properties": { "action": { "type": "string" }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609Z" + "example": "2025-10-12T12:15:47.609Z", + "type": "string" }, "created_by": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_address": { "type": "string" @@ -19297,26 +19349,28 @@ ] }, "updated_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609Z" + "example": "2025-10-12T12:15:47.609Z", + "type": "string" } - } + }, + "required": [ + "id", + "ip_address", + "action", + "created_at", + "updated_at" + ], + "type": "object" }, "JobStatusResponse": { - "type": "object", "description": "Snapshot of a background job. `status` is one of \"running\" | \"exited\"\n| \"failed\"; `exit_code` is populated only when `status == \"exited\"`.", - "required": [ - "status", - "stdout", - "stderr" - ], "properties": { "exit_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "reason": { "type": [ @@ -19333,27 +19387,26 @@ "stdout": { "type": "string" } - } - }, - "JobSummaryResponse": { - "type": "object", - "description": "Row in the jobs list. Omits stdout/stderr so a noisy dev server doesn't\nbloat the list payload \u2014 callers drill into `GET /jobs/{id}` for the\nfull buffer.", + }, "required": [ - "id", "status", - "cmd", - "started_at" + "stdout", + "stderr" ], + "type": "object" + }, + "JobSummaryResponse": { + "description": "Row in the jobs list. Omits stdout/stderr so a noisy dev server doesn't\nbloat the list payload — callers drill into `GET /jobs/{id}` for the\nfull buffer.", "properties": { "cmd": { "type": "string" }, "exit_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { "type": "string" @@ -19370,700 +19423,706 @@ "status": { "type": "string" } - } + }, + "required": [ + "id", + "status", + "cmd", + "started_at" + ], + "type": "object" }, "JoinTokenStatusResponse": { - "type": "object", "description": "Response for join token status check", - "required": [ - "has_token" - ], "properties": { "has_token": { - "type": "boolean", - "description": "Whether a join token has been configured" + "description": "Whether a join token has been configured", + "type": "boolean" } - } + }, + "required": [ + "has_token" + ], + "type": "object" }, "JourneyEvent": { - "type": "object", "description": "A single event in the visitor journey timeline", - "required": [ - "id", - "event_type", - "event_name", - "occurred_at", - "is_entry", - "is_exit", - "is_bounce" - ], "properties": { "event_data": { "description": "Custom event properties (for custom events)" }, "event_name": { - "type": "string", - "description": "Resolved event name (event_name for custom events, event_type for system events)" + "description": "Resolved event name (event_name for custom events, event_type for system events)", + "type": "string" }, "event_type": { - "type": "string", - "description": "Event type: \"page_view\", \"page_leave\", \"custom\", \"web_vitals\"" + "description": "Event type: \"page_view\", \"page_leave\", \"custom\", \"web_vitals\"", + "type": "string" }, "id": { - "type": "integer", + "description": "Event ID", "format": "int64", - "description": "Event ID" + "type": "integer" }, "is_bounce": { - "type": "boolean", - "description": "Whether this was a bounce" + "description": "Whether this was a bounce", + "type": "boolean" }, "is_entry": { - "type": "boolean", - "description": "Whether this is the entry page of the session" + "description": "Whether this is the entry page of the session", + "type": "boolean" }, "is_exit": { - "type": "boolean", - "description": "Whether this is the exit page of the session" + "description": "Whether this is the exit page of the session", + "type": "boolean" }, "occurred_at": { - "type": "string", + "description": "When the event occurred", "format": "date-time", - "description": "When the event occurred" + "type": "string" }, "page_path": { + "description": "Page path where the event happened", "type": [ "string", "null" - ], - "description": "Page path where the event happened" + ] }, "page_title": { + "description": "Page title (if available)", "type": [ "string", "null" - ], - "description": "Page title (if available)" + ] }, "referrer": { + "description": "Referrer URL for this event", "type": [ "string", "null" - ], - "description": "Referrer URL for this event" + ] }, "scroll_depth": { + "description": "Scroll depth percentage (0-100)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Scroll depth percentage (0-100)" + ] }, "session_page_number": { + "description": "Page number within the session (1-indexed)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Page number within the session (1-indexed)" + ] }, "time_on_page": { + "description": "Time spent on page in seconds (computed, not from column)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Time spent on page in seconds (computed, not from column)" + ] } - } + }, + "required": [ + "id", + "event_type", + "event_name", + "occurred_at", + "is_entry", + "is_exit", + "is_bounce" + ], + "type": "object" }, "JourneySession": { - "type": "object", "description": "A session within the visitor journey, grouping events", - "required": [ - "session_id", - "started_at", - "duration_seconds", - "page_views", - "events_count", - "is_bounced", - "is_engaged", - "events" - ], "properties": { "channel": { + "description": "Traffic source: channel (e.g. \"organic\", \"direct\", \"social\")", "type": [ "string", "null" - ], - "description": "Traffic source: channel (e.g. \"organic\", \"direct\", \"social\")" + ] }, "duration_seconds": { - "type": "integer", + "description": "Session duration in seconds", "format": "int64", - "description": "Session duration in seconds" + "type": "integer" }, "ended_at": { + "description": "When the session ended", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "When the session ended" + ] }, "entry_path": { + "description": "Entry page path", "type": [ "string", "null" - ], - "description": "Entry page path" + ] }, "events": { - "type": "array", + "description": "Events within this session, ordered chronologically", "items": { "$ref": "#/components/schemas/JourneyEvent" }, - "description": "Events within this session, ordered chronologically" + "type": "array" }, "events_count": { - "type": "integer", + "description": "Total events in this session", "format": "int64", - "description": "Total events in this session" + "type": "integer" }, "exit_path": { + "description": "Exit page path", "type": [ "string", "null" - ], - "description": "Exit page path" + ] }, "is_bounced": { - "type": "boolean", - "description": "Whether the session was a bounce" + "description": "Whether the session was a bounce", + "type": "boolean" }, "is_engaged": { - "type": "boolean", - "description": "Whether the visitor was engaged (had non-pageview events)" + "description": "Whether the visitor was engaged (had non-pageview events)", + "type": "boolean" }, "page_views": { - "type": "integer", + "description": "Number of page views in this session", "format": "int64", - "description": "Number of page views in this session" + "type": "integer" }, "referrer": { + "description": "Traffic source: referrer URL", "type": [ "string", "null" - ], - "description": "Traffic source: referrer URL" + ] }, "referrer_hostname": { + "description": "Traffic source: referrer hostname", "type": [ "string", "null" - ], - "description": "Traffic source: referrer hostname" + ] }, "session_id": { - "type": "integer", + "description": "Session internal ID", "format": "int32", - "description": "Session internal ID" + "type": "integer" }, "started_at": { - "type": "string", + "description": "When the session started", "format": "date-time", - "description": "When the session started" + "type": "string" }, "utm_campaign": { + "description": "UTM campaign parameter", "type": [ "string", "null" - ], - "description": "UTM campaign parameter" + ] }, "utm_medium": { + "description": "UTM medium parameter", "type": [ "string", "null" - ], - "description": "UTM medium parameter" + ] }, "utm_source": { + "description": "UTM source parameter", "type": [ "string", "null" - ], - "description": "UTM source parameter" + ] } - } + }, + "required": [ + "session_id", + "started_at", + "duration_seconds", + "page_views", + "events_count", + "is_bounced", + "is_engaged", + "events" + ], + "type": "object" }, "KeysRequest": { - "type": "object", "description": "Request to get keys matching a pattern", - "required": [ - "pattern" - ], "properties": { "pattern": { - "type": "string", "description": "Pattern to match (supports * and ? wildcards)", - "example": "user:*" + "example": "user:*", + "type": "string" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "pattern" + ], + "type": "object" }, "KeysResponse": { - "type": "object", "description": "Response for keys operation", - "required": [ - "keys" - ], "properties": { "keys": { - "type": "array", - "items": { - "type": "string" - }, "description": "List of matching keys", "example": [ "user:1", "user:2", "user:3" - ] + ], + "items": { + "type": "string" + }, + "type": "array" } - } + }, + "required": [ + "keys" + ], + "type": "object" }, "KillJobBody": { - "type": "object", + "additionalProperties": false, "properties": { "force": { - "type": "boolean", - "description": "When true, sends SIGKILL immediately. Defaults to SIGTERM so the\nprocess gets a chance to flush (mirrors `Command.kill()` in\n`@vercel/sandbox`, which also accepts a signal override)." + "description": "When true, sends SIGKILL immediately. Defaults to SIGTERM so the\nprocess gets a chance to flush (mirrors `Command.kill()` in\n`@vercel/sandbox`, which also accepts a signal override).", + "type": "boolean" } }, - "additionalProperties": false + "type": "object" }, "KnownAiAgentsResponse": { - "type": "object", "description": "Response listing every AI agent the detector knows about.", - "required": [ - "items" - ], "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AiAgentDescriptor" - } + }, + "type": "array" } - } + }, + "required": [ + "items" + ], + "type": "object" }, "KvStatusResponse": { - "type": "object", "description": "Response for KV service status", - "required": [ - "enabled", - "healthy" - ], "properties": { "docker_image": { + "description": "Docker image being used", + "example": "gotempsh/redis-walg:8-bookworm", "type": [ "string", "null" - ], - "description": "Docker image being used", - "example": "gotempsh/redis-walg:8-bookworm" + ] }, "enabled": { - "type": "boolean", - "description": "Whether the KV service is enabled" + "description": "Whether the KV service is enabled", + "type": "boolean" }, "healthy": { - "type": "boolean", - "description": "Whether the underlying Redis service is healthy" + "description": "Whether the underlying Redis service is healthy", + "type": "boolean" }, "version": { + "description": "Service version", + "example": "7.2", "type": [ "string", "null" - ], - "description": "Service version", - "example": "7.2" + ] } - } + }, + "required": [ + "enabled", + "healthy" + ], + "type": "object" }, "LemonSqueezyConfig": { - "type": "object", "properties": { "product_allowlist": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "variant_allowlist": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } + }, + "type": "object" }, "LetsEncryptSettings": { - "type": "object", "properties": { "email": { + "default": null, "type": [ "string", "null" - ], - "default": null + ] }, "environment": { - "type": "string", - "default": "production" + "default": "production", + "type": "string" } - } + }, + "type": "object" }, "LineContext": { - "type": "object", "description": "Raw surrounding lines for a single match (grep -C style).", - "required": [ - "before", - "after" - ], "properties": { "after": { - "type": "array", + "description": "Lines immediately after the match, oldest-first.", "items": { "$ref": "#/components/schemas/ContextLine" }, - "description": "Lines immediately after the match, oldest-first." + "type": "array" }, "before": { - "type": "array", + "description": "Lines immediately before the match, oldest-first.", "items": { "$ref": "#/components/schemas/ContextLine" }, - "description": "Lines immediately before the match, oldest-first." + "type": "array" } - } - }, - "LinkServiceRequest": { - "type": "object", + }, "required": [ - "project_id" + "before", + "after" ], + "type": "object" + }, + "LinkServiceRequest": { "properties": { "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "ListAgentsResponse": { - "type": "object", + }, "required": [ - "items", - "total" + "project_id" ], + "type": "object" + }, + "ListAgentsResponse": { "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AgentConfigResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "items", + "total" + ], + "type": "object" }, "ListApiKeysQuery": { - "type": "object", "properties": { "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "page_size": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } - } + }, + "type": "object" }, "ListAuditLogsQuery": { - "type": "object", - "description": "Query parameters for listing audit logs.\n\nEvery field is optional \u2014 omitting one means \"don't filter on it\". Deriving\n`IntoParams` makes utoipa render them as optional query params with the\ncorrect types; the previous hand-written `params((\"operation_type\", Query,\n\u2026))` tuples defaulted every param to `required: true, type: string`, which\nmisled both API clients and the AI `describe_api`/`call_api` tools into\nthinking all filters were mandatory.", + "description": "Query parameters for listing audit logs.\n\nEvery field is optional — omitting one means \"don't filter on it\". Deriving\n`IntoParams` makes utoipa render them as optional query params with the\ncorrect types; the previous hand-written `params((\"operation_type\", Query,\n…))` tuples defaulted every param to `required: true, type: string`, which\nmisled both API clients and the AI `describe_api`/`call_api` tools into\nthinking all filters were mandatory.", "properties": { "from": { + "description": "Start timestamp (milliseconds since epoch)", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "Start timestamp (milliseconds since epoch)" + ] }, "limit": { + "description": "Maximum number of logs to return", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of logs to return" + ] }, "offset": { + "description": "Number of logs to skip", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Number of logs to skip" + ] }, "operation_type": { + "description": "Filter logs by operation type (omit for all)", "type": [ "string", "null" - ], - "description": "Filter logs by operation type (omit for all)" + ] }, "to": { + "description": "End timestamp (milliseconds since epoch)", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "End timestamp (milliseconds since epoch)" + ] }, "user_id": { + "description": "Filter logs by user ID (omit for all users)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter logs by user ID (omit for all users)" + ] } - } + }, + "type": "object" }, "ListBlobsQuery": { - "type": "object", "description": "Query parameters for listing blobs", "properties": { "cursor": { + "description": "Continuation token for pagination", "type": [ "string", "null" - ], - "description": "Continuation token for pagination" + ] }, "limit": { + "description": "Maximum number of items to return", + "example": 100, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of items to return", - "example": 100 + ] }, "prefix": { + "description": "Prefix to filter by", + "example": "images/", "type": [ "string", "null" - ], - "description": "Prefix to filter by", - "example": "images/" + ] }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "type": "object" }, "ListBlobsResponse": { - "type": "object", "description": "Response for listing blobs", - "required": [ - "blobs", - "hasMore" - ], "properties": { "blobs": { - "type": "array", + "description": "List of blobs", "items": { "$ref": "#/components/schemas/BlobResponse" }, - "description": "List of blobs" + "type": "array" }, "cursor": { + "description": "Continuation token for next page", "type": [ "string", "null" - ], - "description": "Continuation token for next page" + ] }, "hasMore": { - "type": "boolean", "description": "Whether there are more results", - "example": false + "example": false, + "type": "boolean" } - } - }, - "ListCustomDomainsResponse": { - "type": "object", + }, "required": [ - "domains", - "total" + "blobs", + "hasMore" ], + "type": "object" + }, + "ListCustomDomainsResponse": { "properties": { "domains": { - "type": "array", "items": { "$ref": "#/components/schemas/CustomDomainResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "domains", + "total" + ], + "type": "object" }, "ListDeploymentTokensQuery": { - "type": "object", "properties": { "page": { + "example": 1, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 1, - "minimum": 0 + ] }, "page_size": { + "example": 20, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 20, - "minimum": 0 + ] } - } + }, + "type": "object" }, "ListDomainsResponse": { - "type": "object", - "required": [ - "domains", - "total", - "page", - "page_size" - ], "properties": { "domains": { - "type": "array", "items": { "$ref": "#/components/schemas/DomainResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "domains", + "total", + "page", + "page_size" + ], + "type": "object" }, "ListEntitiesQuery": { - "type": "object", "properties": { "limit": { - "type": "integer", "description": "Maximum number of entities to return", "example": 100, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "token": { + "description": "Continuation token for pagination (backend-specific)", "type": [ "string", "null" - ], - "description": "Continuation token for pagination (backend-specific)" + ] } - } + }, + "type": "object" }, "ListErrorEventsQuery": { - "type": "object", "properties": { "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "type": "object" }, "ListErrorGroupsQuery": { - "type": "object", "properties": { "end_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sort_by": { "type": [ @@ -20075,11 +20134,11 @@ "type": "string" }, "start_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "status": { "type": [ @@ -20087,326 +20146,317 @@ "null" ] } - } + }, + "type": "object" }, "ListJobsResponse": { - "type": "object", - "required": [ - "items" - ], "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/JobSummaryResponse" - } + }, + "type": "array" } - } + }, + "required": [ + "items" + ], + "type": "object" }, "ListMcpsResponse": { - "type": "object", "description": "Concrete list wrapper for MCP server definitions (utoipa requires non-generic types).", - "required": [ - "items", - "total" - ], "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/McpDefinitionResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ListOnDemandCertsResponse": { - "type": "object", - "description": "Paginated list of on-demand cert attempts (ADR-018 \u00a75 console \"Certificates\"\nsurface). Joined with current `domains.status`, newest first.", + }, "required": [ - "certs", - "total", - "page", - "page_size" + "items", + "total" ], + "type": "object" + }, + "ListOnDemandCertsResponse": { + "description": "Paginated list of on-demand cert attempts (ADR-018 §5 console \"Certificates\"\nsurface). Joined with current `domains.status`, newest first.", "properties": { "certs": { - "type": "array", "items": { "$ref": "#/components/schemas/OnDemandCertRow" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ListOrdersResponse": { - "type": "object", + }, "required": [ - "orders" + "certs", + "total", + "page", + "page_size" ], + "type": "object" + }, + "ListOrdersResponse": { "properties": { "orders": { - "type": "array", "items": { "$ref": "#/components/schemas/AcmeOrderResponse" - } + }, + "type": "array" } - } - }, - "ListPresetsResponse": { - "type": "object", + }, "required": [ - "presets", - "total" + "orders" ], + "type": "object" + }, + "ListPresetsResponse": { "properties": { "presets": { - "type": "array", "items": { "$ref": "#/components/schemas/PresetResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ListRunsResponse": { - "type": "object", + }, "required": [ - "items", - "total", - "page", - "page_size" + "presets", + "total" ], + "type": "object" + }, + "ListRunsResponse": { "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/AgentRunResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "items", + "total", + "page", + "page_size" + ], + "type": "object" }, "ListSandboxesResponse": { - "type": "object", "description": "SDK list response: `{ sandboxes: [...], pagination: {...} }`.", - "required": [ - "sandboxes", - "pagination" - ], "properties": { "pagination": { "$ref": "#/components/schemas/Pagination" }, "sandboxes": { - "type": "array", "items": { "$ref": "#/components/schemas/SandboxInner" - } + }, + "type": "array" } - } + }, + "required": [ + "sandboxes", + "pagination" + ], + "type": "object" }, "ListScansQuery": { - "type": "object", "properties": { "page": { + "example": 1, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 1, - "minimum": 0 + ] }, "page_size": { + "example": 20, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 20, - "minimum": 0 + ] } - } + }, + "type": "object" }, "ListSecretsResponse": { - "type": "object", - "required": [ - "items", - "total" - ], "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/SecretResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ListSkillsResponse": { - "type": "object", - "description": "Concrete list wrapper for skill definitions (utoipa requires non-generic types).", + }, "required": [ "items", "total" ], + "type": "object" + }, + "ListSkillsResponse": { + "description": "Concrete list wrapper for skill definitions (utoipa requires non-generic types).", "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/SkillDefinitionResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ListTagsResponse": { - "type": "object", - "description": "Response for listing tags", + }, "required": [ - "tags", + "items", "total" ], + "type": "object" + }, + "ListTagsResponse": { + "description": "Response for listing tags", "properties": { "tags": { - "type": "array", + "description": "List of available tags", "items": { "type": "string" }, - "description": "List of available tags" + "type": "array" }, "total": { - "type": "integer", "description": "Total number of tags", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "tags", + "total" + ], + "type": "object" }, "ListTemplatesQuery": { - "type": "object", "description": "Query parameters for listing templates", "properties": { "featured": { + "description": "Only return featured templates", "type": [ "boolean", "null" - ], - "description": "Only return featured templates" + ] }, "tag": { + "description": "Filter templates by tag", "type": [ "string", "null" - ], - "description": "Filter templates by tag" + ] } - } + }, + "type": "object" }, "ListTemplatesResponse": { - "type": "object", "description": "Response for listing templates", - "required": [ - "templates", - "total" - ], "properties": { "templates": { - "type": "array", + "description": "List of templates", "items": { "$ref": "#/components/schemas/TemplateResponse" }, - "description": "List of templates" + "type": "array" }, "total": { - "type": "integer", "description": "Total number of templates", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "templates", + "total" + ], + "type": "object" }, "ListVulnerabilitiesQuery": { - "type": "object", "properties": { "page": { + "example": 1, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 1, - "minimum": 0 + ] }, "page_size": { + "example": 20, + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "example": 20, - "minimum": 0 + ] }, "severity": { + "example": "CRITICAL", "type": [ "string", "null" - ], - "example": "CRITICAL" + ] } - } + }, + "type": "object" }, "LiveVisitorInfo": { - "type": "object", - "required": [ - "id", - "visitor_id", - "project_id", - "environment_id", - "first_seen", - "last_seen", - "is_crawler" - ], "properties": { "city": { "type": [ @@ -20433,46 +20483,46 @@ ] }, "current_page": { + "description": "Most recent page path visited by this visitor", "type": [ "string", "null" - ], - "description": "Most recent page path visited by this visitor" + ] }, "custom_data": {}, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "first_channel": { + "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")", "type": [ "string", "null" - ], - "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")" + ] }, "first_referrer": { + "description": "Full referrer URL from the visitor's first session", "type": [ "string", "null" - ], - "description": "Full referrer URL from the visitor's first session" + ] }, "first_referrer_hostname": { + "description": "Hostname extracted from first_referrer", "type": [ "string", "null" - ], - "description": "Hostname extracted from first_referrer" + ] }, "first_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_address": { "type": [ @@ -20481,11 +20531,11 @@ ] }, "ip_address_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "is_crawler": { "type": "boolean" @@ -20497,27 +20547,27 @@ ] }, "last_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "latitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "longitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "region": { "type": [ @@ -20540,63 +20590,72 @@ "visitor_id": { "type": "string" } - } - }, - "LiveVisitorsListResponse": { - "type": "object", + }, "required": [ - "total_count", - "visitors", - "window_minutes" + "id", + "visitor_id", + "project_id", + "environment_id", + "first_seen", + "last_seen", + "is_crawler" ], + "type": "object" + }, + "LiveVisitorsListResponse": { "properties": { "total_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "visitors": { - "type": "array", "items": { "$ref": "#/components/schemas/LiveVisitorInfo" - } + }, + "type": "array" }, "window_minutes": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "LocationCount": { - "type": "object", + }, "required": [ - "location", - "count", - "percentage" + "total_count", + "visitors", + "window_minutes" ], + "type": "object" + }, + "LocationCount": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "location": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "location", + "count", + "percentage" + ], + "type": "object" }, "LocationGranularity": { - "type": "string", "enum": [ "country", "region", "city" - ] + ], + "type": "string" }, "LocationInfo": { - "type": "object", "properties": { "city": { "type": [ @@ -20616,10 +20675,10 @@ "null" ] } - } + }, + "type": "object" }, "LogLevel": { - "type": "string", "description": "Normalized log level", "enum": [ "TRACE", @@ -20627,48 +20686,38 @@ "INFO", "WARN", "ERROR" - ] + ], + "type": "string" }, "LogRecord": { - "type": "object", "description": "A single log record ready for storage.", - "required": [ - "project_id", - "resource", - "timestamp", - "observed_timestamp", - "severity", - "severity_text", - "body", - "attributes" - ], "properties": { "attributes": { - "type": "object", "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "body": { "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "observed_timestamp": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "resource": { "$ref": "#/components/schemas/ResourceInfo" @@ -20686,8 +20735,8 @@ ] }, "timestamp": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "trace_id": { "type": [ @@ -20695,26 +20744,28 @@ "null" ] } - } - }, - "LogSearchLine": { - "type": "object", - "description": "A single line in search results", + }, "required": [ + "project_id", + "resource", "timestamp", - "level", - "service", - "message", - "chunk_id", - "line_offset" + "observed_timestamp", + "severity", + "severity_text", + "body", + "attributes" ], + "type": "object" + }, + "LogSearchLine": { + "description": "A single line in search results", "properties": { "chunk_id": { "type": "string" }, "container_id": { - "type": "string", - "description": "Container this line came from \u2014 lets the UI tag/group lines by container\nin a combined (\"show all\") multi-container view." + "description": "Container this line came from — lets the UI tag/group lines by container\nin a combined (\"show all\") multi-container view.", + "type": "string" }, "context": { "oneOf": [ @@ -20728,37 +20779,37 @@ ] }, "deploy_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "fields": {}, "level": { "$ref": "#/components/schemas/LogLevel" }, "line_offset": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" }, "node_id": { + "description": "Worker node the line came from (`None` = control-plane-local).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Worker node the line came from (`None` = control-plane-local)." + ] }, "node_name": { + "description": "Human-readable node name for display.", "type": [ "string", "null" - ], - "description": "Human-readable node name for display." + ] }, "service": { "type": "string" @@ -20766,10 +20817,18 @@ "timestamp": { "type": "string" } - } + }, + "required": [ + "timestamp", + "level", + "service", + "message", + "chunk_id", + "line_offset" + ], + "type": "object" }, "LogSeverity": { - "type": "string", "description": "Log severity level (simplified from OTel's 24 levels).", "enum": [ "TRACE", @@ -20778,25 +20837,21 @@ "WARN", "ERROR", "FATAL" - ] + ], + "type": "string" }, "LogSource": { - "type": "object", - "description": "A distinct log source (container) seen in the queried scope. Used to populate\nthe history filter dropdowns with the *full* set of containers/nodes for the\nproject + env + deployment + time window \u2014 independent of the active\ncontainer/node/service filter, so the user can switch between them.", - "required": [ - "container_id", - "service" - ], + "description": "A distinct log source (container) seen in the queried scope. Used to populate\nthe history filter dropdowns with the *full* set of containers/nodes for the\nproject + env + deployment + time window — independent of the active\ncontainer/node/service filter, so the user can switch between them.", "properties": { "container_id": { "type": "string" }, "node_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "node_name": { "type": [ @@ -20807,22 +20862,22 @@ "service": { "type": "string" } - } + }, + "required": [ + "container_id", + "service" + ], + "type": "object" }, "LogStream": { - "type": "string", "description": "Log output stream", "enum": [ "stdout", "stderr" - ] + ], + "type": "string" }, "LoginRequest": { - "type": "object", - "required": [ - "email", - "password" - ], "properties": { "email": { "type": "string" @@ -20830,54 +20885,47 @@ "password": { "type": "string" } - } + }, + "required": [ + "email", + "password" + ], + "type": "object" }, "LogsQuery": { - "type": "object", "properties": { "tail": { + "description": "Number of lines to return from the tail. Defaults to 200, capped at 2000.", + "minimum": 0, "type": [ "integer", "null" - ], - "description": "Number of lines to return from the tail. Defaults to 200, capped at 2000.", - "minimum": 0 + ] } - } + }, + "type": "object" }, "LogsResponse": { - "type": "object", - "required": [ - "data", - "count" - ], "properties": { "count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "data": { - "type": "array", "items": { "$ref": "#/components/schemas/LogRecord" - } + }, + "type": "array" } - } + }, + "required": [ + "data", + "count" + ], + "type": "object" }, "ManagedDomainResponse": { - "type": "object", "description": "Managed domain response", - "required": [ - "id", - "provider_id", - "domain", - "auto_manage", - "verified", - "generated_hostname_mode", - "sync_generated_records", - "created_at", - "updated_at" - ], "properties": { "auto_manage": { "type": "boolean" @@ -20889,20 +20937,20 @@ "type": "string" }, "generated_hostname_mode": { - "type": "string", - "description": "Generated hostname layout: `\"standard\"` or `\"flat\"`." + "description": "Generated hostname layout: `\"standard\"` or `\"flat\"`.", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "provider_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "sync_generated_records": { - "type": "boolean", - "description": "Whether generated hostnames are reconciled into the provider's DNS zone." + "description": "Whether generated hostnames are reconciled into the provider's DNS zone.", + "type": "boolean" }, "updated_at": { "type": "string" @@ -20923,18 +20971,18 @@ ] }, "zone_access_error": { + "description": "Detail for a failed zone-access check.", "type": [ "string", "null" - ], - "description": "Detail for a failed zone-access check." + ] }, "zone_access_ok": { + "description": "Last token zone-access check: `Some(true)`/`Some(false)`/`None` (unchecked).", "type": [ "boolean", "null" - ], - "description": "Last token zone-access check: `Some(true)`/`Some(false)`/`None` (unchecked)." + ] }, "zone_id": { "type": [ @@ -20942,50 +20990,53 @@ "null" ] } - } + }, + "required": [ + "id", + "provider_id", + "domain", + "auto_manage", + "verified", + "generated_hostname_mode", + "sync_generated_records", + "created_at", + "updated_at" + ], + "type": "object" }, "ManualAction": { - "type": "object", "description": "A manual action the user must perform outside of the automated migration", - "required": [ - "timing", - "description", - "reason" - ], "properties": { "description": { - "type": "string", - "description": "Human-readable description" + "description": "Human-readable description", + "type": "string" }, "reason": { - "type": "string", - "description": "Why this can't be automated" + "description": "Why this can't be automated", + "type": "string" }, "timing": { "$ref": "#/components/schemas/ManualActionTiming", "description": "When this action needs to happen" } - } + }, + "required": [ + "timing", + "description", + "reason" + ], + "type": "object" }, "ManualActionTiming": { - "type": "string", "description": "When a manual action needs to happen relative to migration", "enum": [ "before-migration", "after-migration", "within-hours" - ] + ], + "type": "string" }, "McpDefinitionResponse": { - "type": "object", - "required": [ - "id", - "slug", - "name", - "config", - "created_at", - "updated_at" - ], "properties": { "config": { "type": "object" @@ -21000,18 +21051,18 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" }, "project_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "slug": { "type": "string" @@ -21019,7 +21070,16 @@ "updated_at": { "type": "string" } - } + }, + "required": [ + "id", + "slug", + "name", + "config", + "created_at", + "updated_at" + ], + "type": "object" }, "MessageContent": { "oneOf": [ @@ -21027,61 +21087,55 @@ "type": "string" }, { - "type": "array", "items": { "$ref": "#/components/schemas/ContentPart" - } + }, + "type": "array" } ] }, "MessagePart": { + "description": "One ordered segment of an assistant turn: a chunk of prose, or a tool\ninvocation. Mirrors the `metadata.parts` persisted by the chat service.", "oneOf": [ { - "type": "object", - "required": [ - "text", - "type" - ], "properties": { "text": { "type": "string" }, "type": { - "type": "string", "enum": [ "text" - ] + ], + "type": "string" } - } - }, - { - "type": "object", + }, "required": [ - "tool", + "text", "type" ], + "type": "object" + }, + { "properties": { "tool": { "$ref": "#/components/schemas/ToolInfo" }, "type": { - "type": "string", "enum": [ "tool" - ] + ], + "type": "string" } - } + }, + "required": [ + "tool", + "type" + ], + "type": "object" } - ], - "description": "One ordered segment of an assistant turn: a chunk of prose, or a tool\ninvocation. Mirrors the `metadata.parts` persisted by the chat service." + ] }, "MessageResponse": { - "type": "object", - "required": [ - "role", - "content", - "created_at" - ], "properties": { "content": { "type": "string" @@ -21090,122 +21144,120 @@ "type": "string" }, "parts": { - "type": [ - "array", - "null" - ], + "description": "Ordered render segments (text / tool, in the order they occurred) so a\nreloaded chat shows the same interleaving as the live stream. Absent for\nolder messages persisted before parts were tracked; the client then falls\nback to `tools` (rendered first) + `content`.", "items": { "$ref": "#/components/schemas/MessagePart" }, - "description": "Ordered render segments (text / tool, in the order they occurred) so a\nreloaded chat shows the same interleaving as the live stream. Absent for\nolder messages persisted before parts were tracked; the client then falls\nback to `tools` (rendered first) + `content`." + "type": [ + "array", + "null" + ] }, "role": { "type": "string" }, "tools": { - "type": [ - "array", - "null" - ], + "description": "Tools the assistant ran on this turn (persisted in message metadata), so\nthe chat replays its tool work after a reload. Absent for plain turns.", "items": { "$ref": "#/components/schemas/ToolInfo" }, - "description": "Tools the assistant ran on this turn (persisted in message metadata), so\nthe chat replays its tool work after a reload. Absent for plain turns." + "type": [ + "array", + "null" + ] } - } + }, + "required": [ + "role", + "content", + "created_at" + ], + "type": "object" }, "MeteredMode": { - "type": "string", - "description": "How to treat metered-billing subscriptions when computing MRR.\n\n* `DeriveFromInvoices` (default): ignore the subscription row's\n `mrr_minor` for metered items and rely on the per-invoice\n [`NormalizedEventType::MrrRealized`] events instead. Correct for\n pure-metered, hybrid, tiered, and flat \u2014 recommended.\n* `UseSubscription`: trust whatever MRR the subscription parser\n returns (0 for metered). Legacy behavior.\n* `Ignore`: drop metered subscriptions from MRR entirely.", + "description": "How to treat metered-billing subscriptions when computing MRR.\n\n* `DeriveFromInvoices` (default): ignore the subscription row's\n `mrr_minor` for metered items and rely on the per-invoice\n [`NormalizedEventType::MrrRealized`] events instead. Correct for\n pure-metered, hybrid, tiered, and flat — recommended.\n* `UseSubscription`: trust whatever MRR the subscription parser\n returns (0 for metered). Legacy behavior.\n* `Ignore`: drop metered subscriptions from MRR entirely.", "enum": [ "derive_from_invoices", "use_subscription", "ignore" - ] + ], + "type": "string" }, "MetricAggregation": { + "description": "The aggregation applied when reducing raw metric points into a time bucket.\n\nStore-neutral: every storage backend (ClickHouse today, TimescaleDB later)\nmust be able to satisfy this contract. `Quantile(q)` carries the requested\nquantile in `[0.0, 1.0]` (e.g. `0.95` for p95).", "oneOf": [ { - "type": "string", "description": "Arithmetic mean of the scalar value in each bucket. The default.", "enum": [ "avg" - ] + ], + "type": "string" }, { - "type": "string", "description": "Sum of the scalar value in each bucket.", "enum": [ "sum" - ] + ], + "type": "string" }, { - "type": "string", "description": "Minimum scalar value in each bucket.", "enum": [ "min" - ] + ], + "type": "string" }, { - "type": "string", "description": "Maximum scalar value in each bucket.", "enum": [ "max" - ] + ], + "type": "string" }, { - "type": "string", "description": "Number of points in each bucket.", "enum": [ "count" - ] + ], + "type": "string" }, { - "type": "string", "description": "Per-second rate of change of a cumulative monotonic counter, computed as\n`(max - min) / window_seconds` within each bucket. Non-monotonic series\nfall back to a simple delta.", "enum": [ "rate_per_sec" - ] + ], + "type": "string" }, { - "type": "object", "description": "A quantile of the scalar value in each bucket. The carried `f64` is the\nrequested quantile in `[0.0, 1.0]`.", - "required": [ - "quantile" - ], "properties": { "quantile": { - "type": "number", + "description": "A quantile of the scalar value in each bucket. The carried `f64` is the\nrequested quantile in `[0.0, 1.0]`.", "format": "double", - "description": "A quantile of the scalar value in each bucket. The carried `f64` is the\nrequested quantile in `[0.0, 1.0]`." + "type": "number" } - } + }, + "required": [ + "quantile" + ], + "type": "object" } - ], - "description": "The aggregation applied when reducing raw metric points into a time bucket.\n\nStore-neutral: every storage backend (ClickHouse today, TimescaleDB later)\nmust be able to satisfy this contract. `Quantile(q)` carries the requested\nquantile in `[0.0, 1.0]` (e.g. `0.95` for p95)." + ] }, "MetricBucket": { - "type": "object", "description": "A time-bucketed metric aggregate for chart display.\n\nStore-neutral response contract. The legacy scalar fields\n(`avg_value`/`min_value`/`max_value`/`count`) are always populated for chart\nback-compat. The richer fields describe the explicitly-requested\n[`MetricAggregation`] (`value`), optional `quantiles`, an optional\n`histogram_summary`, and a `series_key` identifying the label-set when the\nquery used `group_by`.", - "required": [ - "bucket", - "avg_value", - "min_value", - "max_value", - "count" - ], "properties": { "avg_value": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "bucket": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "histogram_summary": { "oneOf": [ @@ -21219,38 +21271,34 @@ ] }, "max_value": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "min_value": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "quantiles": { - "type": "array", + "description": "Computed quantile/value pairs `(quantile, value)` when the query asked for\nquantile aggregation; otherwise empty.", "items": { - "type": "array", "items": false, "prefixItems": [ { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - ] + ], + "type": "array" }, - "description": "Computed quantile/value pairs `(quantile, value)` when the query asked for\nquantile aggregation; otherwise empty." + "type": "array" }, "series_key": { - "type": [ - "array", - "null" - ], + "description": "The label-set this bucket belongs to, as ordered `(key, value)` pairs,\nwhen the query grouped by labels. Empty/`None` = the single ungrouped\naggregate stream.", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -21259,38 +21307,49 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "The label-set this bucket belongs to, as ordered `(key, value)` pairs,\nwhen the query grouped by labels. Empty/`None` = the single ungrouped\naggregate stream." + "type": [ + "array", + "null" + ] }, "value": { - "type": "number", + "description": "The value of the requested [`MetricAggregation`] for this bucket. For the\ndefault `Avg` aggregation this equals `avg_value`. `#[serde(default)]` so\npre-existing payloads (which only carried avg/min/max/count) still parse.", "format": "double", - "description": "The value of the requested [`MetricAggregation`] for this bucket. For the\ndefault `Avg` aggregation this equals `avg_value`. `#[serde(default)]` so\npre-existing payloads (which only carried avg/min/max/count) still parse." + "type": "number" } - } + }, + "required": [ + "bucket", + "avg_value", + "min_value", + "max_value", + "count" + ], + "type": "object" }, "MetricDataPoint": { - "type": "object", "description": "A single `(timestamp, value)` data point in a metric series.", - "required": [ - "time", - "value" - ], "properties": { "time": { - "type": "string", - "description": "ISO 8601 timestamp with `Z` suffix." + "description": "ISO 8601 timestamp with `Z` suffix.", + "type": "string" }, "value": { - "type": "number", + "description": "Metric value at this bucket.", "format": "double", - "description": "Metric value at this bucket." + "type": "number" } - } + }, + "required": [ + "time", + "value" + ], + "type": "object" }, "MetricType": { - "type": "string", "description": "The type of an OTel metric.", "enum": [ "gauge", @@ -21298,385 +21357,381 @@ "histogram", "exponential_histogram", "summary" - ] + ], + "type": "string" }, "MetricsOverTimeResponse": { - "type": "object", - "required": [ - "timestamps", - "ttfb", - "lcp", - "fid", - "fcp", - "cls", - "inp" - ], "properties": { "cls": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "cls_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "fcp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "fid_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "inp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "lcp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "timestamps": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "ttfb": { - "type": "array", "items": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" - } + ] + }, + "type": "array" }, "ttfb_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] } - } - }, - "MetricsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "timestamps", + "ttfb", + "lcp", + "fid", + "fcp", + "cls", + "inp" ], + "type": "object" + }, + "MetricsQuery": { "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" }, "MetricsRangeQuery": { - "type": "object", "description": "Query params for range metric queries.", - "required": [ - "metric" - ], "properties": { "metric": { - "type": "string", - "description": "Metric name, e.g. `\"pg.connections_active\"`." + "description": "Metric name, e.g. `\"pg.connections_active\"`.", + "type": "string" }, "percentile": { + "description": "Optional histogram percentile (0–100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Optional histogram percentile (0\u2013100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile." + ] }, "range": { - "type": "string", - "description": "Time window: `\"1h\"` | `\"6h\"` | `\"24h\"` | `\"7d\"`." + "description": "Time window: `\"1h\"` | `\"6h\"` | `\"24h\"` | `\"7d\"`.", + "type": "string" } - } + }, + "required": [ + "metric" + ], + "type": "object" }, "MetricsStatusResponse": { - "type": "object", "description": "Freshness status: when metrics were last received for this service.", "properties": { "last_received_at": { + "description": "ISO 8601 timestamp of the most recent metric row, or null if none yet.", "type": [ "string", "null" - ], - "description": "ISO 8601 timestamp of the most recent metric row, or null if none yet." + ] } - } + }, + "type": "object" }, "MetricsStoreKind": { - "type": "string", "description": "Which storage backend to use for the MetricsStore.", "enum": [ "timescale_db", "click_house" - ] + ], + "type": "string" }, "MetricsSummaryResponse": { - "type": "object", - "required": [ - "currency", - "current_mrr_minor", - "current_arr_minor", - "active_subscriptions", - "active_customers", - "churned_last_30d", - "arpu_minor" - ], "properties": { "active_customers": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "active_subscriptions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "arpu_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "churned_last_30d": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "currency": { "type": "string" }, "current_arr_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "current_mrr_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "MfaRequiredResponse": { - "type": "object", + }, "required": [ - "requires_mfa", - "session_token" + "currency", + "current_mrr_minor", + "current_arr_minor", + "active_subscriptions", + "active_customers", + "churned_last_30d", + "arpu_minor" ], + "type": "object" + }, + "MfaRequiredResponse": { "properties": { "requires_mfa": { "type": "boolean" @@ -21684,148 +21739,147 @@ "session_token": { "type": "string" } - } - }, - "MfaSetupResponse": { - "type": "object", + }, "required": [ - "secret_key", - "qr_code", - "recovery_codes" + "requires_mfa", + "session_token" ], + "type": "object" + }, + "MfaSetupResponse": { "properties": { "qr_code": { "type": "string" }, "recovery_codes": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "secret_key": { "type": "string" } - } - }, - "MfaVerificationRequest": { - "type": "object", + }, "required": [ - "code" + "secret_key", + "qr_code", + "recovery_codes" ], + "type": "object" + }, + "MfaVerificationRequest": { "properties": { "code": { "type": "string" } - } + }, + "required": [ + "code" + ], + "type": "object" }, "MigrationStep": { - "type": "object", "description": "A single step in the migration execution plan.\n\nSteps are presented to the user before execution so they know exactly\nwhat will happen. During execution, each step runs in order and reports\nits outcome before proceeding to the next.", - "required": [ - "order", - "id", - "title", - "description", - "resource_type", - "risk", - "skippable", - "reversible" - ], "properties": { "data_implications": { - "type": "array", + "description": "Data implications — what could go wrong or what the user needs to know", "items": { "$ref": "#/components/schemas/DataImplication" }, - "description": "Data implications \u2014 what could go wrong or what the user needs to know" + "type": "array" }, "description": { - "type": "string", - "description": "Detailed description of what this step does" + "description": "Detailed description of what this step does", + "type": "string" }, "estimated_duration": { + "description": "Estimated duration hint (e.g., \"< 1 second\", \"10-30 seconds\")", "type": [ "string", "null" - ], - "description": "Estimated duration hint (e.g., \"< 1 second\", \"10-30 seconds\")" + ] }, "id": { - "type": "string", - "description": "Machine-readable step identifier (e.g., \"create-project\", \"create-service-postgres\")" + "description": "Machine-readable step identifier (e.g., \"create-project\", \"create-service-postgres\")", + "type": "string" }, "order": { - "type": "integer", "description": "Step number (1-based, for display)", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "post_conditions": { - "type": "array", + "description": "Things the user should verify AFTER this step completes", "items": { "type": "string" }, - "description": "Things the user should verify AFTER this step completes" + "type": "array" }, "pre_conditions": { - "type": "array", + "description": "Things the user should verify BEFORE this step runs", "items": { "type": "string" }, - "description": "Things the user should verify BEFORE this step runs" + "type": "array" }, "resource_type": { "$ref": "#/components/schemas/StepResourceType", "description": "What kind of resource this step creates/modifies" }, "reversible": { - "type": "boolean", - "description": "Whether this step is reversible (can be cleaned up on failure)" + "description": "Whether this step is reversible (can be cleaned up on failure)", + "type": "boolean" }, "risk": { "$ref": "#/components/schemas/RiskLevel", "description": "Risk level for this step" }, "skippable": { - "type": "boolean", - "description": "Whether this step can be skipped by the user" + "description": "Whether this step can be skipped by the user", + "type": "boolean" }, "skipped": { - "type": "boolean", - "description": "Whether the user has chosen to skip this step (set during review)" + "description": "Whether the user has chosen to skip this step (set during review)", + "type": "boolean" }, "title": { - "type": "string", - "description": "Human-readable title (e.g., \"Create project 'my-app'\")" + "description": "Human-readable title (e.g., \"Create project 'my-app'\")", + "type": "string" } - } + }, + "required": [ + "order", + "id", + "title", + "description", + "resource_type", + "risk", + "skippable", + "reversible" + ], + "type": "object" }, "MigrationSummary": { - "type": "object", "description": "Human-readable summary of the entire migration plan", - "required": [ - "headline", - "overall_risk", - "resource_counts" - ], "properties": { "critical_warnings": { - "type": "array", + "description": "Critical warnings that must be acknowledged before proceeding.\nThese are the most important things the user needs to know.", "items": { "type": "string" }, - "description": "Critical warnings that must be acknowledged before proceeding.\nThese are the most important things the user needs to know." + "type": "array" }, "headline": { - "type": "string", - "description": "One-line summary (e.g., \"Migrate 'my-app' from Vercel with 1 database, 2 domains\")" + "description": "One-line summary (e.g., \"Migrate 'my-app' from Vercel with 1 database, 2 domains\")", + "type": "string" }, "manual_actions_required": { - "type": "array", + "description": "Manual actions the user must perform (before or after migration)", "items": { "$ref": "#/components/schemas/ManualAction" }, - "description": "Manual actions the user must perform (before or after migration)" + "type": "array" }, "overall_risk": { "$ref": "#/components/schemas/RiskLevel", @@ -21836,128 +21890,128 @@ "description": "Resource counts for quick overview" }, "unsupported_features": { - "type": "array", + "description": "Features from the source platform that cannot be migrated", "items": { "$ref": "#/components/schemas/UnsupportedFeature" }, - "description": "Features from the source platform that cannot be migrated" + "type": "array" } - } + }, + "required": [ + "headline", + "overall_risk", + "resource_counts" + ], + "type": "object" }, "MintEnrollmentTokenRequest": { - "type": "object", "properties": { "bound_node_name": { + "description": "Optional: restrict the token to register one specific node name.", "type": [ "string", "null" - ], - "description": "Optional: restrict the token to register one specific node name." + ] }, "max_uses": { + "description": "Maximum registrations this token may authorize (default 1).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum registrations this token may authorize (default 1)." + ] }, "ttl_secs": { + "description": "Time-to-live in seconds (default 3600 = 1h).", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Time-to-live in seconds (default 3600 = 1h)." + ] } - } + }, + "type": "object" }, "MintEnrollmentTokenResponse": { - "type": "object", - "required": [ - "id", - "token", - "expires_at", - "max_uses", - "message" - ], "properties": { "ca_fingerprint": { + "description": "SHA-256 fingerprint of the cluster CA (if mTLS is set up). Pass it to the\nworker as `temps join --ca-fingerprint ` to verify the CA on join.", "type": [ "string", "null" - ], - "description": "SHA-256 fingerprint of the cluster CA (if mTLS is set up). Pass it to the\nworker as `temps join --ca-fingerprint ` to verify the CA on join." + ] }, "expires_at": { "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "max_uses": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" }, "token": { - "type": "string", - "description": "The plaintext enrollment token \u2014 shown only once, save it now." + "description": "The plaintext enrollment token — shown only once, save it now.", + "type": "string" } - } + }, + "required": [ + "id", + "token", + "expires_at", + "max_uses", + "message" + ], + "type": "object" }, "MiscResult": { - "type": "object", "description": "Miscellaneous validation result", - "required": [ - "is_disposable", - "is_role_account", - "is_b2c" - ], "properties": { "gravatar_url": { + "description": "Gravatar URL if available", "type": [ "string", "null" - ], - "description": "Gravatar URL if available" + ] }, "is_b2c": { - "type": "boolean", - "description": "Whether the email provider is a B2C (consumer) email provider" + "description": "Whether the email provider is a B2C (consumer) email provider", + "type": "boolean" }, "is_disposable": { - "type": "boolean", - "description": "Whether the email is from a disposable email provider" + "description": "Whether the email is from a disposable email provider", + "type": "boolean" }, "is_role_account": { - "type": "boolean", - "description": "Whether the email is a role-based account (e.g., admin@, info@)" + "description": "Whether the email is a role-based account (e.g., admin@, info@)", + "type": "boolean" } - } - }, - "MkdirBody": { - "type": "object", + }, "required": [ - "path" + "is_disposable", + "is_role_account", + "is_b2c" ], + "type": "object" + }, + "MkdirBody": { + "additionalProperties": false, "properties": { "path": { "type": "string" } }, - "additionalProperties": false - }, - "ModelInfo": { - "type": "object", "required": [ - "id", - "object", - "owned_by" + "path" ], + "type": "object" + }, + "ModelInfo": { "properties": { "id": { "type": "string" @@ -21968,162 +22022,156 @@ "owned_by": { "type": "string" } - } - }, - "ModelListResponse": { - "type": "object", + }, "required": [ + "id", "object", - "data" + "owned_by" ], + "type": "object" + }, + "ModelListResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/ModelInfo" - } + }, + "type": "array" }, "object": { "type": "string" } - } + }, + "required": [ + "object", + "data" + ], + "type": "object" }, "ModelPricing": { - "type": "object", "description": "Pricing for a single model, all values in USD per 1M tokens.\nFields are optional because not every provider supports every pricing tier.", - "required": [ - "model", - "display_name", - "provider", - "input_per_million", - "output_per_million" - ], "properties": { "batch_input_per_million": { + "description": "Batch API input cost per 1M tokens (if provider offers batch pricing)", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Batch API input cost per 1M tokens (if provider offers batch pricing)" + ] }, "batch_output_per_million": { + "description": "Batch API output cost per 1M tokens", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Batch API output cost per 1M tokens" + ] }, "cache_hit_per_million": { + "description": "Cache hit / refresh cost per 1M tokens", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Cache hit / refresh cost per 1M tokens" + ] }, "cache_write_1h_per_million": { + "description": "1-hour cache write cost per 1M tokens", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "1-hour cache write cost per 1M tokens" + ] }, "cache_write_5m_per_million": { + "description": "5-minute cache write cost per 1M tokens (Anthropic-style prompt caching)", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "5-minute cache write cost per 1M tokens (Anthropic-style prompt caching)" + ] }, "deprecated": { - "type": "boolean", - "description": "Whether the model is deprecated" + "description": "Whether the model is deprecated", + "type": "boolean" }, "display_name": { - "type": "string", - "description": "Human-readable model name (e.g. \"Claude Sonnet 4.6\")" + "description": "Human-readable model name (e.g. \"Claude Sonnet 4.6\")", + "type": "string" }, "input_per_million": { - "type": "number", + "description": "Base input token cost per 1M tokens", "format": "double", - "description": "Base input token cost per 1M tokens" + "type": "number" }, "model": { - "type": "string", - "description": "Model identifier (e.g. \"gpt-5.4\", \"claude-sonnet-4-6\")" + "description": "Model identifier (e.g. \"gpt-5.4\", \"claude-sonnet-4-6\")", + "type": "string" }, "output_per_million": { - "type": "number", + "description": "Output token cost per 1M tokens", "format": "double", - "description": "Output token cost per 1M tokens" + "type": "number" }, "provider": { - "type": "string", - "description": "Provider ID (e.g. \"openai\", \"anthropic\")" + "description": "Provider ID (e.g. \"openai\", \"anthropic\")", + "type": "string" } - } - }, - "ModelUsage": { - "type": "object", + }, "required": [ "model", + "display_name", "provider", - "request_count", - "input_tokens", - "output_tokens", - "total_tokens", - "avg_latency_ms" + "input_per_million", + "output_per_million" ], + "type": "object" + }, + "ModelUsage": { "properties": { "avg_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "model": { "type": "string" }, "output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "provider": { "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "MonitorResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "monitor_type", - "monitor_url", - "check_interval_seconds", - "is_active", - "created_at", - "updated_at" + "model", + "provider", + "request_count", + "input_tokens", + "output_tokens", + "total_tokens", + "avg_latency_ms" ], + "type": "object" + }, + "MonitorResponse": { "properties": { "check_interval_seconds": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "check_path": { "type": [ @@ -22132,19 +22180,19 @@ ] }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -22159,29 +22207,35 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "MonitorStatus": { - "type": "object", + }, "required": [ - "monitor", - "current_status", - "uptime_percentage" + "id", + "project_id", + "name", + "monitor_type", + "monitor_url", + "check_interval_seconds", + "is_active", + "created_at", + "updated_at" ], + "type": "object" + }, + "MonitorStatus": { "properties": { "avg_response_time_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "current_status": { "type": "string" @@ -22190,268 +22244,268 @@ "$ref": "#/components/schemas/MonitorResponse" }, "uptime_percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "monitor", + "current_status", + "uptime_percentage" + ], + "type": "object" }, "MonitoringSettings": { - "type": "object", "description": "Global metrics observability configuration.\n\nControls whether the MetricsScraper and AlertEvaluator background tasks\nare active, which storage backend they write to, and how long data is kept\nat each retention tier.", "properties": { "clickhouse_url": { + "default": null, + "description": "ClickHouse DSN (legacy, optional). The runtime metrics store is built\nfrom the `TEMPS_CLICKHOUSE_*` env vars, never from this field; it is\nretained for compatibility and operator reference only.\nExample: `\"http://localhost:8123\"`.", "type": [ "string", "null" - ], - "description": "ClickHouse DSN (legacy, optional). The runtime metrics store is built\nfrom the `TEMPS_CLICKHOUSE_*` env vars, never from this field; it is\nretained for compatibility and operator reference only.\nExample: `\"http://localhost:8123\"`.", - "default": null + ] }, "enabled": { - "type": "boolean", + "default": false, "description": "Enable or disable all metrics collection (scraping + alerting).\nDefaults to `false` so new installs don't write to TimescaleDB until\nan operator explicitly enables the feature.", - "default": false + "type": "boolean" }, "retention_daily_years": { - "type": "integer", - "format": "int32", - "description": "How many years of daily-aggregate data to keep (converted to days internally).", "default": 2, + "description": "How many years of daily-aggregate data to keep (converted to days internally).", "example": 2, + "format": "int32", "maximum": 10, - "minimum": 1 + "minimum": 1, + "type": "integer" }, "retention_hourly_days": { - "type": "integer", - "format": "int32", - "description": "How many days of hourly-aggregate data to keep.", "default": 90, + "description": "How many days of hourly-aggregate data to keep.", "example": 90, - "minimum": 1 + "format": "int32", + "minimum": 1, + "type": "integer" }, "retention_raw_days": { - "type": "integer", - "format": "int32", - "description": "How many days of raw (30 s resolution) metric data to keep.", "default": 7, + "description": "How many days of raw (30 s resolution) metric data to keep.", "example": 7, - "minimum": 1 + "format": "int32", + "minimum": 1, + "type": "integer" }, "scrape_interval_secs": { - "type": "integer", - "format": "int64", - "description": "How often the MetricsScraper collects data from all sources, in seconds.\nMinimum effective value is 10 s; values below that are clamped at runtime.", "default": 30, + "description": "How often the MetricsScraper collects data from all sources, in seconds.\nMinimum effective value is 10 s; values below that are clamped at runtime.", "example": 30, - "minimum": 10 + "format": "int64", + "minimum": 10, + "type": "integer" }, "store": { + "default": "timescale_db", "oneOf": [ { "$ref": "#/components/schemas/MetricsStoreKind", "description": "Storage backend for metric data." } - ], - "default": "timescale_db" + ] } - } + }, + "type": "object" }, "MonitoringSettingsMasked": { - "type": "object", - "description": "Monitoring settings with the ClickHouse DSN masked.\n\n`clickhouse_url` can embed credentials (`http://user:pass@host`), so it is\nreported only as a boolean (`clickhouse_url_set`) rather than echoed back \u2014\nconsistent with how the DNS API key and Docker registry password are masked.", - "required": [ - "enabled", - "store", - "scrape_interval_secs", - "retention_raw_days", - "retention_hourly_days", - "retention_daily_years", - "clickhouse_url_set" - ], + "description": "Monitoring settings with the ClickHouse DSN masked.\n\n`clickhouse_url` can embed credentials (`http://user:pass@host`), so it is\nreported only as a boolean (`clickhouse_url_set`) rather than echoed back —\nconsistent with how the DNS API key and Docker registry password are masked.", "properties": { "clickhouse_url_set": { - "type": "boolean", - "description": "True when a ClickHouse DSN is configured. The DSN itself is never\nreturned over HTTP because it may contain credentials." + "description": "True when a ClickHouse DSN is configured. The DSN itself is never\nreturned over HTTP because it may contain credentials.", + "type": "boolean" }, "enabled": { "type": "boolean" }, "retention_daily_years": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "retention_hourly_days": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "retention_raw_days": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "scrape_interval_secs": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "store": { "$ref": "#/components/schemas/MetricsStoreKind" } - } - }, - "MrrBucketResponse": { - "type": "object", + }, "required": [ - "bucket", - "mrr_minor", - "charge_total_minor", - "refund_total_minor", - "charge_count" + "enabled", + "store", + "scrape_interval_secs", + "retention_raw_days", + "retention_hourly_days", + "retention_daily_years", + "clickhouse_url_set" ], + "type": "object" + }, + "MrrBucketResponse": { "properties": { "bucket": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "charge_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "charge_total_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "mrr_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "refund_total_minor": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "bucket", + "mrr_minor", + "charge_total_minor", + "refund_total_minor", + "charge_count" + ], + "type": "object" }, "MultiNodeSettings": { - "type": "object", "description": "Multi-node cluster settings", "properties": { "cluster_ca_cert_pem": { + "default": null, + "description": "Per-cluster CA certificate (PEM) for multi-node mTLS (ADR-020 WS-2.1).\nPublic — distributed to nodes as the trust root and used by the control\nplane as the root for verifying agent server certs. Minted lazily on the\nfirst CSR-bearing registration.", "type": [ "string", "null" - ], - "description": "Per-cluster CA certificate (PEM) for multi-node mTLS (ADR-020 WS-2.1).\nPublic \u2014 distributed to nodes as the trust root and used by the control\nplane as the root for verifying agent server certs. Minted lazily on the\nfirst CSR-bearing registration.", - "default": null + ] }, "cluster_ca_key_encrypted": { + "default": null, + "description": "Per-cluster CA private key, AES-256-GCM ciphertext (EncryptionService).\nSECRET — never returned over HTTP (elided in the masked response).", "type": [ "string", "null" - ], - "description": "Per-cluster CA private key, AES-256-GCM ciphertext (EncryptionService).\nSECRET \u2014 never returned over HTTP (elided in the masked response).", - "default": null + ] }, "join_token_hash": { + "default": null, + "description": "SHA-256 hash of the join token (never store plaintext)", "type": [ "string", "null" - ], - "description": "SHA-256 hash of the join token (never store plaintext)", - "default": null + ] }, "legacy_shared_token_enabled": { - "type": "boolean", + "default": true, "description": "Whether the legacy single shared join token is still accepted for node\nregistration (ADR-020 WS-1.1). Defaults to `true` so existing clusters\nkeep working on upgrade; fresh installs should set it `false` and rely on\nshort-lived, single-use enrollment tokens instead.", - "default": true + "type": "boolean" }, "node_cpu_alert_percent": { + "default": 90, + "description": "CPU-usage percent above which a worker node raises a resource alert\n(ADR-020 / monitoring). `None` disables CPU alerting. Default 90.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "CPU-usage percent above which a worker node raises a resource alert\n(ADR-020 / monitoring). `None` disables CPU alerting. Default 90.", - "default": 90.0 + ] }, "node_disk_alert_percent": { + "default": 90, + "description": "Disk-usage percent above which a worker node raises a resource alert.\n`None` disables disk alerting. Default 90.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Disk-usage percent above which a worker node raises a resource alert.\n`None` disables disk alerting. Default 90.", - "default": 90.0 + ] }, "node_memory_alert_percent": { + "default": 90, + "description": "Memory-usage percent above which a worker node raises a resource alert.\n`None` disables memory alerting. Default 90.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Memory-usage percent above which a worker node raises a resource alert.\n`None` disables memory alerting. Default 90.", - "default": 90.0 + ] }, "private_address": { + "default": null, + "description": "Private/WireGuard IP address of the control plane node.\nUsed by remote worker nodes to reach services (databases, etc.) running on the control plane.\nSet via `--private-address` or `TEMPS_PRIVATE_ADDRESS`.", "type": [ "string", "null" - ], - "description": "Private/WireGuard IP address of the control plane node.\nUsed by remote worker nodes to reach services (databases, etc.) running on the control plane.\nSet via `--private-address` or `TEMPS_PRIVATE_ADDRESS`.", - "default": null + ] }, "require_mtls": { - "type": "boolean", - "description": "Whether to enforce multi-node mTLS (ADR-020 WS-2.1). When `false`\n(default), the control plane ignores join-time CSRs and nodes keep\nserving plaintext HTTP \u2014 zero behavior change. When `true`, the CP signs\nnode CSRs, nodes serve mutual TLS, and every CP\u2192agent call uses the\ncluster client cert. Observe-then-enforce: flip this on only once all\nworkers have re-enrolled with certs.", - "default": false + "default": false, + "description": "Whether to enforce multi-node mTLS (ADR-020 WS-2.1). When `false`\n(default), the control plane ignores join-time CSRs and nodes keep\nserving plaintext HTTP — zero behavior change. When `true`, the CP signs\nnode CSRs, nodes serve mutual TLS, and every CP→agent call uses the\ncluster client cert. Observe-then-enforce: flip this on only once all\nworkers have re-enrolled with certs.", + "type": "boolean" } - } + }, + "type": "object" }, "MultiNodeSettingsMasked": { - "type": "object", "description": "Multi-node settings with `join_token_hash` elided.", - "required": [ - "has_join_token", - "require_mtls", - "legacy_shared_token_enabled" - ], "properties": { "cluster_ca_fingerprint": { + "description": "SHA-256 fingerprint of the cluster CA certificate (public — operators can\nverify it out of band; the CA private key is never exposed).", "type": [ "string", "null" - ], - "description": "SHA-256 fingerprint of the cluster CA certificate (public \u2014 operators can\nverify it out of band; the CA private key is never exposed)." + ] }, "has_join_token": { "type": "boolean" }, "legacy_shared_token_enabled": { - "type": "boolean", - "description": "Whether the deprecated shared join token is still accepted." + "description": "Whether the deprecated shared join token is still accepted.", + "type": "boolean" }, "node_cpu_alert_percent": { + "description": "Node resource-alert thresholds (percent); `None` = that alert disabled.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Node resource-alert thresholds (percent); `None` = that alert disabled." + ] }, "node_disk_alert_percent": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "node_memory_alert_percent": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "private_address": { "type": [ @@ -22460,171 +22514,176 @@ ] }, "require_mtls": { - "type": "boolean", - "description": "Whether control-plane\u2194agent mutual TLS is enforced." + "description": "Whether control-plane↔agent mutual TLS is enforced.", + "type": "boolean" } - } + }, + "required": [ + "has_join_token", + "require_mtls", + "legacy_shared_token_enabled" + ], + "type": "object" }, "MxResult": { - "type": "object", "description": "MX (Mail Exchange) validation result", - "required": [ - "accepts_mail", - "records" - ], "properties": { "accepts_mail": { - "type": "boolean", - "description": "Whether the domain accepts mail" + "description": "Whether the domain accepts mail", + "type": "boolean" }, "error": { + "description": "Error message if MX lookup failed", "type": [ "string", "null" - ], - "description": "Error message if MX lookup failed" + ] }, "records": { - "type": "array", - "items": { - "type": "string" - }, "description": "List of MX records for the domain", "example": [ "alt1.gmail-smtp-in.l.google.com.", "gmail-smtp-in.l.google.com." - ] + ], + "items": { + "type": "string" + }, + "type": "array" } - } + }, + "required": [ + "accepts_mail", + "records" + ], + "type": "object" }, "NavEntry": { - "type": "object", "description": "A navigation entry that the plugin contributes to the Temps UI.", - "required": [ - "label", - "icon", - "section", - "path", - "order" - ], "properties": { "icon": { - "type": "string", - "description": "Lucide icon name (e.g., \"puzzle\", \"database\", \"activity\")" + "description": "Lucide icon name (e.g., \"puzzle\", \"database\", \"activity\")", + "type": "string" }, "label": { - "type": "string", - "description": "Display label in the sidebar" + "description": "Display label in the sidebar", + "type": "string" }, "order": { - "type": "integer", - "format": "int32", "description": "Sort order within the section (lower = higher in list)", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "path": { - "type": "string", - "description": "Client-side route path (e.g., \"/my-plugin\")" + "description": "Client-side route path (e.g., \"/my-plugin\")", + "type": "string" }, "section": { "$ref": "#/components/schemas/NavSection", "description": "Which sidebar section this entry belongs to" } - } + }, + "required": [ + "label", + "icon", + "section", + "path", + "order" + ], + "type": "object" }, "NavSection": { - "type": "string", "description": "Where the plugin's nav entry appears in the Temps UI sidebar.", "enum": [ "platform", "settings", "project" - ] + ], + "type": "string" }, "NetworkConfiguration": { - "type": "object", "description": "Network configuration", - "required": [ - "mode", - "dns_servers" - ], "properties": { "dns_servers": { - "type": "array", + "description": "DNS servers", "items": { "type": "string" }, - "description": "DNS servers" + "type": "array" }, "hostname": { + "description": "Hostname", "type": [ "string", "null" - ], - "description": "Hostname" + ] }, "mode": { "$ref": "#/components/schemas/NetworkMode", "description": "Network mode" } - } + }, + "required": [ + "mode", + "dns_servers" + ], + "type": "object" }, "NetworkMode": { + "description": "Network mode", "oneOf": [ { - "type": "string", "enum": [ "bridge" - ] + ], + "type": "string" }, { - "type": "string", "enum": [ "host" - ] + ], + "type": "string" }, { - "type": "string", "enum": [ "none" - ] + ], + "type": "string" }, { - "type": "object", - "required": [ - "custom" - ], "properties": { "custom": { "type": "string" } - } + }, + "required": [ + "custom" + ], + "type": "object" } - ], - "description": "Network mode" + ] }, "NixpacksPresetConfig": { - "type": "object", "description": "Configuration for Nixpacks preset\nNixpacks provider and inline build-plan configuration.", "properties": { "nixpacksConfig": { + "description": "Optional inline nixpacks.toml contents.", "type": [ "string", "null" - ], - "description": "Optional inline nixpacks.toml contents." + ] }, "providers": { - "type": "array", + "description": "Ordered Nixpacks providers. Empty means repository config or auto-detect;\ninclude `...` to combine auto-detection with explicit providers.", "items": { "$ref": "#/components/schemas/NixpacksProvider" }, - "description": "Ordered Nixpacks providers. Empty means repository config or auto-detect;\ninclude `...` to combine auto-detection with explicit providers." + "type": "array" } - } + }, + "type": "object" }, "NixpacksProvider": { - "type": "string", "description": "A Nixpacks build provider.\n\n`Auto` serializes as the native Nixpacks `...` marker, which includes the\nprovider detected from the project alongside any explicitly listed\nproviders.", "enum": [ "...", @@ -22651,42 +22710,30 @@ "lunatic", "scheme", "static" - ] + ], + "type": "string" }, "NodeContainerListResponse": { - "type": "object", - "required": [ - "containers", - "total" - ], "properties": { "containers": { - "type": "array", "items": { "$ref": "#/components/schemas/NodeContainerResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "containers", + "total" + ], + "type": "object" }, "NodeContainerResponse": { - "type": "object", "description": "A container running on a specific node, enriched with project/environment context.", - "required": [ - "container_id", - "container_name", - "image_name", - "status", - "created_at", - "deployment_id", - "project_id", - "project_name", - "environment_id", - "environment_name" - ], "properties": { "container_id": { "type": "string" @@ -22698,12 +22745,12 @@ "type": "string" }, "deployment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "environment_name": { "type": "string" @@ -22712,8 +22759,8 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" @@ -22721,78 +22768,79 @@ "status": { "type": "string" } - } + }, + "required": [ + "container_id", + "container_name", + "image_name", + "status", + "created_at", + "deployment_id", + "project_id", + "project_name", + "environment_id", + "environment_name" + ], + "type": "object" }, "NodeCostInfo": { - "type": "object", "description": "One cluster node with capacity and (when priceable) a cost estimate", - "required": [ - "name", - "cpu_millis", - "memory_mb" - ], "properties": { "cpu_millis": { - "type": "integer", + "description": "CPU capacity in millicores", "format": "int64", - "description": "CPU capacity in millicores" + "type": "integer" }, "instance_type": { + "description": "Instance type from `node.kubernetes.io/instance-type` (e.g. \"m5.xlarge\")", "type": [ "string", "null" - ], - "description": "Instance type from `node.kubernetes.io/instance-type` (e.g. \"m5.xlarge\")" + ] }, "memory_mb": { - "type": "integer", + "description": "Memory capacity in MB", "format": "int64", - "description": "Memory capacity in MB" + "type": "integer" }, "monthly_usd": { + "description": "Estimated on-demand monthly price in USD. `None` when the instance\ntype is unknown or not in the price table.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Estimated on-demand monthly price in USD. `None` when the instance\ntype is unknown or not in the price table." + ] }, "name": { - "type": "string", - "description": "Node name" + "description": "Node name", + "type": "string" }, "region": { + "description": "Region from `topology.kubernetes.io/region`", "type": [ "string", "null" - ], - "description": "Region from `topology.kubernetes.io/region`" + ] } - } - }, - "NodeInfoResponse": { - "type": "object", + }, "required": [ - "id", "name", - "address", - "private_address", - "role", - "status", - "labels", - "capacity", - "created_at" + "cpu_millis", + "memory_mb" ], + "type": "object" + }, + "NodeInfoResponse": { "properties": { "address": { "type": "string" }, "architecture": { + "description": "Container platform this node runs (`linux/amd64`, `linux/arm64`).\n`None` until an agent that reports it has heartbeated.", "type": [ "string", "null" - ], - "description": "Container platform this node runs (`linux/amd64`, `linux/arm64`).\n`None` until an agent that reports it has heartbeated." + ] }, "capacity": { "description": "Resource capacity/usage metrics from the latest heartbeat" @@ -22801,8 +22849,8 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "labels": {}, "last_heartbeat": { @@ -22823,54 +22871,40 @@ "status": { "type": "string" } - } - }, - "NodeListResponse": { - "type": "object", + }, "required": [ - "nodes", - "total" + "id", + "name", + "address", + "private_address", + "role", + "status", + "labels", + "capacity", + "created_at" ], + "type": "object" + }, + "NodeListResponse": { "properties": { "nodes": { - "type": "array", "items": { "$ref": "#/components/schemas/NodeInfoResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "NotificationPreferencesResponse": { - "type": "object", + }, "required": [ - "email_enabled", - "slack_enabled", - "batch_similar_notifications", - "minimum_severity", - "deployment_failures_enabled", - "build_errors_enabled", - "runtime_errors_enabled", - "error_threshold", - "error_time_window", - "ssl_expiration_enabled", - "ssl_days_before_expiration", - "domain_expiration_enabled", - "dns_changes_enabled", - "backup_failures_enabled", - "backup_successes_enabled", - "s3_connection_issues_enabled", - "retention_policy_violations_enabled", - "route_downtime_enabled", - "load_balancer_issues_enabled", - "weekly_digest_enabled", - "digest_send_day", - "digest_send_time", - "digest_sections" + "nodes", + "total" ], + "type": "object" + }, + "NotificationPreferencesResponse": { "properties": { "backup_failures_enabled": { "type": "boolean" @@ -22906,12 +22940,12 @@ "type": "boolean" }, "error_threshold": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "error_time_window": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "load_balancer_issues_enabled": { "type": "boolean" @@ -22935,8 +22969,8 @@ "type": "boolean" }, "ssl_days_before_expiration": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ssl_expiration_enabled": { "type": "boolean" @@ -22944,31 +22978,47 @@ "weekly_digest_enabled": { "type": "boolean" } - } - }, - "NotificationProviderResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "provider_type", - "config", - "enabled", - "created_at", - "updated_at" + "email_enabled", + "slack_enabled", + "batch_similar_notifications", + "minimum_severity", + "deployment_failures_enabled", + "build_errors_enabled", + "runtime_errors_enabled", + "error_threshold", + "error_time_window", + "ssl_expiration_enabled", + "ssl_days_before_expiration", + "domain_expiration_enabled", + "dns_changes_enabled", + "backup_failures_enabled", + "backup_successes_enabled", + "s3_connection_issues_enabled", + "retention_policy_violations_enabled", + "route_downtime_enabled", + "load_balancer_issues_enabled", + "weekly_digest_enabled", + "digest_send_day", + "digest_send_time", + "digest_sections" ], + "type": "object" + }, + "NotificationProviderResponse": { "properties": { "config": {}, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "enabled": { "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -22977,36 +23027,47 @@ "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "id", + "name", + "provider_type", + "config", + "enabled", + "created_at", + "updated_at" + ], + "type": "object" }, "ObservabilityCompressionSettings": { - "type": "object", "description": "TimescaleDB compression policy configuration for append-only observability\ntables. Values are expressed in hours so operators can choose sub-day\nwindows while keeping the API representation unambiguous.", "properties": { "otel_spans_after_hours": { - "type": "integer", - "format": "int32", - "description": "Compress OpenTelemetry span chunks after this many hours. Defaults to\n24 hours.", "default": 24, + "description": "Compress OpenTelemetry span chunks after this many hours. Defaults to\n24 hours.", "example": 24, + "format": "int32", "maximum": 2160, - "minimum": 1 + "minimum": 1, + "type": "integer" }, "proxy_logs_after_hours": { - "type": "integer", - "format": "int32", - "description": "Compress proxy-log chunks after this many hours. Defaults to 24 hours.", "default": 24, + "description": "Compress proxy-log chunks after this many hours. Defaults to 24 hours.", "example": 24, + "format": "int32", "maximum": 720, - "minimum": 1 + "minimum": 1, + "type": "integer" } - } + }, + "type": "object" }, "ObservabilityEvent": { + "description": "Discriminated union of every row that can appear in the Observe list.\n\nSerializes to `{ \"type\": \"request\" | \"span\" | ... , ...rest }` so the UI\ncan switch on `event.type` without ambiguity.\n\n**No `Log` variant**: runtime stdout/stderr lines live on a dedicated\nLogs page rather than Observe. Logs are too high-volume to interleave\nwith business signals (requests, errors, revenue) without dominating\nthe timeline, and they have their own retention/storage constraints\n(TimescaleDB hypertable + chunked file/S3 store) that don't compose\nwith the merge service's per-kind LIMIT strategy.", "oneOf": [ { "allOf": [ @@ -23014,18 +23075,18 @@ "$ref": "#/components/schemas/RequestRow" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "request" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -23035,18 +23096,18 @@ "$ref": "#/components/schemas/SpanRow" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "span" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -23056,18 +23117,18 @@ "$ref": "#/components/schemas/ErrorRow" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "error" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -23077,90 +23138,73 @@ "$ref": "#/components/schemas/RevenueRow" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "revenue" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] } - ], - "description": "Discriminated union of every row that can appear in the Observe list.\n\nSerializes to `{ \"type\": \"request\" | \"span\" | ... , ...rest }` so the UI\ncan switch on `event.type` without ambiguity.\n\n**No `Log` variant**: runtime stdout/stderr lines live on a dedicated\nLogs page rather than Observe. Logs are too high-volume to interleave\nwith business signals (requests, errors, revenue) without dominating\nthe timeline, and they have their own retention/storage constraints\n(TimescaleDB hypertable + chunked file/S3 store) that don't compose\nwith the merge service's per-kind LIMIT strategy." + ] }, "ObservabilityRetentionSettings": { - "type": "object", "description": "Retention policy configuration for raw observability tables. Values are in\ndays. The Settings API applies them to TimescaleDB; ClickHouse-backed proxy\nlogs and spans retain their storage-level per-row TTL behavior.", "properties": { "otel_logs_days": { - "type": "integer", - "format": "int32", - "description": "Retain OpenTelemetry log events for this many days.", "default": 90, + "description": "Retain OpenTelemetry log events for this many days.", "example": 90, + "format": "int32", "maximum": 3650, - "minimum": 1 + "minimum": 1, + "type": "integer" }, "otel_metrics_days": { - "type": "integer", - "format": "int32", - "description": "Retain OpenTelemetry metric points for this many days.", "default": 90, + "description": "Retain OpenTelemetry metric points for this many days.", "example": 90, + "format": "int32", "maximum": 3650, - "minimum": 1 + "minimum": 1, + "type": "integer" }, "otel_spans_days": { - "type": "integer", - "format": "int32", - "description": "Retain OpenTelemetry spans (traces) for this many days.", "default": 90, + "description": "Retain OpenTelemetry spans (traces) for this many days.", "example": 90, + "format": "int32", "maximum": 3650, - "minimum": 1 + "minimum": 1, + "type": "integer" }, "proxy_logs_days": { - "type": "integer", - "format": "int32", - "description": "Retain proxy request logs for this many days.", "default": 30, + "description": "Retain proxy request logs for this many days.", "example": 30, + "format": "int32", "maximum": 3650, - "minimum": 1 + "minimum": 1, + "type": "integer" } - } + }, + "type": "object" }, "OidcProviderResponse": { - "type": "object", - "required": [ - "id", - "name", - "issuer_url", - "client_id", - "client_secret", - "scopes", - "jit_provisioning", - "enabled", - "template", - "group_claim", - "role_claim", - "default_role", - "trust_idp_email" - ], "properties": { "client_id": { "type": "string" }, "client_secret": { - "type": "string", - "description": "Always masked \u2014 the secret is never returned after creation." + "description": "Always masked — the secret is never returned after creation.", + "type": "string" }, "default_role": { "type": "string" @@ -23172,8 +23216,8 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "issuer_url": { "type": "string" @@ -23194,49 +23238,55 @@ "type": "string" }, "trust_idp_email": { - "type": "boolean", - "description": "When true, the resolver skips the `email_verified` claim gate\nduring SSO login. Only safe for IdPs where an admin controls\nuser provisioning \u2014 see `oidc_providers::Model::trust_idp_email`." + "description": "When true, the resolver skips the `email_verified` claim gate\nduring SSO login. Only safe for IdPs where an admin controls\nuser provisioning — see `oidc_providers::Model::trust_idp_email`.", + "type": "boolean" } - } - }, - "OidcProviderSummary": { - "type": "object", + }, "required": [ - "slug", + "id", "name", - "template" + "issuer_url", + "client_id", + "client_secret", + "scopes", + "jit_provisioning", + "enabled", + "template", + "group_claim", + "role_claim", + "default_role", + "trust_idp_email" ], + "type": "object" + }, + "OidcProviderSummary": { "properties": { "name": { "type": "string" }, "slug": { - "type": "string", - "description": "Stable opaque slug \u2014 use this as the path parameter when initiating\nOIDC login (`/auth/oidc/login/{slug}`). The integer database ID is\nintentionally omitted from this public endpoint to prevent provider\nenumeration." + "description": "Stable opaque slug — use this as the path parameter when initiating\nOIDC login (`/auth/oidc/login/{slug}`). The integer database ID is\nintentionally omitted from this public endpoint to prevent provider\nenumeration.", + "type": "string" }, "template": { - "type": "string", - "description": "The template the provider was created from \u2014 e.g. `keycloak`,\n`okta`, `auth0`, `google`, `azure-ad`, or `generic`. Surfaced on\nthe public login endpoint so the unauthenticated login page can\nrender the right brand logo on the \"Sign in with X\" button.\nNever sensitive \u2014 the template name is part of the provider's\npublic identity, not configuration." + "description": "The template the provider was created from — e.g. `keycloak`,\n`okta`, `auth0`, `google`, `azure-ad`, or `generic`. Surfaced on\nthe public login endpoint so the unauthenticated login page can\nrender the right brand logo on the \"Sign in with X\" button.\nNever sensitive — the template name is part of the provider's\npublic identity, not configuration.", + "type": "string" } - } - }, - "OidcProviderUserResponse": { - "type": "object", - "description": "A user that has logged in via a given OIDC provider. Used by the\nadmin \"Users for provider\" panel \u2014 the `oidc_subject` is the\nIdP-side identifier we matched on, useful when diagnosing why a\nuser can or can't log in.", + }, "required": [ - "id", + "slug", "name", - "email", - "email_verified", - "mfa_enabled", - "created_at", - "updated_at" + "template" ], + "type": "object" + }, + "OidcProviderUserResponse": { + "description": "A user that has logged in via a given OIDC provider. Used by the\nadmin \"Users for provider\" panel — the `oidc_subject` is the\nIdP-side identifier we matched on, useful when diagnosing why a\nuser can or can't log in.", "properties": { "created_at": { - "type": "string", + "example": "2024-01-15T14:30:00Z", "format": "date-time", - "example": "2024-01-15T14:30:00Z" + "type": "string" }, "email": { "type": "string" @@ -23245,8 +23295,8 @@ "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "mfa_enabled": { "type": "boolean" @@ -23261,62 +23311,67 @@ ] }, "updated_at": { - "type": "string", + "example": "2024-01-15T14:30:00Z", "format": "date-time", - "example": "2024-01-15T14:30:00Z" + "type": "string" } - } - }, - "OidcProvidersListResponse": { - "type": "object", + }, "required": [ - "providers" + "id", + "name", + "email", + "email_verified", + "mfa_enabled", + "created_at", + "updated_at" ], + "type": "object" + }, + "OidcProvidersListResponse": { "properties": { "providers": { - "type": "array", "items": { "$ref": "#/components/schemas/OidcProviderSummary" - } + }, + "type": "array" } - } - }, - "OidcRoleMappingResponse": { - "type": "object", + }, "required": [ - "id", - "provider_id", - "priority", - "idp_group", - "role" + "providers" ], + "type": "object" + }, + "OidcRoleMappingResponse": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "idp_group": { "type": "string" }, "priority": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "provider_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "role": { "type": "string" } - } - }, - "OidcTestConnectionResponse": { - "type": "object", + }, "required": [ - "success", - "message" + "id", + "provider_id", + "priority", + "idp_group", + "role" ], + "type": "object" + }, + "OidcTestConnectionResponse": { "properties": { "message": { "type": "string" @@ -23324,175 +23379,175 @@ "success": { "type": "boolean" } - } - }, - "OnDemandCertAttemptResponse": { - "type": "object", - "description": "A single on-demand HTTP-01 issuance attempt from the append-only\n`on_demand_cert_attempts` audit log. Carries the full forensic detail for one\nattempt; the current cert state lives on the enclosing row's domain fields.\n\nContains no private-key or certificate material \u2014 only audit metadata \u2014 so it\nis safe to return without masking.", + }, "required": [ - "id", - "hostname", - "trigger", - "outcome", - "created_at" + "success", + "message" ], + "type": "object" + }, + "OnDemandCertAttemptResponse": { + "description": "A single on-demand HTTP-01 issuance attempt from the append-only\n`on_demand_cert_attempts` audit log. Carries the full forensic detail for one\nattempt; the current cert state lives on the enclosing row's domain fields.\n\nContains no private-key or certificate material — only audit metadata — so it\nis safe to return without masking.", "properties": { "acme_request_sent": { + "description": "Did we reach the Let's Encrypt API?", "type": [ "boolean", "null" - ], - "description": "Did we reach the Let's Encrypt API?" + ] }, "acme_response_status": { + "description": "HTTP status or ACME error type returned by Let's Encrypt, when known.", "type": [ "string", "null" - ], - "description": "HTTP status or ACME error type returned by Let's Encrypt, when known." + ] }, "challenge_served": { + "description": "Did the proxy serve the `/.well-known/acme-challenge/` request?", "type": [ "boolean", "null" - ], - "description": "Did the proxy serve the `/.well-known/acme-challenge/` request?" + ] }, "created_at": { - "type": "integer", + "description": "When the attempt was recorded (epoch millis).", "format": "int64", - "description": "When the attempt was recorded (epoch millis)." + "type": "integer" }, "duration_ms": { + "description": "End-to-end issuance duration in milliseconds (0/None for skipped).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "End-to-end issuance duration in milliseconds (0/None for skipped)." + ] }, "error_category": { + "description": "Coarse error category for UI labelling: `\"rate_limited\"`, `\"dns_failure\"`,\n`\"acme_order_expired\"`, `\"challenge_mismatch\"`, `\"timeout\"`, `\"internal\"`.", "type": [ "string", "null" - ], - "description": "Coarse error category for UI labelling: `\"rate_limited\"`, `\"dns_failure\"`,\n`\"acme_order_expired\"`, `\"challenge_mismatch\"`, `\"timeout\"`, `\"internal\"`." + ] }, "error_chain": { + "description": "Full `Display` chain of the error (all `source()` levels), when failed.", "type": [ "string", "null" - ], - "description": "Full `Display` chain of the error (all `source()` levels), when failed." + ] }, "hostname": { - "type": "string", - "description": "SNI hostname that triggered the attempt." + "description": "SNI hostname that triggered the attempt.", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "outcome": { - "type": "string", - "description": "Final outcome: `\"issued\"`, `\"failed\"`, `\"skipped_duplicate\"`,\n`\"skipped_gate\"`, `\"skipped_rate_limit\"`, or `\"skipped_no_route\"`." + "description": "Final outcome: `\"issued\"`, `\"failed\"`, `\"skipped_duplicate\"`,\n`\"skipped_gate\"`, `\"skipped_rate_limit\"`, or `\"skipped_no_route\"`.", + "type": "string" }, "trigger": { - "type": "string", - "description": "What triggered the attempt (always `\"tls_callback\"` today)." + "description": "What triggered the attempt (always `\"tls_callback\"` today).", + "type": "string" } - } - }, - "OnDemandCertRow": { - "type": "object", - "description": "One row of the on-demand certificates list: the most-recent attempt for a\nhostname plus the current authoritative cert state from its `domains` row.", + }, "required": [ + "id", "hostname", - "attempt" + "trigger", + "outcome", + "created_at" ], + "type": "object" + }, + "OnDemandCertRow": { + "description": "One row of the on-demand certificates list: the most-recent attempt for a\nhostname plus the current authoritative cert state from its `domains` row.", "properties": { "attempt": { "$ref": "#/components/schemas/OnDemandCertAttemptResponse", "description": "The audit record for the attempt this row represents (newest first in\nthe list)." }, "backoff_until": { + "description": "On-demand negative-cache deadline (epoch millis), when in backoff.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "On-demand negative-cache deadline (epoch millis), when in backoff." + ] }, "expiration_time": { + "description": "Certificate expiration (epoch millis), when an active cert exists.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Certificate expiration (epoch millis), when an active cert exists." + ] }, "hostname": { - "type": "string", - "description": "SNI hostname." + "description": "SNI hostname.", + "type": "string" }, "status": { + "description": "Current cert lifecycle status from the `domains` row, when one exists:\n`on_demand_pending`, `on_demand_issuing`, `active`, `on_demand_failed`,\netc. `None` when no `domains` row exists yet for this hostname.", "type": [ "string", "null" - ], - "description": "Current cert lifecycle status from the `domains` row, when one exists:\n`on_demand_pending`, `on_demand_issuing`, `active`, `on_demand_failed`,\netc. `None` when no `domains` row exists yet for this hostname." + ] } - } + }, + "required": [ + "hostname", + "attempt" + ], + "type": "object" }, "OnDemandTlsSettings": { - "type": "object", - "description": "On-demand (lazy) HTTP-01 TLS issuance settings (ADR-018).\n\nWhen `enabled`, the proxy's `certificate_callback` triggers ACME HTTP-01\nissuance for allowlisted, STABLE hostnames (per-environment aliases and the\nconsole host) that have no active cert, rather than silently failing the\nhandshake. Ephemeral per-deployment hostnames are NEVER certed (ADR \u00a72).\n\nOff by default \u2014 operators opt in explicitly, except QuickStart (`sslip.io`)\ninstalls where `temps setup` auto-enables it and derives `zone`.", + "description": "On-demand (lazy) HTTP-01 TLS issuance settings (ADR-018).\n\nWhen `enabled`, the proxy's `certificate_callback` triggers ACME HTTP-01\nissuance for allowlisted, STABLE hostnames (per-environment aliases and the\nconsole host) that have no active cert, rather than silently failing the\nhandshake. Ephemeral per-deployment hostnames are NEVER certed (ADR §2).\n\nOff by default — operators opt in explicitly, except QuickStart (`sslip.io`)\ninstalls where `temps setup` auto-enables it and derives `zone`.", "properties": { "deployment_url_mode": { - "type": "string", - "description": "How ephemeral per-deployment hostnames behave when they have no cert\n(they are NEVER certed \u2014 see ADR \u00a72). One of:\n - `\"http\"` (default): serve plain HTTP on :80.\n - `\"redirect_to_env\"`: 308-redirect to the stable per-environment URL,\n which IS certed.", "default": "http", - "example": "http" + "description": "How ephemeral per-deployment hostnames behave when they have no cert\n(they are NEVER certed — see ADR §2). One of:\n - `\"http\"` (default): serve plain HTTP on :80.\n - `\"redirect_to_env\"`: 308-redirect to the stable per-environment URL,\n which IS certed.", + "example": "http", + "type": "string" }, "enabled": { - "type": "boolean", - "description": "Master switch. When `false` (default) the proxy's on-demand cert gate\nrejects every SNI and no issuance is ever triggered.", "default": false, - "example": false + "description": "Master switch. When `false` (default) the proxy's on-demand cert gate\nrejects every SNI and no issuance is ever triggered.", + "example": false, + "type": "boolean" }, "hourly_cap": { - "type": "integer", - "format": "int32", - "description": "Global cap on total on-demand issuances per hour across all hostnames\n(ADR \u00a74 Layer 3). The operator's self-imposed safety net, separate from\nthe Let's Encrypt rate limit.", "default": 10, + "description": "Global cap on total on-demand issuances per hour across all hostnames\n(ADR §4 Layer 3). The operator's self-imposed safety net, separate from\nthe Let's Encrypt rate limit.", "example": 10, - "minimum": 1 + "format": "int32", + "minimum": 1, + "type": "integer" }, "max_concurrent": { - "type": "integer", - "format": "int32", - "description": "Maximum number of ACME issuance flows allowed to run simultaneously\n(the concurrent-issuance semaphore, ADR \u00a74 Layer 1). Min 1.", "default": 3, + "description": "Maximum number of ACME issuance flows allowed to run simultaneously\n(the concurrent-issuance semaphore, ADR §4 Layer 1). Min 1.", "example": 3, - "minimum": 1 + "format": "int32", + "minimum": 1, + "type": "integer" }, "zone": { + "default": null, + "description": "Zone suffix for the allowlist gate. A hostname passes the gate only if\nit is a direct subdomain of this zone (e.g. zone `1.2.3.4.sslip.io`\nadmits `myapp.1.2.3.4.sslip.io` but not `deep.sub.1.2.3.4.sslip.io`).\n`None` (default) means \"auto-derive from `external_url`\"; if no zone can\nbe derived the gate rejects all SNI, disabling the feature.", + "example": "1.2.3.4.sslip.io", "type": [ "string", "null" - ], - "description": "Zone suffix for the allowlist gate. A hostname passes the gate only if\nit is a direct subdomain of this zone (e.g. zone `1.2.3.4.sslip.io`\nadmits `myapp.1.2.3.4.sslip.io` but not `deep.sub.1.2.3.4.sslip.io`).\n`None` (default) means \"auto-derive from `external_url`\"; if no zone can\nbe derived the gate rejects all SNI, disabling the feature.", - "default": null, - "example": "1.2.3.4.sslip.io" + ] } - } + }, + "type": "object" }, "OpenAiError": { - "type": "object", - "required": [ - "message", - "type" - ], "properties": { "code": { "type": [ @@ -23506,54 +23561,52 @@ "type": { "type": "string" } - } - }, - "OpenAiErrorResponse": { - "type": "object", + }, "required": [ - "error" + "message", + "type" ], + "type": "object" + }, + "OpenAiErrorResponse": { "properties": { "error": { "$ref": "#/components/schemas/OpenAiError" } - } - }, - "OperatingSystemCount": { - "type": "object", + }, "required": [ - "operating_system", - "count", - "percentage" + "error" ], + "type": "object" + }, + "OperatingSystemCount": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "operating_system": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "OperationResultResponse": { - "type": "object", + }, "required": [ - "operation", - "success", - "message", - "executed_at" + "operating_system", + "count", + "percentage" ], + "type": "object" + }, + "OperationResultResponse": { "properties": { "data": {}, "executed_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "message": { "type": "string" @@ -23564,44 +23617,42 @@ "success": { "type": "boolean" } - } - }, - "OperationResultsResponse": { - "type": "object", + }, "required": [ - "deployment_id", - "operations" + "operation", + "success", + "message", + "executed_at" ], + "type": "object" + }, + "OperationResultsResponse": { "properties": { "deployment_id": { "type": "string" }, "operations": { - "type": "array", "items": { "$ref": "#/components/schemas/OperationResultResponse" - } + }, + "type": "array" } - } - }, - "OtelDashboardResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "layout", - "created_at", - "updated_at" + "deployment_id", + "operations" ], + "type": "object" + }, + "OtelDashboardResponse": { "properties": { "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "layout": { "$ref": "#/components/schemas/DashboardLayout" @@ -23610,114 +23661,98 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" } - } - }, - "OtelDashboardsResponse": { - "type": "object", + }, "required": [ - "data", - "total" - ], - "properties": { + "id", + "project_id", + "name", + "layout", + "created_at", + "updated_at" + ], + "type": "object" + }, + "OtelDashboardsResponse": { + "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/OtelDashboardResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "OtelMetricAlertRuleResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "name", - "metric_name", - "aggregation", - "detection_kind", - "detection_config", - "window_secs", - "for_duration_secs", - "severity", - "enabled", - "last_state", - "label_filters", - "group_by", - "dynamic_alerts", - "max_series", - "grouped_notification_threshold", - "last_dropped_series_count", - "series_states", - "created_at", - "updated_at" + "data", + "total" ], + "type": "object" + }, + "OtelMetricAlertRuleResponse": { "properties": { "aggregation": { "type": "string" }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "detection_config": { "$ref": "#/components/schemas/DetectionConfig", "description": "The typed detector definition (discriminated union keyed by `kind`)." }, "detection_kind": { - "type": "string", - "description": "Coarse detector discriminator: `static|anomaly|forecast|outlier|auto_watch`." + "description": "Coarse detector discriminator: `static|anomaly|forecast|outlier|auto_watch`.", + "type": "string" }, "dynamic_alerts": { - "type": "boolean", - "description": "Whether per-series (\"dynamic\") alerting is enabled for this rule." + "description": "Whether per-series (\"dynamic\") alerting is enabled for this rule.", + "type": "boolean" }, "enabled": { "type": "boolean" }, "firing_series": { - "type": "array", + "description": "Currently-firing series for a dynamic rule, snapshotted from the evaluator's\nin-memory firing map at read time. Empty for static/aggregate rules or when\nnothing is firing.", "items": { "$ref": "#/components/schemas/FiringSeriesEntry" }, - "description": "Currently-firing series for a dynamic rule, snapshotted from the evaluator's\nin-memory firing map at read time. Empty for static/aggregate rules or when\nnothing is firing." + "type": "array" }, "for_duration_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "group_by": { - "type": "array", + "description": "Label keys the rule breaks the metric down by. Empty = one aggregate stream.", "items": { "type": "string" }, - "description": "Label keys the rule breaks the metric down by. Empty = one aggregate stream." + "type": "array" }, "grouped_notification_threshold": { - "type": "integer", + "description": "Notification-grouping threshold: when more than this many series fire in the\nsame tick, only the first gets chart/AI enrichment (1–1000).", "format": "int32", - "description": "Notification-grouping threshold: when more than this many series fire in the\nsame tick, only the first gets chart/AI enrichment (1\u20131000)." + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "label_filters": { - "type": "array", + "description": "AND-combined label equality filters applied when evaluating this rule.\nEmpty = no filtering (matches all series).", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -23726,37 +23761,38 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "AND-combined label equality filters applied when evaluating this rule.\nEmpty = no filtering (matches all series)." + "type": "array" }, "last_dropped_series_count": { - "type": "integer", + "description": "Number of series dropped by the cardinality cap on the latest dynamic tick\n(0 when nothing was dropped or for static/aggregate rules). Lets a UI warn\n\"N series were dropped this tick\" without reading server logs.", "format": "int32", - "description": "Number of series dropped by the cardinality cap on the latest dynamic tick\n(0 when nothing was dropped or for static/aggregate rules). Lets a UI warn\n\"N series were dropped this tick\" without reading server logs." + "type": "integer" }, "last_evaluated_at": { + "example": "2025-10-12T12:15:47.609192Z", "type": [ "string", "null" - ], - "example": "2025-10-12T12:15:47.609192Z" + ] }, "last_state": { - "type": "string", - "description": "One of `ok|firing|unknown`." + "description": "One of `ok|firing|unknown`.", + "type": "string" }, "last_value": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "max_series": { - "type": "integer", + "description": "Cardinality cap for dynamic alerting (1–100).", "format": "int32", - "description": "Cardinality cap for dynamic alerting (1\u2013100)." + "type": "integer" }, "metric_name": { "type": "string" @@ -23765,467 +23801,484 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "series_states": { - "type": "object", - "description": "Full per-series state snapshot persisted after the latest dynamic-rule tick,\nkeyed by the human-readable series label (`endpoint=/checkout`). Empty for\nstatic/aggregate rules. Unlike `firing_series` (a live in-memory snapshot),\nthis is decoded from the persisted `series_states` jsonb column, so an\nexternal consumer that only reads the rule row still sees per-series detail.", "additionalProperties": { "$ref": "#/components/schemas/SeriesStateEntry" }, + "description": "Full per-series state snapshot persisted after the latest dynamic-rule tick,\nkeyed by the human-readable series label (`endpoint=/checkout`). Empty for\nstatic/aggregate rules. Unlike `firing_series` (a live in-memory snapshot),\nthis is decoded from the persisted `series_states` jsonb column, so an\nexternal consumer that only reads the rule row still sees per-series detail.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "severity": { "type": "string" }, "updated_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "window_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "OtelMetricAlertsResponse": { - "type": "object", + }, "required": [ - "data", - "total" + "id", + "project_id", + "name", + "metric_name", + "aggregation", + "detection_kind", + "detection_config", + "window_secs", + "for_duration_secs", + "severity", + "enabled", + "last_state", + "label_filters", + "group_by", + "dynamic_alerts", + "max_series", + "grouped_notification_threshold", + "last_dropped_series_count", + "series_states", + "created_at", + "updated_at" ], + "type": "object" + }, + "OtelMetricAlertsResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/OtelMetricAlertRuleResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "OtelMetricLabelKeysResponse": { - "type": "object", + }, "required": [ - "keys" + "data", + "total" ], + "type": "object" + }, + "OtelMetricLabelKeysResponse": { "properties": { "keys": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "OtelMetricLabelValuesResponse": { - "type": "object", + }, "required": [ - "values" + "keys" ], + "type": "object" + }, + "OtelMetricLabelValuesResponse": { "properties": { "values": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "OtelMetricNamesResponse": { - "type": "object", + }, "required": [ - "names" + "values" ], + "type": "object" + }, + "OtelMetricNamesResponse": { "properties": { "names": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "OtelMetricsResponse": { - "type": "object", + }, "required": [ - "data", - "count" + "names" ], + "type": "object" + }, + "OtelMetricsResponse": { "properties": { "count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "data": { - "type": "array", "items": { "$ref": "#/components/schemas/MetricBucket" - } + }, + "type": "array" } - } + }, + "required": [ + "data", + "count" + ], + "type": "object" }, "OutlierAlgorithm": { - "type": "string", "description": "Outlier detection algorithm.", "enum": [ "dbscan", "scaled_dbscan", "mad", "scaled_mad" - ] + ], + "type": "string" }, "OutlierParams": { - "type": "object", - "description": "Outlier (cross-series population) detector parameters (stub \u2014 not evaluated).", - "required": [ - "peer_group_key" - ], + "description": "Outlier (cross-series population) detector parameters (stub — not evaluated).", "properties": { "algorithm": { "$ref": "#/components/schemas/OutlierAlgorithm" }, "peer_group_key": { - "type": "string", - "description": "Label key defining the peer population compared across series (e.g. `host`)." + "description": "Label key defining the peer population compared across series (e.g. `host`).", + "type": "string" }, "tolerance": { - "type": "number", + "description": "Sensitivity; higher tolerates larger spread before flagging.", "format": "double", - "description": "Sensitivity; higher tolerates larger spread before flagging." + "type": "number" } - } + }, + "required": [ + "peer_group_key" + ], + "type": "object" }, "OverprovisioningAssessment": { - "type": "object", "description": "Requests-vs-capacity-vs-usage assessment", - "required": [ - "verdict", - "explanation" - ], "properties": { "cpu_request_inflation_ratio": { + "description": "Ratio of requested CPU to measured CPU usage (e.g. 40.0 = requests\nreserve 40× what the workloads actually use). `None` without metrics.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Ratio of requested CPU to measured CPU usage (e.g. 40.0 = requests\nreserve 40\u00d7 what the workloads actually use). `None` without metrics." + ] }, "cpu_requested_pct": { + "description": "Requested CPU as % of cluster capacity", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Requested CPU as % of cluster capacity" + ] }, "cpu_utilization_pct": { + "description": "Measured CPU usage as % of cluster capacity (`None` without metrics)", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Measured CPU usage as % of cluster capacity (`None` without metrics)" + ] }, "explanation": { - "type": "string", - "description": "Human-readable explanation of the verdict, e.g. \"Cluster capacity is\n8 vCPU but measured usage is 0.3 vCPU (3.7%) \u2014 severely overprovisioned\"" + "description": "Human-readable explanation of the verdict, e.g. \"Cluster capacity is\n8 vCPU but measured usage is 0.3 vCPU (3.7%) — severely overprovisioned\"", + "type": "string" }, "memory_request_inflation_ratio": { + "description": "Ratio of requested memory to measured memory usage", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Ratio of requested memory to measured memory usage" + ] }, "memory_requested_pct": { + "description": "Requested memory as % of cluster capacity", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Requested memory as % of cluster capacity" + ] }, "memory_utilization_pct": { + "description": "Measured memory usage as % of cluster capacity (`None` without metrics)", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Measured memory usage as % of cluster capacity (`None` without metrics)" + ] }, "verdict": { "$ref": "#/components/schemas/OverprovisioningVerdict", "description": "Overall verdict" } - } + }, + "required": [ + "verdict", + "explanation" + ], + "type": "object" }, "OverprovisioningVerdict": { - "type": "string", "description": "Overall overprovisioning verdict", "enum": [ "severe", "moderate", "reasonable", "unknown" - ] + ], + "type": "string" }, "PageActivityBucket": { - "type": "object", "description": "Time bucket data point for page activity graph", - "required": [ - "timestamp", - "visitors", - "page_views", - "avg_time_seconds" - ], "properties": { "avg_time_seconds": { - "type": "number", + "description": "Average time on page in seconds", "format": "double", - "description": "Average time on page in seconds" + "type": "number" }, "page_views": { - "type": "integer", + "description": "Number of page views in this bucket", "format": "int64", - "description": "Number of page views in this bucket" + "type": "integer" }, "timestamp": { - "type": "string", - "description": "Timestamp for this bucket (ISO 8601)" + "description": "Timestamp for this bucket (ISO 8601)", + "type": "string" }, "visitors": { - "type": "integer", + "description": "Number of unique visitors in this bucket", "format": "int64", - "description": "Number of unique visitors in this bucket" + "type": "integer" } - } - }, - "PageCountryStats": { - "type": "object", - "description": "Geographic distribution of visitors for a page", + }, "required": [ - "country", + "timestamp", "visitors", "page_views", - "percentage" + "avg_time_seconds" ], + "type": "object" + }, + "PageCountryStats": { + "description": "Geographic distribution of visitors for a page", "properties": { "country": { - "type": "string", - "description": "Country name" + "description": "Country name", + "type": "string" }, "country_code": { + "description": "ISO country code (2-letter)", "type": [ "string", "null" - ], - "description": "ISO country code (2-letter)" + ] }, "page_views": { - "type": "integer", + "description": "Number of page views from this country", "format": "int64", - "description": "Number of page views from this country" + "type": "integer" }, "percentage": { - "type": "number", + "description": "Percentage of total visitors", "format": "double", - "description": "Percentage of total visitors" + "type": "number" }, "visitors": { - "type": "integer", + "description": "Number of unique visitors from this country", "format": "int64", - "description": "Number of unique visitors from this country" + "type": "integer" } - } + }, + "required": [ + "country", + "visitors", + "page_views", + "percentage" + ], + "type": "object" }, "PageFlowEntry": { - "type": "object", "description": "A single page with its entry/exit/bounce statistics", - "required": [ - "page_path", - "entry_count", - "exit_count", - "bounce_count", - "total_views", - "entry_rate", - "exit_rate", - "bounce_rate" - ], "properties": { "avg_time_on_page": { + "description": "Average time spent on this page in seconds", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Average time spent on this page in seconds" + ] }, "bounce_count": { - "type": "integer", + "description": "Number of times visitors bounced on this page", "format": "int64", - "description": "Number of times visitors bounced on this page" + "type": "integer" }, "bounce_rate": { - "type": "number", + "description": "Bounce rate: bounce_count / entry_count (only meaningful for entry pages)", "format": "double", - "description": "Bounce rate: bounce_count / entry_count (only meaningful for entry pages)" + "type": "number" }, "entry_count": { - "type": "integer", + "description": "Number of times this page was the entry page of a session", "format": "int64", - "description": "Number of times this page was the entry page of a session" + "type": "integer" }, "entry_rate": { - "type": "number", + "description": "Entry rate: entry_count / total_views", "format": "double", - "description": "Entry rate: entry_count / total_views" + "type": "number" }, "exit_count": { - "type": "integer", + "description": "Number of times this page was the exit page of a session", "format": "int64", - "description": "Number of times this page was the exit page of a session" + "type": "integer" }, "exit_rate": { - "type": "number", + "description": "Exit rate: exit_count / total_views", "format": "double", - "description": "Exit rate: exit_count / total_views" + "type": "number" }, "page_path": { - "type": "string", - "description": "The page path (e.g. \"/pricing\", \"/docs/getting-started\")" + "description": "The page path (e.g. \"/pricing\", \"/docs/getting-started\")", + "type": "string" }, "total_views": { - "type": "integer", + "description": "Total page views for this page", "format": "int64", - "description": "Total page views for this page" + "type": "integer" } - } + }, + "required": [ + "page_path", + "entry_count", + "exit_count", + "bounce_count", + "total_views", + "entry_rate", + "exit_rate", + "bounce_rate" + ], + "type": "object" }, "PageFlowQuery": { - "type": "object", "description": "Query parameters for page flow analytics", - "required": [ - "project_id", - "start_date", - "end_date" - ], "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "description": "Maximum number of entry/exit pages to return (default: 20)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of entry/exit pages to return (default: 20)" + ] }, "min_views_for_dropoff": { + "description": "Minimum views for drop-off analysis (default: 5)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Minimum views for drop-off analysis (default: 5)" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "transitions_limit": { + "description": "Maximum number of transitions to return (default: 50)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of transitions to return (default: 50)" + ] } - } + }, + "required": [ + "project_id", + "start_date", + "end_date" + ], + "type": "object" }, "PageFlowResponse": { - "type": "object", "description": "Complete page flow analytics response", - "required": [ - "top_entry_pages", - "top_exit_pages", - "drop_off_points", - "transitions", - "total_pages", - "total_sessions" - ], "properties": { "drop_off_points": { - "type": "array", + "description": "Top drop-off points (highest exit rates with meaningful traffic)", "items": { "$ref": "#/components/schemas/DropOffPoint" }, - "description": "Top drop-off points (highest exit rates with meaningful traffic)" + "type": "array" }, "top_entry_pages": { - "type": "array", + "description": "Top entry pages (where visitors land), sorted by entry_count DESC", "items": { "$ref": "#/components/schemas/PageFlowEntry" }, - "description": "Top entry pages (where visitors land), sorted by entry_count DESC" + "type": "array" }, "top_exit_pages": { - "type": "array", + "description": "Top exit pages (where visitors leave), sorted by exit_count DESC", "items": { "$ref": "#/components/schemas/PageFlowEntry" }, - "description": "Top exit pages (where visitors leave), sorted by exit_count DESC" + "type": "array" }, "total_pages": { - "type": "integer", + "description": "Total unique pages seen in the period", "format": "int64", - "description": "Total unique pages seen in the period" + "type": "integer" }, "total_sessions": { - "type": "integer", + "description": "Total sessions in the period", "format": "int64", - "description": "Total sessions in the period" + "type": "integer" }, "transitions": { - "type": "array", + "description": "Page-to-page transitions (most common navigation paths)", "items": { "$ref": "#/components/schemas/PageTransition" }, - "description": "Page-to-page transitions (most common navigation paths)" + "type": "array" } - } + }, + "required": [ + "top_entry_pages", + "top_exit_pages", + "drop_off_points", + "transitions", + "total_pages", + "total_sessions" + ], + "type": "object" }, "PageHourlySessionsQuery": { - "type": "object", "description": "Query parameters for page hourly sessions endpoint", - "required": [ - "page_path", - "project_id", - "start_time", - "end_time" - ], "properties": { "bucket_interval": { "type": [ @@ -24234,193 +24287,192 @@ ] }, "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page_path": { "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "PageHourlySessionsResponse": { - "type": "object", + }, "required": [ "page_path", - "hourly_data", - "total_sessions", - "hours" + "project_id", + "start_time", + "end_time" ], + "type": "object" + }, + "PageHourlySessionsResponse": { "properties": { "hourly_data": { - "type": "array", "items": { "$ref": "#/components/schemas/HourlyPageSessions" - } + }, + "type": "array" }, "hours": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "page_path": { "type": "string" }, "total_sessions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PagePathDetailQuery": { - "type": "object", - "description": "Query parameters for page path detail analytics", + }, "required": [ "page_path", - "project_id", - "start_date", - "end_date" + "hourly_data", + "total_sessions", + "hours" ], + "type": "object" + }, + "PagePathDetailQuery": { + "description": "Query parameters for page path detail analytics", "properties": { "bucket_interval": { + "description": "Bucket interval for time series: 'hour', 'day', 'week', 'month' (default: auto)", "type": [ "string", "null" - ], - "description": "Bucket interval for time series: 'hour', 'day', 'week', 'month' (default: auto)" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page_path": { - "type": "string", - "description": "The specific page path to get details for (URL-encoded)" + "description": "The specific page path to get details for (URL-encoded)", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "PagePathDetailResponse": { - "type": "object", - "description": "Detailed analytics response for a specific page path", + }, "required": [ "page_path", - "unique_visitors", - "total_page_views", - "avg_time_on_page", - "bounce_rate", - "entry_rate", - "exit_rate", - "activity_over_time", - "countries", - "referrers", - "bucket_interval" + "project_id", + "start_date", + "end_date" ], + "type": "object" + }, + "PagePathDetailResponse": { + "description": "Detailed analytics response for a specific page path", "properties": { "activity_over_time": { - "type": "array", + "description": "Time series data for activity graph", "items": { "$ref": "#/components/schemas/PageActivityBucket" }, - "description": "Time series data for activity graph" + "type": "array" }, "avg_time_on_page": { - "type": "number", + "description": "Average time on page in seconds", "format": "double", - "description": "Average time on page in seconds" + "type": "number" }, "bounce_rate": { - "type": "number", + "description": "Bounce rate percentage (0-100)", "format": "double", - "description": "Bounce rate percentage (0-100)" + "type": "number" }, "bucket_interval": { - "type": "string", - "description": "Bucket interval used for time series ('hour', 'day', etc.)" + "description": "Bucket interval used for time series ('hour', 'day', etc.)", + "type": "string" }, "countries": { - "type": "array", + "description": "Geographic distribution of visitors", "items": { "$ref": "#/components/schemas/PageCountryStats" }, - "description": "Geographic distribution of visitors" + "type": "array" }, "entry_rate": { - "type": "number", + "description": "Entry rate - percentage of sessions that started on this page", "format": "double", - "description": "Entry rate - percentage of sessions that started on this page" + "type": "number" }, "exit_rate": { - "type": "number", + "description": "Exit rate - percentage of sessions that ended on this page", "format": "double", - "description": "Exit rate - percentage of sessions that ended on this page" + "type": "number" }, "page_path": { - "type": "string", - "description": "The page path being analyzed" + "description": "The page path being analyzed", + "type": "string" }, "referrers": { - "type": "array", + "description": "Top referrers to this page", "items": { "$ref": "#/components/schemas/PageReferrerStats" }, - "description": "Top referrers to this page" + "type": "array" }, "total_page_views": { - "type": "integer", + "description": "Total page views in the date range", "format": "int64", - "description": "Total page views in the date range" + "type": "integer" }, "unique_visitors": { - "type": "integer", + "description": "Total unique visitors to this page in the date range", "format": "int64", - "description": "Total unique visitors to this page in the date range" + "type": "integer" } - } - }, - "PagePathInfo": { - "type": "object", + }, "required": [ "page_path", - "session_count", - "page_view_count", - "first_seen", - "last_seen" + "unique_visitors", + "total_page_views", + "avg_time_on_page", + "bounce_rate", + "entry_rate", + "exit_rate", + "activity_over_time", + "countries", + "referrers", + "bucket_interval" ], + "type": "object" + }, + "PagePathInfo": { "properties": { "avg_time_seconds": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "first_seen": { "type": "string" @@ -24432,893 +24484,900 @@ "type": "string" }, "page_view_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "session_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PagePathSparkline": { - "type": "object", + }, "required": [ "page_path", - "points" + "session_count", + "page_view_count", + "first_seen", + "last_seen" ], + "type": "object" + }, + "PagePathSparkline": { "properties": { "page_path": { "type": "string" }, "points": { - "type": "array", "items": { "$ref": "#/components/schemas/PagePathSparklinePoint" - } + }, + "type": "array" } - } - }, - "PagePathSparklinePoint": { - "type": "object", + }, "required": [ - "timestamp", - "session_count" + "page_path", + "points" ], + "type": "object" + }, + "PagePathSparklinePoint": { "properties": { "session_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "timestamp": { "type": "string" } - } + }, + "required": [ + "timestamp", + "session_count" + ], + "type": "object" }, "PagePathVisitorsQuery": { - "type": "object", "description": "Query parameters for page path visitors", - "required": [ - "page_path", - "project_id", - "start_date", - "end_date" - ], "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page": { + "description": "Page number (1-based, default: 1)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Page number (1-based, default: 1)", - "minimum": 0 + ] }, "page_path": { - "type": "string", - "description": "The specific page path to get visitors for" + "description": "The specific page path to get visitors for", + "type": "string" }, "per_page": { + "description": "Items per page (default: 50, max: 100)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Items per page (default: 50, max: 100)", - "minimum": 0 + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "PagePathVisitorsResponse": { - "type": "object", - "description": "Response for page path visitors endpoint", + }, "required": [ "page_path", - "total_count", - "page", - "per_page", - "sessions" + "project_id", + "start_date", + "end_date" ], + "type": "object" + }, + "PagePathVisitorsResponse": { + "description": "Response for page path visitors endpoint", "properties": { "page": { - "type": "integer", - "format": "int64", "description": "Current page number", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "page_path": { - "type": "string", - "description": "The page path" + "description": "The page path", + "type": "string" }, "per_page": { - "type": "integer", - "format": "int64", "description": "Items per page", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "sessions": { - "type": "array", + "description": "Individual visitor sessions", "items": { "$ref": "#/components/schemas/PageVisitorSession" }, - "description": "Individual visitor sessions" + "type": "array" }, "total_count": { - "type": "integer", + "description": "Total number of visitor sessions matching the query", "format": "int64", - "description": "Total number of visitor sessions matching the query" + "type": "integer" } - } - }, - "PagePathsQuery": { - "type": "object", + }, "required": [ - "project_id" + "page_path", + "total_count", + "page", + "per_page", + "sessions" ], + "type": "object" + }, + "PagePathsQuery": { "properties": { "end_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } - } - }, - "PagePathsResponse": { - "type": "object", + }, "required": [ - "page_paths", - "total_count" + "project_id" ], + "type": "object" + }, + "PagePathsResponse": { "properties": { "page_paths": { - "type": "array", "items": { "$ref": "#/components/schemas/PagePathInfo" - } + }, + "type": "array" }, "total_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "page_paths", + "total_count" + ], + "type": "object" }, "PagePathsSparklineQuery": { - "type": "object", "description": "Query parameters for batch page paths sparkline endpoint", - "required": [ - "project_id", - "start_time", - "end_time", - "page_paths" - ], "properties": { "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page_paths": { - "type": "string", - "description": "Comma-separated list of page paths" + "description": "Comma-separated list of page paths", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "PagePathsSparklineResponse": { - "type": "object", + }, "required": [ - "sparklines" + "project_id", + "start_time", + "end_time", + "page_paths" ], + "type": "object" + }, + "PagePathsSparklineResponse": { "properties": { "sparklines": { - "type": "array", "items": { "$ref": "#/components/schemas/PagePathSparkline" - } + }, + "type": "array" } - } + }, + "required": [ + "sparklines" + ], + "type": "object" }, "PageReferrerStats": { - "type": "object", "description": "Referrer source for the page", - "required": [ - "referrer", - "visits", - "percentage" - ], "properties": { "percentage": { - "type": "number", + "description": "Percentage of total visits", "format": "double", - "description": "Percentage of total visits" + "type": "number" }, "referrer": { - "type": "string", - "description": "Referrer URL or domain" + "description": "Referrer URL or domain", + "type": "string" }, "visits": { - "type": "integer", + "description": "Number of visits from this referrer", "format": "int64", - "description": "Number of visits from this referrer" + "type": "integer" } - } - }, - "PageSessionComparison": { - "type": "object", + }, "required": [ - "page_path", - "date", - "session_count", - "event_count", - "avg_duration_seconds" + "referrer", + "visits", + "percentage" ], + "type": "object" + }, + "PageSessionComparison": { "properties": { "avg_duration_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "date": { "type": "string" }, "event_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "page_path": { "type": "string" }, "session_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PageSessionStats": { - "type": "object", + }, "required": [ "page_path", - "total_sessions", - "avg_time_seconds", - "min_time_seconds", - "max_time_seconds", - "total_page_views", - "avg_page_views_per_session" + "date", + "session_count", + "event_count", + "avg_duration_seconds" ], + "type": "object" + }, + "PageSessionStats": { "properties": { "avg_page_views_per_session": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "avg_time_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "max_time_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "min_time_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "page_path": { "type": "string" }, "total_page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_sessions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PageSessionStatsQuery": { - "type": "object", + }, "required": [ "page_path", - "project_id", - "start_date", - "end_date" + "total_sessions", + "avg_time_seconds", + "min_time_seconds", + "max_time_seconds", + "total_page_views", + "avg_page_views_per_session" ], + "type": "object" + }, + "PageSessionStatsQuery": { "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "page_path": { "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "page_path", + "project_id", + "start_date", + "end_date" + ], + "type": "object" }, "PageTransition": { - "type": "object", "description": "A page-to-page transition with count", - "required": [ - "from_page", - "to_page", - "transition_count", - "percentage" - ], "properties": { "from_page": { - "type": "string", - "description": "The source page path" + "description": "The source page path", + "type": "string" }, "percentage": { - "type": "number", + "description": "Percentage of transitions from the source page that go to this destination", "format": "double", - "description": "Percentage of transitions from the source page that go to this destination" + "type": "number" }, "to_page": { - "type": "string", - "description": "The destination page path" + "description": "The destination page path", + "type": "string" }, "transition_count": { - "type": "integer", + "description": "Number of times this transition occurred", "format": "int64", - "description": "Number of times this transition occurred" + "type": "integer" } - } - }, - "PageVisit": { - "type": "object", + }, "required": [ - "path", - "visits" + "from_page", + "to_page", + "transition_count", + "percentage" ], + "type": "object" + }, + "PageVisit": { "properties": { "path": { "type": "string" }, "visits": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "path", + "visits" + ], + "type": "object" }, "PageVisitorSession": { - "type": "object", "description": "Individual visitor session that viewed a specific page", - "required": [ - "visitor_id", - "visitor_uuid", - "viewed_at", - "is_entry", - "is_exit", - "is_bounce" - ], "properties": { "browser": { + "description": "Browser name", "type": [ "string", "null" - ], - "description": "Browser name" + ] }, "city": { + "description": "Visitor's city", "type": [ "string", "null" - ], - "description": "Visitor's city" + ] }, "country": { + "description": "Visitor's country", "type": [ "string", "null" - ], - "description": "Visitor's country" + ] }, "country_code": { + "description": "Visitor's country code", "type": [ "string", "null" - ], - "description": "Visitor's country code" + ] }, "device_type": { + "description": "Device type (Desktop, Mobile, Tablet)", "type": [ "string", "null" - ], - "description": "Device type (Desktop, Mobile, Tablet)" + ] }, "is_bounce": { - "type": "boolean", - "description": "Whether this was a bounce" + "description": "Whether this was a bounce", + "type": "boolean" }, "is_entry": { - "type": "boolean", - "description": "Whether this was the entry page for the session" + "description": "Whether this was the entry page for the session", + "type": "boolean" }, "is_exit": { - "type": "boolean", - "description": "Whether this was the exit page for the session" + "description": "Whether this was the exit page for the session", + "type": "boolean" }, "operating_system": { + "description": "Operating system", "type": [ "string", "null" - ], - "description": "Operating system" + ] }, "referrer": { + "description": "Referrer URL", "type": [ "string", "null" - ], - "description": "Referrer URL" + ] }, "session_id": { + "description": "Session ID", "type": [ "string", "null" - ], - "description": "Session ID" + ] }, "session_page_number": { + "description": "Page number in session flow", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Page number in session flow" + ] }, "time_on_page": { + "description": "Time spent on this page in seconds", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Time spent on this page in seconds" + ] }, "viewed_at": { - "type": "string", + "description": "When the page was viewed", "format": "date-time", - "description": "When the page was viewed" + "type": "string" }, "visitor_id": { - "type": "integer", + "description": "Visitor numeric ID", "format": "int32", - "description": "Visitor numeric ID" + "type": "integer" }, "visitor_uuid": { - "type": "string", - "description": "Visitor UUID" + "description": "Visitor UUID", + "type": "string" } - } - }, - "PagesComparisonResponse": { - "type": "object", + }, "required": [ - "comparisons", - "page_paths" + "visitor_id", + "visitor_uuid", + "viewed_at", + "is_entry", + "is_exit", + "is_bounce" ], + "type": "object" + }, + "PagesComparisonResponse": { "properties": { "comparisons": { - "type": "array", "items": { "$ref": "#/components/schemas/PageSessionComparison" - } + }, + "type": "array" }, "page_paths": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "PaginatedEmailsResponse": { - "type": "object", + }, "required": [ - "data", - "total", - "page", - "page_size" + "comparisons", + "page_paths" ], + "type": "object" + }, + "PaginatedEmailsResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/EmailResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "PaginatedEntitiesResponse": { - "type": "object", + }, "required": [ - "entities", - "count", - "limit", - "has_more" + "data", + "total", + "page", + "page_size" ], + "type": "object" + }, + "PaginatedEntitiesResponse": { "properties": { "count": { - "type": "integer", "description": "Number of entities returned", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "entities": { - "type": "array", + "description": "List of entities", "items": { "$ref": "#/components/schemas/EntityResponse" }, - "description": "List of entities" + "type": "array" }, "has_more": { - "type": "boolean", - "description": "Whether there are more entities available" + "description": "Whether there are more entities available", + "type": "boolean" }, "limit": { - "type": "integer", "description": "Limit used for this request", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "next_token": { + "description": "Continuation token for next page (S3, etc.)", "type": [ "string", "null" - ], - "description": "Continuation token for next page (S3, etc.)" + ] }, "total": { + "description": "Total number of entities (if available)", + "minimum": 0, "type": [ "integer", "null" - ], - "description": "Total number of entities (if available)", - "minimum": 0 + ] } - } - }, - "PaginatedErrorEventsResponse": { - "type": "object", + }, "required": [ - "data", - "pagination" + "entities", + "count", + "limit", + "has_more" ], + "type": "object" + }, + "PaginatedErrorEventsResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/ErrorEventResponse" - } + }, + "type": "array" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" } - } - }, - "PaginatedErrorGroupsResponse": { - "type": "object", + }, "required": [ "data", "pagination" ], + "type": "object" + }, + "PaginatedErrorGroupsResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/ErrorGroupResponse" - } + }, + "type": "array" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" } - } - }, - "PaginatedEventsResponse": { - "type": "object", + }, "required": [ - "events", - "total", - "page", - "page_size" + "data", + "pagination" ], + "type": "object" + }, + "PaginatedEventsResponse": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/TrackingEventResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "PaginatedExternalImagesResponse": { - "type": "object", + }, "required": [ - "data", + "events", "total", "page", "page_size" ], + "type": "object" + }, + "PaginatedExternalImagesResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/ExternalImageResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "PaginatedProjectList": { - "type": "object", + }, "required": [ - "projects", + "data", "total", "page", - "per_page" + "page_size" ], + "type": "object" + }, + "PaginatedProjectList": { "properties": { "page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "per_page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "projects": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PaginatedStaticBundlesResponse": { - "type": "object", + }, "required": [ - "data", + "projects", "total", "page", - "page_size" + "per_page" ], + "type": "object" + }, + "PaginatedStaticBundlesResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/StaticBundleResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "data", + "total", + "page", + "page_size" + ], + "type": "object" }, "Pagination": { - "type": "object", "description": "SDK pagination cursor. We use opaque page numbers internally but\nexpose `count`/`next`/`prev` the way `@vercel/sandbox` expects.", - "required": [ - "count" - ], "properties": { "count": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "next": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "prev": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } - } - }, - "PaginationMeta": { - "type": "object", + }, "required": [ - "page", - "page_size", - "total_count", - "total_pages" + "count" ], + "type": "object" + }, + "PaginationMeta": { "properties": { "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_count": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_pages": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "page", + "page_size", + "total_count", + "total_pages" + ], + "type": "object" }, "PaginationParams": { - "type": "object", "properties": { "page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "per_page": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "type": "object" }, "PasswordProtectionConfig": { - "type": "object", "description": "Password protection configuration\n\nWhen enabled, the proxy shows an HTML password form before allowing access.\nAfter the user enters the correct password, an HMAC-signed cookie is set\nso subsequent requests pass through without re-entering the password.", - "required": [ - "enabled", - "passwordHash" - ], "properties": { "enabled": { - "type": "boolean", - "description": "Whether password protection is enabled" + "description": "Whether password protection is enabled", + "type": "boolean" }, "passwordHash": { - "type": "string", - "description": "The bcrypt-hashed password (never stored or returned in plaintext)" + "description": "The bcrypt-hashed password (never stored or returned in plaintext)", + "type": "string" } - } + }, + "required": [ + "enabled", + "passwordHash" + ], + "type": "object" }, "PatchSettingsRequest": { - "type": "object", "properties": { "auto_upgrade": { "type": [ @@ -25327,12 +25386,12 @@ ] }, "host_port": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "image": { "type": [ @@ -25340,116 +25399,112 @@ "null" ] } - } + }, + "type": "object" }, "PathVisitors": { - "type": "object", - "required": [ - "name", - "visitors", - "percentage" - ], "properties": { "name": { "type": "string" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "visitors": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "PathVisitorsAnalyticsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "name", + "visitors", + "percentage" ], + "type": "object" + }, + "PathVisitorsAnalyticsQuery": { "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "PathVisitorsResponse": { - "type": "object", + }, "required": [ - "results" + "start_date", + "end_date", + "project_id" ], + "type": "object" + }, + "PathVisitorsResponse": { "properties": { "results": { - "type": "array", "items": { "$ref": "#/components/schemas/PathVisitors" - } + }, + "type": "array" } - } + }, + "required": [ + "results" + ], + "type": "object" }, "PeerEntry": { - "type": "object", "description": "Wire-format peer entry. Matches `temps_network::config::Peer` but\nuses strings on the wire to keep the API stable across underlying\ntype evolution.", - "required": [ - "node_id", - "compute_cidr", - "underlay_address" - ], "properties": { "compute_cidr": { - "type": "string", - "description": "Per-node CIDR (e.g. `\"172.20.5.0/24\"`)." + "description": "Per-node CIDR (e.g. `\"172.20.5.0/24\"`).", + "type": "string" }, "node_id": { - "type": "string", - "description": "Stable v5 UUID derived from the database node id. Workers use\nthis as the kernel-layer identifier when calling\n`NetworkManager::reconcile_peers`." + "description": "Stable v5 UUID derived from the database node id. Workers use\nthis as the kernel-layer identifier when calling\n`NetworkManager::reconcile_peers`.", + "type": "string" }, "underlay_address": { - "type": "string", - "description": "Address the local node should use to reach this peer over the\nunderlay (private VPC IP for same-DC, public IP for cross-DC)." + "description": "Address the local node should use to reach this peer over the\nunderlay (private VPC IP for same-DC, public IP for cross-DC).", + "type": "string" } - } + }, + "required": [ + "node_id", + "compute_cidr", + "underlay_address" + ], + "type": "object" }, "PeerListResponse": { - "type": "object", "description": "Response body for `GET /internal/nodes/{node_id}/network/peers`.", - "required": [ - "peers", - "cluster_dns_enabled" - ], "properties": { "alloc": { "oneOf": [ @@ -25463,31 +25518,25 @@ ] }, "cluster_dns_enabled": { - "type": "boolean", - "description": "Whether the cluster-DNS resolver is enabled on this control plane\n(`AppSettings.cluster_dns.enabled`). Workers should start their\nper-node resolver and write `overlay_bridge_address` only when this\nis `true`. Always serialized (never `skip_serializing_if`) so older\nand newer version skew degrades to the safe default of `false`." + "description": "Whether the cluster-DNS resolver is enabled on this control plane\n(`AppSettings.cluster_dns.enabled`). Workers should start their\nper-node resolver and write `overlay_bridge_address` only when this\nis `true`. Always serialized (never `skip_serializing_if`) so older\nand newer version skew degrades to the safe default of `false`.", + "type": "boolean" }, "peers": { - "type": "array", + "description": "All other nodes with a `compute_cidr` set, excluding the caller.", "items": { "$ref": "#/components/schemas/PeerEntry" }, - "description": "All other nodes with a `compute_cidr` set, excluding the caller." + "type": "array" } - } + }, + "required": [ + "peers", + "cluster_dns_enabled" + ], + "type": "object" }, "PendingActionResponse": { - "type": "object", "description": "A proposed AI write action awaiting human confirmation.", - "required": [ - "public_id", - "operation_id", - "method", - "summary", - "status", - "step_index", - "params", - "created_at" - ], "properties": { "confirmed_at": { "type": [ @@ -25520,11 +25569,11 @@ "description": "The flat params to be replayed at execute time (shown pre-execution for review)." }, "plan_public_id": { + "description": "Set when this action is one step of a multi-step plan (chained actions);\nall steps of the plan share this id. Absent for standalone single actions.", "type": [ "string", "null" - ], - "description": "Set when this action is one step of a multi-step plan (chained actions);\nall steps of the plan share this id. Absent for standalone single actions." + ] }, "public_id": { "type": "string" @@ -25540,317 +25589,323 @@ "type": "string" }, "step_index": { - "type": "integer", + "description": "0-based order of this step within its plan (0 for standalone actions).", "format": "int32", - "description": "0-based order of this step within its plan (0 for standalone actions)." + "type": "integer" }, "summary": { "type": "string" } - } + }, + "required": [ + "public_id", + "operation_id", + "method", + "summary", + "status", + "step_index", + "params", + "created_at" + ], + "type": "object" }, "PerformanceMetricsQuery": { "allOf": [ { "$ref": "#/components/schemas/SpeedSegmentFilters", - "description": "Segment filters (filter_path, filter_country, filter_region,\nfilter_city, filter_browser, filter_operating_system) \u2014 flattened so\neach remains a top-level query string param." + "description": "Segment filters (filter_path, filter_country, filter_region,\nfilter_city, filter_browser, filter_operating_system) — flattened so\neach remains a top-level query string param." }, { - "type": "object", - "required": [ - "start_date", - "end_date", - "project_id" - ], "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "device_type": { + "description": "Device type filter: \"desktop\" or \"mobile\"", "type": [ "string", "null" - ], - "description": "Device type filter: \"desktop\" or \"mobile\"" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "include_bots": { + "description": "Include crawler/datacenter (bot) samples. Defaults to false — bots\nare excluded from the read view but always stored at ingest.", "type": [ "boolean", "null" - ], - "description": "Include crawler/datacenter (bot) samples. Defaults to false \u2014 bots\nare excluded from the read view but always stored at ingest." + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" } ] }, "PerformanceMetricsResponse": { - "type": "object", "properties": { "cls": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "cls_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fcp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "fid_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "inp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "lcp_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p75": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p90": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p95": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "ttfb_p99": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] } - } + }, + "type": "object" }, "PermissionInfo": { - "type": "object", "description": "Information about a single permission", - "required": [ - "name", - "description", - "category" - ], "properties": { "category": { - "type": "string", - "description": "Category of the permission (e.g., \"Projects\", \"Deployments\")" + "description": "Category of the permission (e.g., \"Projects\", \"Deployments\")", + "type": "string" }, "description": { - "type": "string", - "description": "Human-readable description of the permission" + "description": "Human-readable description of the permission", + "type": "string" }, "name": { - "type": "string", - "description": "The permission identifier (e.g., \"projects:read\")" + "description": "The permission identifier (e.g., \"projects:read\")", + "type": "string" } - } - }, - "PgUpgradeLogResponse": { - "type": "object", + }, "required": [ - "log_id", - "content" + "name", + "description", + "category" ], + "type": "object" + }, + "PgUpgradeLogResponse": { "properties": { "content": { "type": "string" @@ -25858,27 +25913,18 @@ "log_id": { "type": "string" } - } - }, - "PgUpgradeResponse": { - "type": "object", + }, "required": [ - "id", - "service_id", - "from_version", - "to_version", - "from_image", - "to_image", - "status", - "phase", "log_id", - "attempt", - "created_at" + "content" ], + "type": "object" + }, + "PgUpgradeResponse": { "properties": { "attempt": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { "type": "string" @@ -25902,8 +25948,8 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "log_id": { "type": "string" @@ -25912,11 +25958,11 @@ "type": "string" }, "pre_upgrade_backup_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "rollback_volume_name": { "type": [ @@ -25925,8 +25971,8 @@ ] }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "started_at": { "type": [ @@ -25943,141 +25989,149 @@ "to_version": { "type": "string" } - } + }, + "required": [ + "id", + "service_id", + "from_version", + "to_version", + "from_image", + "to_image", + "status", + "phase", + "log_id", + "attempt", + "created_at" + ], + "type": "object" }, "PipelineStats": { - "type": "object", "description": "Internal pipeline statistics for self-observability.", - "required": [ - "metrics_received", - "metrics_stored", - "metrics_dropped", - "spans_received", - "spans_stored", - "spans_dropped", - "logs_received", - "logs_stored_db", - "logs_stored_s3", - "logs_dropped", - "ingest_errors" - ], "properties": { "ingest_errors": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "logs_dropped": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "logs_received": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "logs_stored_db": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "logs_stored_s3": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "metrics_dropped": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "metrics_received": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "metrics_stored": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "spans_dropped": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "spans_received": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "spans_stored": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "PipelineStatsResponse": { - "type": "object", + }, "required": [ - "stats" + "metrics_received", + "metrics_stored", + "metrics_dropped", + "spans_received", + "spans_stored", + "spans_dropped", + "logs_received", + "logs_stored_db", + "logs_stored_s3", + "logs_dropped", + "ingest_errors" ], + "type": "object" + }, + "PipelineStatsResponse": { "properties": { "stats": { "$ref": "#/components/schemas/PipelineStats" } - } + }, + "required": [ + "stats" + ], + "type": "object" }, "PlanComplexity": { - "type": "string", "description": "Plan complexity indicator", "enum": [ "low", "medium", "high" - ] + ], + "type": "string" }, "PlanMetadata": { - "type": "object", "description": "Plan metadata", - "required": [ - "generated_at", - "generator_version", - "complexity", - "warnings" - ], "properties": { "complexity": { "$ref": "#/components/schemas/PlanComplexity", "description": "Estimated complexity (low, medium, high)" }, "generated_at": { - "type": "string", + "description": "When the plan was generated", "format": "date-time", - "description": "When the plan was generated" + "type": "string" }, "generator_version": { - "type": "string", - "description": "Generator (importer) version" + "description": "Generator (importer) version", + "type": "string" }, "warnings": { - "type": "array", + "description": "Warnings detected during planning", "items": { "type": "string" }, - "description": "Warnings detected during planning" + "type": "array" } - } - }, - "PlanSourceBackup": { - "type": "object", + }, "required": [ - "location", - "location_was_resolved", - "format" + "generated_at", + "generator_version", + "complexity", + "warnings" ], + "type": "object" + }, + "PlanSourceBackup": { "properties": { "created_at": { "type": [ @@ -26086,135 +26140,136 @@ ] }, "format": { - "type": "string", - "description": "\"walg\", \"pg_dump\", \"unknown\"." + "description": "\"walg\", \"pg_dump\", \"unknown\".", + "type": "string" }, "id": { + "description": "DB id, absent for orphan (S3-scan) backups.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "DB id, absent for orphan (S3-scan) backups." + ] }, "location": { - "type": "string", - "description": "Resolved S3 location the orchestrator will actually use." + "description": "Resolved S3 location the orchestrator will actually use.", + "type": "string" }, "location_was_resolved": { - "type": "boolean", - "description": "True when the original row's `s3_location` was empty and we resolved\na location by probing S3. The UI shows this as a warning." + "description": "True when the original row's `s3_location` was empty and we resolved\na location by probing S3. The UI shows this as a warning.", + "type": "boolean" }, "origin_service_name": { + "description": "Service that originally produced the backup, if known.", "type": [ "string", "null" - ], - "description": "Service that originally produced the backup, if known." + ] }, "size_bytes": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } - } - }, - "PlanTarget": { - "type": "object", + }, "required": [ - "id", - "name", - "container" + "location", + "location_was_resolved", + "format" ], + "type": "object" + }, + "PlanTarget": { "properties": { "container": { - "type": "string", - "description": "Expected Docker container name." + "description": "Expected Docker container name.", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "container" + ], + "type": "object" }, "PlatformInfo": { - "type": "object", "description": "Platform compatibility information", - "required": [ - "os_type", - "architecture", - "platforms" - ], "properties": { "architecture": { - "type": "string", - "description": "System architecture (e.g., \"x86_64\", \"aarch64\")" + "description": "System architecture (e.g., \"x86_64\", \"aarch64\")", + "type": "string" }, "os_type": { - "type": "string", - "description": "Operating system type (e.g., \"linux\", \"windows\", \"darwin\")" + "description": "Operating system type (e.g., \"linux\", \"windows\", \"darwin\")", + "type": "string" }, "platforms": { - "type": "array", + "description": "List of supported platforms in \"os/arch\" format (e.g., [\"linux/amd64\"])", "items": { "type": "string" }, - "description": "List of supported platforms in \"os/arch\" format (e.g., [\"linux/amd64\"])" + "type": "array" } - } - }, - "PluginManifest": { - "type": "object", - "description": "The complete plugin manifest \u2014 the handshake contract.", + }, "required": [ - "name", - "version" + "os_type", + "architecture", + "platforms" ], + "type": "object" + }, + "PluginManifest": { + "description": "The complete plugin manifest — the handshake contract.", "properties": { "description": { + "description": "Short description of what the plugin does", "type": [ "string", "null" - ], - "description": "Short description of what the plugin does" + ] }, "display_name": { + "description": "Human-readable display name", "type": [ "string", "null" - ], - "description": "Human-readable display name" + ] }, "events": { - "type": "array", + "description": "Platform event types the plugin subscribes to.\n\nWhen specified, Temps will POST matching events to the plugin's\n`/_events` endpoint. Uses dot-notation event names matching the\nwebhook event types (e.g., \"deployment.succeeded\", \"project.created\").\n\nAvailable events:\n- `deployment.created`, `deployment.succeeded`, `deployment.failed`,\n `deployment.cancelled`, `deployment.ready`\n- `project.created`, `project.deleted`\n- `domain.created`, `domain.provisioned`", "items": { "type": "string" }, - "description": "Platform event types the plugin subscribes to.\n\nWhen specified, Temps will POST matching events to the plugin's\n`/_events` endpoint. Uses dot-notation event names matching the\nwebhook event types (e.g., \"deployment.succeeded\", \"project.created\").\n\nAvailable events:\n- `deployment.created`, `deployment.succeeded`, `deployment.failed`,\n `deployment.cancelled`, `deployment.ready`\n- `project.created`, `project.deleted`\n- `domain.created`, `domain.provisioned`" + "type": "array" }, "health_path": { - "type": "string", - "description": "Health check endpoint path (relative to plugin root)" + "description": "Health check endpoint path (relative to plugin root)", + "type": "string" }, "name": { - "type": "string", - "description": "Unique plugin identifier (kebab-case, e.g., \"backup-manager\")" + "description": "Unique plugin identifier (kebab-case, e.g., \"backup-manager\")", + "type": "string" }, "nav": { - "type": "array", + "description": "Navigation entries for the UI sidebar", "items": { "$ref": "#/components/schemas/NavEntry" }, - "description": "Navigation entries for the UI sidebar" + "type": "array" }, "requires_db": { - "type": "boolean", - "description": "Whether the plugin needs database access" + "description": "Whether the plugin needs database access", + "type": "boolean" }, "ui": { "oneOf": [ @@ -26228,123 +26283,129 @@ ] }, "version": { - "type": "string", - "description": "SemVer version string" + "description": "SemVer version string", + "type": "string" } - } + }, + "required": [ + "name", + "version" + ], + "type": "object" }, "PortMapping": { - "type": "object", "description": "Port mapping", - "required": [ - "container_port", - "protocol", - "is_primary" - ], "properties": { "container_port": { - "type": "integer", - "format": "int32", "description": "Container port", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "host_port": { + "description": "Host port (optional - can be assigned dynamically)", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Host port (optional - can be assigned dynamically)", - "minimum": 0 + ] }, "is_primary": { - "type": "boolean", - "description": "Whether this is the primary HTTP port" + "description": "Whether this is the primary HTTP port", + "type": "boolean" }, "protocol": { "$ref": "#/components/schemas/Protocol", "description": "Protocol (tcp, udp)" } - } - }, - "PostgresWalHealth": { - "type": "object", + }, "required": [ - "probed_at", - "pg_wal_bytes", - "max_wal_size_bytes", - "archive_mode", - "archive_backlog", - "stale_slots", - "oldest_wal_age_secs", - "warnings" + "container_port", + "protocol", + "is_primary" ], + "type": "object" + }, + "PostgresWalHealth": { "properties": { "archive_backlog": { - "type": "integer", + "description": "Number of `archive_status/*.ready` files — un-shipped WAL segments.", "format": "int64", - "description": "Number of `archive_status/*.ready` files \u2014 un-shipped WAL segments." + "type": "integer" }, "archive_command": { + "description": "The literal `archive_command` setting. May be empty or `/bin/true`\nwhen archiving is effectively disabled despite `archive_mode = on`.", "type": [ "string", "null" - ], - "description": "The literal `archive_command` setting. May be empty or `/bin/true`\nwhen archiving is effectively disabled despite `archive_mode = on`." + ] }, "archive_mode": { "$ref": "#/components/schemas/ArchiveMode" }, "archiver_failed_count": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "archiver_last_failed_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "max_wal_size_bytes": { - "type": "integer", + "description": "`max_wal_size` setting in bytes (parsed from `pg_settings`).", "format": "int64", - "description": "`max_wal_size` setting in bytes (parsed from `pg_settings`)." + "type": "integer" }, "oldest_wal_age_secs": { - "type": "integer", + "description": "Age of the oldest WAL file in `pg_wal/` (seconds).", "format": "int64", - "description": "Age of the oldest WAL file in `pg_wal/` (seconds)." + "type": "integer" }, "pg_wal_bytes": { - "type": "integer", + "description": "Total size of files under `pg_wal/`, from `pg_ls_waldir()`.", "format": "int64", - "description": "Total size of files under `pg_wal/`, from `pg_ls_waldir()`." + "type": "integer" }, "probed_at": { - "type": "string", + "description": "When the snapshot was taken.", "format": "date-time", - "description": "When the snapshot was taken." + "type": "string" }, "stale_slots": { - "type": "array", "items": { "$ref": "#/components/schemas/StaleSlot" - } + }, + "type": "array" }, "warnings": { - "type": "array", + "description": "Computed warnings, ordered by severity (critical first).", "items": { "$ref": "#/components/schemas/WalWarning" }, - "description": "Computed warnings, ordered by severity (critical first)." + "type": "array" } - } + }, + "required": [ + "probed_at", + "pg_wal_bytes", + "max_wal_size_bytes", + "archive_mode", + "archive_backlog", + "stale_slots", + "oldest_wal_age_secs", + "warnings" + ], + "type": "object" }, "PresetConfigSchema": { + "description": "Union type for preset configurations\nUse the appropriate configuration type based on your preset", "oneOf": [ { "$ref": "#/components/schemas/DockerfilePresetConfig", @@ -26362,153 +26423,145 @@ "$ref": "#/components/schemas/StaticPresetConfig", "description": "Configuration for static site presets (Vite, Next.js, etc.)" } - ], - "description": "Union type for preset configurations\nUse the appropriate configuration type based on your preset" + ] }, "PresetInfo": { - "type": "object", "description": "Detected preset information", - "required": [ - "path", - "preset", - "preset_label", - "project_type" - ], "properties": { "compose_files": { - "type": [ - "array", - "null" - ], + "description": "Compose file paths found in the repository (only for docker-compose preset)", "items": { "type": "string" }, - "description": "Compose file paths found in the repository (only for docker-compose preset)" + "type": [ + "array", + "null" + ] }, "exposed_port": { + "description": "Default exposed port for this preset", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default exposed port for this preset" + ] }, "icon_url": { + "description": "Icon URL for this preset", "type": [ "string", "null" - ], - "description": "Icon URL for this preset" + ] }, "path": { - "type": "string", - "description": "Path where preset was detected (empty for root)" + "description": "Path where preset was detected (empty for root)", + "type": "string" }, "preset": { - "type": "string", - "description": "Preset slug (e.g., \"nextjs\", \"fastapi\")" + "description": "Preset slug (e.g., \"nextjs\", \"fastapi\")", + "type": "string" }, "preset_label": { - "type": "string", - "description": "Human-readable preset label" + "description": "Human-readable preset label", + "type": "string" }, "project_type": { - "type": "string", - "description": "Project type (e.g., \"frontend\", \"backend\", \"fullstack\")" + "description": "Project type (e.g., \"frontend\", \"backend\", \"fullstack\")", + "type": "string" } - } - }, - "PresetResponse": { - "type": "object", + }, "required": [ - "slug", - "label", - "icon_url", - "project_type", - "description" + "path", + "preset", + "preset_label", + "project_type" ], + "type": "object" + }, + "PresetResponse": { "properties": { "default_port": { + "description": "Default port the application listens on (None for static sites)", + "example": 3000, + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default port the application listens on (None for static sites)", - "example": 3000, - "minimum": 0 + ] }, "description": { - "type": "string", - "description": "Description of what this preset does" + "description": "Description of what this preset does", + "type": "string" }, "icon_url": { - "type": "string", - "description": "Icon URL for the preset" + "description": "Icon URL for the preset", + "type": "string" }, "label": { - "type": "string", - "description": "Display name/label for the preset" + "description": "Display name/label for the preset", + "type": "string" }, "project_type": { - "type": "string", - "description": "Project type (server or static)" + "description": "Project type (server or static)", + "type": "string" }, "slug": { - "type": "string", - "description": "Unique identifier slug for the preset" + "description": "Unique identifier slug for the preset", + "type": "string" } - } + }, + "required": [ + "slug", + "label", + "icon_url", + "project_type", + "description" + ], + "type": "object" }, "PreviewGatewaySettings": { - "type": "object", "description": "Workspace preview gateway settings.\n\nThe preview gateway is a single shared Docker container that lives on the\n`temps-sandbox-net` network and routes requests to workspace sandbox dev\nservers based on the `Host` header (`ws--.`).\n`temps serve` reconciles this container on startup; these settings let an\noperator override the image, host port, and auto-upgrade behavior.", "properties": { "auto_upgrade": { - "type": "boolean", - "description": "When true (default), the supervisor will pull and apply the image\npinned in the Temps binary on every startup. When false, the\ncurrently-running image is left alone \u2014 operators upgrade manually\nfrom the settings UI.", "default": true, - "example": true + "description": "When true (default), the supervisor will pull and apply the image\npinned in the Temps binary on every startup. When false, the\ncurrently-running image is left alone — operators upgrade manually\nfrom the settings UI.", + "example": true, + "type": "boolean" }, "host_port": { - "type": "integer", - "format": "int32", - "description": "Host port to publish the gateway on (always bound to 127.0.0.1).\nPingora forwards `ws-*` traffic to this port after authenticating.", "default": 8090, + "description": "Host port to publish the gateway on (always bound to 127.0.0.1).\nPingora forwards `ws-*` traffic to this port after authenticating.", "example": 8090, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "image": { - "type": "string", - "description": "Docker image reference for the gateway. Pinned per Temps release.\nOperators can override this to test a custom build.", "default": "ghcr.io/gotempsh/temps-preview-gateway:latest", - "example": "ghcr.io/gotempsh/temps-preview-gateway:latest" + "description": "Docker image reference for the gateway. Pinned per Temps release.\nOperators can override this to test a custom build.", + "example": "ghcr.io/gotempsh/temps-preview-gateway:latest", + "type": "string" }, "shared_secret": { - "type": "string", - "description": "Shared secret the host-side Pingora sends on every forwarded preview\nrequest via `X-Temps-Preview-Token`; the gateway rejects requests\nwithout it. Auto-generated on first boot, persisted in DB so the\nsecret is stable across `temps serve` restarts regardless of cwd,\n`TEMPS_DATA_DIR`, or data-dir changes. MUST be masked (`***`) in any\nAPI response \u2014 never expose it over HTTP.", "default": "", - "example": "" + "description": "Shared secret the host-side Pingora sends on every forwarded preview\nrequest via `X-Temps-Preview-Token`; the gateway rejects requests\nwithout it. Auto-generated on first boot, persisted in DB so the\nsecret is stable across `temps serve` restarts regardless of cwd,\n`TEMPS_DATA_DIR`, or data-dir changes. MUST be masked (`***`) in any\nAPI response — never expose it over HTTP.", + "example": "", + "type": "string" } - } + }, + "type": "object" }, "PreviewGatewaySettingsMasked": { - "type": "object", "description": "Preview gateway settings with `shared_secret` elided.", - "required": [ - "image", - "host_port", - "auto_upgrade", - "shared_secret_set" - ], "properties": { "auto_upgrade": { "type": "boolean" }, "host_port": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "image": { "type": "string" @@ -26516,267 +26569,263 @@ "shared_secret_set": { "type": "boolean" } - } - }, - "PreviewGatewaySettingsResponse": { - "type": "object", + }, "required": [ "image", "host_port", "auto_upgrade", - "default_image", - "default_host_port" + "shared_secret_set" ], + "type": "object" + }, + "PreviewGatewaySettingsResponse": { "properties": { "auto_upgrade": { "type": "boolean" }, "default_host_port": { - "type": "integer", - "format": "int32", "description": "The compile-time default host port.", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "default_image": { - "type": "string", - "description": "The compile-time default image \u2014 exposed so the UI can offer a\n\"Reset to default\" link without round-tripping." + "description": "The compile-time default image — exposed so the UI can offer a\n\"Reset to default\" link without round-tripping.", + "type": "string" }, "host_port": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "image": { "type": "string" } - } + }, + "required": [ + "image", + "host_port", + "auto_upgrade", + "default_image", + "default_host_port" + ], + "type": "object" }, "PreviewShareLinkBody": { - "type": "object", "description": "Request body for minting a preview share link.", - "required": [ - "port" - ], "properties": { "path": { + "description": "Path the recipient lands on. Must be same-origin (start with a single\n`/`); anything else is replaced with `/` so a share link can never be\nturned into an open redirect.", "type": [ "string", "null" - ], - "description": "Path the recipient lands on. Must be same-origin (start with a single\n`/`); anything else is replaced with `/` so a share link can never be\nturned into an open redirect." + ] }, "port": { - "type": "integer", - "format": "int32", "description": "Port inside the sandbox the preview serves on.", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "ttl_seconds": { + "description": "How long the link stays usable, in seconds. Clamped to 24 hours.\nDefaults to one hour — long enough to send to a reviewer, short enough\nthat a link pasted in a ticket does not stay live indefinitely.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "How long the link stays usable, in seconds. Clamped to 24 hours.\nDefaults to one hour \u2014 long enough to send to a reviewer, short enough\nthat a link pasted in a ticket does not stay live indefinitely.", - "minimum": 0 + ] } - } - }, - "PreviewShareLinkResponse": { - "type": "object", + }, "required": [ - "url", - "expires_at" + "port" ], + "type": "object" + }, + "PreviewShareLinkResponse": { "properties": { "expires_at": { - "type": "integer", - "format": "int64", "description": "Unix seconds after which the link stops working.", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "url": { - "type": "string", - "description": "The full link. Its fragment contains the grant and must be treated as a\ncredential; URL fragments are not sent to servers or in Referer headers." + "description": "The full link. Its fragment contains the grant and must be treated as a\ncredential; URL fragments are not sent to servers or in Referer headers.", + "type": "string" } - } - }, - "PricingResponse": { - "type": "object", + }, "required": [ - "models" + "url", + "expires_at" ], + "type": "object" + }, + "PricingResponse": { "properties": { "models": { - "type": "array", "items": { "$ref": "#/components/schemas/ModelPricing" - } + }, + "type": "array" } - } + }, + "required": [ + "models" + ], + "type": "object" }, "ProblemDetails": { - "type": "object", "description": "Representation of a Problem error to return to the client.\nFollows RFC 7807 - Problem Details for HTTP APIs", - "required": [ - "title", - "extensions" - ], + "example": { + "additional_info": "Custom field with additional details", + "detail": "The server encountered an unexpected condition", + "instance": "/account/12345/msgs/abc", + "title": "Internal Server Error", + "type": "https://example.com/probs/out-of-memory" + }, "properties": { "detail": { + "description": "A human-readable explanation specific to this occurrence of the problem", + "example": "The server encountered an unexpected condition", "type": [ "string", "null" - ], - "description": "A human-readable explanation specific to this occurrence of the problem", - "example": "The server encountered an unexpected condition" + ] }, "extensions": { - "type": "object", + "additionalProperties": true, "description": "Additional properties of the problem", - "additionalProperties": true + "type": "object" }, "instance": { + "description": "A URI reference that identifies the specific occurrence of the problem", + "example": "/account/12345/msgs/abc", "type": [ "string", "null" - ], - "description": "A URI reference that identifies the specific occurrence of the problem", - "example": "/account/12345/msgs/abc" + ] }, "title": { - "type": "string", "description": "A short, human-readable summary of the problem type", - "example": "Internal Server Error" + "example": "Internal Server Error", + "type": "string" }, "type": { + "description": "A URI reference that identifies the problem type", + "example": "https://example.com/probs/out-of-memory", "type": [ "string", "null" - ], - "description": "A URI reference that identifies the problem type", - "example": "https://example.com/probs/out-of-memory" + ] } }, - "example": { - "type": "https://example.com/probs/out-of-memory", - "title": "Internal Server Error", - "detail": "The server encountered an unexpected condition", - "instance": "/account/12345/msgs/abc", - "additional_info": "Custom field with additional details" - } - }, - "ProjectAccessResponse": { - "type": "object", "required": [ - "id", - "project_id", - "team_id", - "role", - "granted_by", - "created_at", - "updated_at" + "title", + "extensions" ], + "type": "object" + }, + "ProjectAccessResponse": { "properties": { "created_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" }, "granted_by": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "role": { "$ref": "#/components/schemas/TeamRole" }, "team_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "team_id", + "role", + "granted_by", + "created_at", + "updated_at" + ], + "type": "object" }, "ProjectConfiguration": { - "type": "object", "description": "Project-level configuration", - "required": [ - "name", - "slug", - "project_type", - "is_web_app" - ], "properties": { "is_web_app": { - "type": "boolean", - "description": "Whether this is a web application" + "description": "Whether this is a web application", + "type": "boolean" }, "name": { - "type": "string", - "description": "Proposed project name" + "description": "Proposed project name", + "type": "string" }, "project_type": { "$ref": "#/components/schemas/ProjectType", "description": "Project type" }, "slug": { - "type": "string", - "description": "Proposed slug (URL-safe identifier)" + "description": "Proposed slug (URL-safe identifier)", + "type": "string" } - } - }, - "ProjectDSNResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", "name", - "public_key", - "dsn", - "created_at", - "is_active", - "event_count" + "slug", + "project_type", + "is_web_app" ], + "type": "object" + }, + "ProjectDSNResponse": { "properties": { "created_at": { "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "dsn": { "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -26785,169 +26834,173 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "public_key": { "type": "string" } - } - }, - "ProjectDashboardAnalytics": { - "type": "object", - "description": "Analytics data for a single project in the dashboard batch response", + }, "required": [ + "id", "project_id", - "unique_visitors", - "previous_unique_visitors", - "hourly_visits" + "name", + "public_key", + "dsn", + "created_at", + "is_active", + "event_count" ], + "type": "object" + }, + "ProjectDashboardAnalytics": { + "description": "Analytics data for a single project in the dashboard batch response", "properties": { "hourly_visits": { - "type": "array", + "description": "Hourly sparkline data points", "items": { "$ref": "#/components/schemas/EventTimeline" }, - "description": "Hourly sparkline data points" + "type": "array" }, "previous_unique_visitors": { - "type": "integer", + "description": "Unique visitor count in the previous period (same duration, shifted back)", "format": "int64", - "description": "Unique visitor count in the previous period (same duration, shifted back)" + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trend_percentage": { + "description": "Percentage change from previous period (positive = growth, negative = decline)\nNull when previous period had zero visitors (no baseline to compare)", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Percentage change from previous period (positive = growth, negative = decline)\nNull when previous period had zero visitors (no baseline to compare)" + ] }, "unique_visitors": { - "type": "integer", + "description": "Unique visitor count in the current time range", "format": "int64", - "description": "Unique visitor count in the current time range" + "type": "integer" } - } - }, - "ProjectHealthSummary": { - "type": "object", - "description": "Health summary for a single project (last 1 hour)", + }, "required": [ "project_id", - "total_requests", - "total_errors", - "avg_response_time_ms", - "error_rate", - "status" + "unique_visitors", + "previous_unique_visitors", + "hourly_visits" ], + "type": "object" + }, + "ProjectHealthSummary": { + "description": "Health summary for a single project (last 1 hour)", "properties": { "avg_response_time_ms": { - "type": "number", + "description": "Average response time in ms", "format": "double", - "description": "Average response time in ms" + "type": "number" }, "error_rate": { - "type": "number", + "description": "Error rate as a percentage (0-100)", "format": "double", - "description": "Error rate as a percentage (0-100)" + "type": "number" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { - "type": "string", - "description": "Health status: \"healthy\", \"degraded\", \"down\", \"unknown\"" + "description": "Health status: \"healthy\", \"degraded\", \"down\", \"unknown\"", + "type": "string" }, "total_errors": { - "type": "integer", + "description": "Total server errors (status >= 500) in the period", "format": "int64", - "description": "Total server errors (status >= 500) in the period" + "type": "integer" }, "total_requests": { - "type": "integer", + "description": "Total requests in the period", "format": "int64", - "description": "Total requests in the period" + "type": "integer" } - } - }, - "ProjectInfo": { - "type": "object", + }, "required": [ - "id", - "slug", - "created_at" + "project_id", + "total_requests", + "total_errors", + "avg_response_time_ms", + "error_rate", + "status" ], + "type": "object" + }, + "ProjectInfo": { "properties": { "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "slug": { "type": "string" } - } + }, + "required": [ + "id", + "slug", + "created_at" + ], + "type": "object" }, "ProjectMonitorHealth": { - "type": "object", "description": "Health summary for a single project based on its production monitors", - "required": [ - "project_id", - "status" - ], "properties": { "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { - "type": "string", - "description": "Overall status: \"operational\", \"degraded\", \"down\", or \"no_monitors\"" + "description": "Overall status: \"operational\", \"degraded\", \"down\", or \"no_monitors\"", + "type": "string" } - } - }, - "ProjectPresetResponse": { - "type": "object", + }, "required": [ - "path", - "preset", - "presetLabel", - "projectType" + "project_id", + "status" ], + "type": "object" + }, + "ProjectPresetResponse": { "properties": { "composeFiles": { - "type": [ - "array", - "null" - ], + "description": "Compose file paths found in the repository (only for docker-compose preset)", "items": { "type": "string" }, - "description": "Compose file paths found in the repository (only for docker-compose preset)" + "type": [ + "array", + "null" + ] }, "exposedPort": { + "description": "Default exposed port for this preset (e.g., 3000 for Next.js, 8000 for FastAPI)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default exposed port for this preset (e.g., 3000 for Next.js, 8000 for FastAPI)" + ] }, "iconUrl": { + "description": "Icon URL for the preset", "type": [ "string", "null" - ], - "description": "Icon URL for the preset" + ] }, "path": { "type": "string" @@ -26959,103 +27012,90 @@ "type": "string" }, "projectType": { - "type": "string", - "description": "Project type category (e.g., \"frontend\", \"backend\", \"fullstack\")" + "description": "Project type category (e.g., \"frontend\", \"backend\", \"fullstack\")", + "type": "string" } - } - }, - "ProjectQuery": { - "type": "object", + }, "required": [ - "project_id" + "path", + "preset", + "presetLabel", + "projectType" ], + "type": "object" + }, + "ProjectQuery": { "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "project_id" + ], + "type": "object" }, "ProjectRef": { - "type": "object", "description": "A lightweight project descriptor included in `UnifiedTrace`.", - "required": [ - "project_id", - "project_name", - "project_slug" - ], "properties": { "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" }, "project_slug": { - "type": "string", - "description": "URL slug used to link a span back into its owning project's trace view." + "description": "URL slug used to link a span back into its owning project's trace view.", + "type": "string" } - } - }, - "ProjectResponse": { - "type": "object", + }, "required": [ - "id", - "slug", - "name", - "directory", - "main_branch", - "created_at", - "updated_at", - "deployment_config", - "attack_mode", - "ai_write_actions_enabled", - "error_source_context_enabled", - "enable_preview_environments", - "preview_envs_on_demand", - "preview_envs_idle_timeout_seconds", - "preview_envs_wake_timeout_seconds", - "source_type", - "cross_project_trace_sharing" + "project_id", + "project_name", + "project_slug" ], + "type": "object" + }, + "ProjectResponse": { "properties": { "ai_alert_summaries_enabled": { + "description": "Opt-in to AI summarization of metric alert notifications (NULL/false = off).", "type": [ "boolean", "null" - ], - "description": "Opt-in to AI summarization of metric alert notifications (NULL/false = off)." + ] }, "ai_debug_chat_enabled": { + "description": "Opt-in to AI debugging chat, e.g. on deployment failures (NULL/false = off).", "type": [ "boolean", "null" - ], - "description": "Opt-in to AI debugging chat, e.g. on deployment failures (NULL/false = off)." + ] }, "ai_write_actions_enabled": { - "type": "boolean", - "description": "Opt-in to AI propose-then-confirm write capability (false = off)." + "description": "Opt-in to AI propose-then-confirm write capability (false = off).", + "type": "boolean" }, "attack_mode": { - "type": "boolean", - "description": "Attack mode - when enabled, requires CAPTCHA verification for all project environments" + "description": "Attack mode - when enabled, requires CAPTCHA verification for all project environments", + "type": "boolean" }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "cross_project_trace_sharing": { - "type": "boolean", - "description": "ADR-027 Phase 3 opt-out: when false, this project's traces are suppressed\nfrom cross-project discovery results. Default true (consistent with the\nOSS global-observability model where any OtelRead holder can query any\nproject's telemetry)." + "description": "ADR-027 Phase 3 opt-out: when false, this project's traces are suppressed\nfrom cross-project discovery results. Default true (consistent with the\nOSS global-observability model where any OtelRead holder can query any\nproject's telemetry).", + "type": "boolean" }, "deployment_config": { "$ref": "#/components/schemas/DeploymentConfig", @@ -27065,53 +27105,53 @@ "type": "string" }, "enable_preview_environments": { - "type": "boolean", - "description": "Enable automatic preview environment creation for each branch" + "description": "Enable automatic preview environment creation for each branch", + "type": "boolean" }, "error_source_context_enabled": { - "type": "boolean", - "description": "Opt-in to native error-tracking source context (false = off). When on,\nTemps stores uploaded source files and shows source code in stack traces." + "description": "Opt-in to native error-tracking source context (false = off). When on,\nTemps stores uploaded source files and shows source code in stack traces.", + "type": "boolean" }, "error_source_root": { + "description": "Where auto-capture reads source from (relative to the checkout). Null =\nthe deployment's Docker build context.", "type": [ "string", "null" - ], - "description": "Where auto-capture reads source from (relative to the checkout). Null =\nthe deployment's Docker build context." + ] }, "git_provider_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "git_url": { + "description": "Git clone URL for the repository (used for public repos without a provider connection)", "type": [ "string", "null" - ], - "description": "Git clone URL for the repository (used for public repos without a provider connection)" + ] }, "gitlab_webhook_id": { + "description": "GitLab webhook ID installed on the connected repository.\n`null` when no GitLab webhook is installed (not connected to GitLab,\nor webhook was removed / never created).", + "example": 42, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "GitLab webhook ID installed on the connected repository.\n`null` when no GitLab webhook is installed (not connected to GitLab,\nor webhook was removed / never created).", - "example": 42 + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_deployment": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "main_branch": { "type": "string" @@ -27129,18 +27169,18 @@ "description": "Preset-specific configuration (Dockerfile path, build context, etc.)" }, "preview_envs_idle_timeout_seconds": { - "type": "integer", + "description": "Idle timeout (seconds) for on-demand preview environments.", "format": "int32", - "description": "Idle timeout (seconds) for on-demand preview environments." + "type": "integer" }, "preview_envs_on_demand": { - "type": "boolean", - "description": "When true, newly-created preview environments default to on-demand mode\n(containers stop after the configured idle timeout to save resources)." + "description": "When true, newly-created preview environments default to on-demand mode\n(containers stop after the configured idle timeout to save resources).", + "type": "boolean" }, "preview_envs_wake_timeout_seconds": { - "type": "integer", + "description": "Wake timeout (seconds) for on-demand preview environments.", "format": "int32", - "description": "Wake timeout (seconds) for on-demand preview environments." + "type": "integer" }, "repo_name": { "type": [ @@ -27162,22 +27202,36 @@ "description": "Source type for deployments (git, docker_image, or static_files)" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ProjectSecretEnvironmentInfo": { - "type": "object", + }, "required": [ "id", + "slug", "name", - "main_url" + "directory", + "main_branch", + "created_at", + "updated_at", + "deployment_config", + "attack_mode", + "ai_write_actions_enabled", + "error_source_context_enabled", + "enable_preview_environments", + "preview_envs_on_demand", + "preview_envs_idle_timeout_seconds", + "preview_envs_wake_timeout_seconds", + "source_type", + "cross_project_trace_sharing" ], + "type": "object" + }, + "ProjectSecretEnvironmentInfo": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "main_url": { "type": "string" @@ -27185,34 +27239,30 @@ "name": { "type": "string" } - } - }, - "ProjectSecretResponse": { - "type": "object", - "description": "Project secret metadata. There is deliberately no `value` field \u2014 secret\nplaintext is never returned after creation. Callers that need the value\nmust read it from the mounted file inside the container.", + }, "required": [ "id", - "project_id", - "key", - "include_in_preview", - "created_at", - "updated_at", - "environments" + "name", + "main_url" ], + "type": "object" + }, + "ProjectSecretResponse": { + "description": "Project secret metadata. There is deliberately no `value` field — secret\nplaintext is never returned after creation. Callers that need the value\nmust read it from the mounted file inside the container.", "properties": { "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "environments": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectSecretEnvironmentInfo" - } + }, + "type": "array" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "include_in_preview": { "type": "boolean" @@ -27221,26 +27271,30 @@ "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ProjectServiceInfo": { - "type": "object", + }, "required": [ "id", - "project", - "service" + "project_id", + "key", + "include_in_preview", + "created_at", + "updated_at", + "environments" ], + "type": "object" + }, + "ProjectServiceInfo": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project": { "$ref": "#/components/schemas/ProjectInfo" @@ -27248,42 +27302,39 @@ "service": { "$ref": "#/components/schemas/ExternalServiceInfo" } - } - }, - "ProjectStatisticsResponse": { - "type": "object", + }, "required": [ - "total_count" + "id", + "project", + "service" ], + "type": "object" + }, + "ProjectStatisticsResponse": { "properties": { "total_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ProjectStatsBreakdown": { - "type": "object", + }, "required": [ - "project_id", - "unique_visitors", - "total_visits", - "total_page_views", - "bounce_rate", - "engagement_rate" + "total_count" ], + "type": "object" + }, + "ProjectStatsBreakdown": { "properties": { "bounce_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "engagement_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": [ @@ -27292,49 +27343,50 @@ ] }, "total_page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_visits": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "unique_visitors": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "project_id", + "unique_visitors", + "total_visits", + "total_page_views", + "bounce_rate", + "engagement_rate" + ], + "type": "object" }, "ProjectType": { - "type": "string", "description": "Project type enumeration", "enum": [ "static", "docker", "buildpack", "git" - ] + ], + "type": "string" }, "ProjectUsageInfoResponse": { - "type": "object", - "required": [ - "id", - "name", - "slug", - "connection_id", - "connection_name" - ], "properties": { "connection_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "connection_name": { "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -27342,206 +27394,220 @@ "slug": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "slug", + "connection_id", + "connection_name" + ], + "type": "object" }, "ProjectsHealthResponse": { - "type": "object", "description": "Batch health summary response", - "required": [ - "projects" - ], "properties": { "projects": { - "type": "object", - "description": "Health summaries keyed by project ID", "additionalProperties": { "$ref": "#/components/schemas/ProjectHealthSummary" }, + "description": "Health summaries keyed by project ID", "propertyNames": { "type": "string" - } + }, + "type": "object" } - } - }, - "ProjectsMonitorHealthResponse": { - "type": "object", - "description": "Batch response for projects health", + }, "required": [ "projects" ], + "type": "object" + }, + "ProjectsMonitorHealthResponse": { + "description": "Batch response for projects health", "properties": { "projects": { - "type": "object", "additionalProperties": { "$ref": "#/components/schemas/ProjectMonitorHealth" }, "propertyNames": { "type": "string" - } + }, + "type": "object" } - } - }, - "PromoteDeploymentRequest": { - "type": "object", + }, "required": [ - "target_environment_id" + "projects" ], + "type": "object" + }, + "PromoteDeploymentRequest": { "properties": { "target_environment_id": { - "type": "integer", + "description": "Target environment ID to promote the deployment to", "format": "int32", - "description": "Target environment ID to promote the deployment to" + "type": "integer" } - } - }, - "PropertyBreakdownItem": { - "type": "object", + }, "required": [ - "value", - "count", - "percentage" + "target_environment_id" ], + "type": "object" + }, + "PropertyBreakdownItem": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "value": { "type": "string" } - } + }, + "required": [ + "value", + "count", + "percentage" + ], + "type": "object" }, "PropertyBreakdownQuery": { - "type": "object", "description": "Query parameters for property breakdown (group by column)", - "required": [ - "start_date", - "end_date", - "group_by" - ], "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level" }, "deployment_id": { + "description": "Optional deployment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional deployment filter" + ] }, "end_date": { - "type": "string", + "description": "End date for the query range", "format": "date-time", - "description": "End date for the query range" + "type": "string" }, "environment_id": { + "description": "Optional environment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment filter" + ] }, "event_name": { + "description": "Optional event name filter (e.g., \"page_view\", \"click\")", "type": [ "string", "null" - ], - "description": "Optional event name filter (e.g., \"page_view\", \"click\")" + ] }, "filter_browser": { + "description": "Filter by browser name (for browser version drill-downs)", "type": [ "string", "null" - ], - "description": "Filter by browser name (for browser version drill-downs)" + ] }, "filter_channel": { + "description": "Filter by channel name (for channel -> referrer drill-downs)", "type": [ "string", "null" - ], - "description": "Filter by channel name (for channel -> referrer drill-downs)" + ] }, "filter_country": { + "description": "Filter by country (for region/city drill-downs). Requires geolocation join.", "type": [ "string", "null" - ], - "description": "Filter by country (for region/city drill-downs). Requires geolocation join." + ] }, "filter_os": { + "description": "Filter by operating system name (for OS version drill-downs)", "type": [ "string", "null" - ], - "description": "Filter by operating system name (for OS version drill-downs)" + ] }, "filter_referrer": { + "description": "Filter by referrer hostname (for referrer -> pages drill-downs)", "type": [ "string", "null" - ], - "description": "Filter by referrer hostname (for referrer -> pages drill-downs)" + ] }, "filter_region": { + "description": "Filter by region (for city drill-downs). Requires geolocation join.", "type": [ "string", "null" - ], - "description": "Filter by region (for city drill-downs). Requires geolocation join." + ] }, "group_by": { "$ref": "#/components/schemas/PropertyColumn", "description": "Property column to group by" }, + "include_crawlers": { + "description": "Include crawler/bot traffic (default: false). Off by default so the\nbreakdown percentages share a denominator with the headline counts,\nwhich always exclude crawlers.", + "type": [ + "boolean", + "null" + ] + }, "limit": { + "description": "Maximum number of results to return (default: 20, max: 100)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of results to return (default: 20, max: 100)" + ] }, "start_date": { - "type": "string", + "description": "Start date for the query range", "format": "date-time", - "description": "Start date for the query range" + "type": "string" } - } - }, - "PropertyBreakdownResponse": { - "type": "object", + }, "required": [ - "property", - "items", - "total" + "start_date", + "end_date", + "group_by" ], + "type": "object" + }, + "PropertyBreakdownResponse": { "properties": { "items": { - "type": "array", "items": { "$ref": "#/components/schemas/PropertyBreakdownItem" - } + }, + "type": "array" }, "property": { "type": "string" }, "total": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "property", + "items", + "total" + ], + "type": "object" }, "PropertyColumn": { - "type": "string", "enum": [ "channel", "device_type", @@ -27563,19 +27629,14 @@ "country", "region", "city" - ] + ], + "type": "string" }, "PropertyTimelineItem": { - "type": "object", - "required": [ - "timestamp", - "value", - "count" - ], "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "timestamp": { "type": "string" @@ -27583,137 +27644,139 @@ "value": { "type": "string" } - } + }, + "required": [ + "timestamp", + "value", + "count" + ], + "type": "object" }, "PropertyTimelineQuery": { - "type": "object", "description": "Query parameters for property timeline (group by column over time)", - "required": [ - "start_date", - "end_date", - "group_by" - ], "properties": { "aggregation_level": { "$ref": "#/components/schemas/AggregationLevel", "description": "Aggregation level" }, "bucket_size": { + "description": "Time bucket size: \"hour\", \"day\", \"week\", \"month\" (default: auto-detect)", "type": [ "string", "null" - ], - "description": "Time bucket size: \"hour\", \"day\", \"week\", \"month\" (default: auto-detect)" + ] }, "deployment_id": { + "description": "Optional deployment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional deployment filter" + ] }, "end_date": { - "type": "string", + "description": "End date for the query range", "format": "date-time", - "description": "End date for the query range" + "type": "string" }, "environment_id": { + "description": "Optional environment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment filter" + ] }, "event_name": { + "description": "Optional event name filter", "type": [ "string", "null" - ], - "description": "Optional event name filter" + ] }, "group_by": { "$ref": "#/components/schemas/PropertyColumn", "description": "Property column to group by" }, + "include_crawlers": { + "description": "Include crawler/bot traffic (default: false). See\n[`PropertyBreakdownQuery::include_crawlers`].", + "type": [ + "boolean", + "null" + ] + }, "start_date": { - "type": "string", + "description": "Start date for the query range", "format": "date-time", - "description": "Start date for the query range" + "type": "string" } - } - }, - "PropertyTimelineResponse": { - "type": "object", + }, "required": [ - "property", - "bucket_size", - "items" + "start_date", + "end_date", + "group_by" ], + "type": "object" + }, + "PropertyTimelineResponse": { "properties": { "bucket_size": { "type": "string" }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/PropertyTimelineItem" - } + }, + "type": "array" }, "property": { "type": "string" } - } + }, + "required": [ + "property", + "bucket_size", + "items" + ], + "type": "object" }, "Protocol": { - "type": "string", "description": "Network protocol", "enum": [ "tcp", "udp" - ] + ], + "type": "string" }, "ProviderCatalogDto": { - "type": "object", "description": "One catalog entry rendered for the settings UI.", - "required": [ - "id", - "name", - "install_command", - "auth_command", - "auth_flavors", - "models", - "credential_saved", - "supports_max_turns" - ], "properties": { "auth_command": { "type": "string" }, "auth_flavors": { - "type": "array", "items": { "$ref": "#/components/schemas/AuthFlavorDto" - } + }, + "type": "array" }, "credential_saved": { - "type": "boolean", - "description": "True when a credential is currently saved for this provider in the\nsettings JSON. Lets the UI render \"Configured\" badges without the\nfrontend having to inspect the encrypted blob." + "description": "True when a credential is currently saved for this provider in the\nsettings JSON. Lets the UI render \"Configured\" badges without the\nfrontend having to inspect the encrypted blob.", + "type": "boolean" }, "current_auth_type": { + "description": "Currently saved auth flavor id (when `credential_saved` is true).\n`None` when no credential is saved yet.", "type": [ "string", "null" - ], - "description": "Currently saved auth flavor id (when `credential_saved` is true).\n`None` when no credential is saved yet." + ] }, "default_model": { + "description": "Currently saved default model id for this provider, if one was\npicked. `None` means \"use the CLI's own default\" — the UI renders\nthat as \"Use provider default\".", "type": [ "string", "null" - ], - "description": "Currently saved default model id for this provider, if one was\npicked. `None` means \"use the CLI's own default\" \u2014 the UI renders\nthat as \"Use provider default\"." + ] }, "id": { "type": "string" @@ -27722,65 +27785,77 @@ "type": "string" }, "max_turns_analysis": { + "description": "Default max turns for the autofixer analysis phase. `None` = built-in\ndefault (10). Only enforced for CLIs with a turn flag (Claude Code).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for the autofixer analysis phase. `None` = built-in\ndefault (10). Only enforced for CLIs with a turn flag (Claude Code)." + ] }, "max_turns_feedback": { + "description": "Default max turns for autofixer feedback rounds. `None` = built-in\ndefault (10).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for autofixer feedback rounds. `None` = built-in\ndefault (10)." + ] }, "max_turns_fix": { + "description": "Default max turns for the autofixer fix phase. `None` = built-in\ndefault (20).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for the autofixer fix phase. `None` = built-in\ndefault (20)." + ] }, "models": { - "type": "array", + "description": "Model ids this provider accepts, in display order. The first entry is\nthe recommended default. Empty when the provider doesn't expose model\nselection (e.g. OpenCode), which the UI uses to hide the dropdown.", "items": { "type": "string" }, - "description": "Model ids this provider accepts, in display order. The first entry is\nthe recommended default. Empty when the provider doesn't expose model\nselection (e.g. OpenCode), which the UI uses to hide the dropdown." + "type": "array" }, "name": { "type": "string" }, "supports_max_turns": { - "type": "boolean", - "description": "True when this provider's CLI supports enforcing a turn cap. False\nfor Codex/OpenCode, which run to completion \u2014 the UI labels their\nmax-turns inputs accordingly." + "description": "True when this provider's CLI supports enforcing a turn cap. False\nfor Codex/OpenCode, which run to completion — the UI labels their\nmax-turns inputs accordingly.", + "type": "boolean" } - } - }, - "ProviderCatalogResponse": { - "type": "object", + }, "required": [ - "default_provider", - "providers" + "id", + "name", + "install_command", + "auth_command", + "auth_flavors", + "models", + "credential_saved", + "supports_max_turns" ], + "type": "object" + }, + "ProviderCatalogResponse": { "properties": { "default_provider": { - "type": "string", - "description": "Active provider id from `agent_sandbox.default_provider`. The settings\nUI uses this to highlight which card is the active one." + "description": "Active provider id from `agent_sandbox.default_provider`. The settings\nUI uses this to highlight which card is the active one.", + "type": "string" }, "providers": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderCatalogDto" - } + }, + "type": "array" } - } + }, + "required": [ + "default_provider", + "providers" + ], + "type": "object" }, "ProviderConfig": { + "description": "Provider-specific integration settings persisted in\n`revenue_integrations.config`.\n\nThe tag is the lowercase provider name, so adding a new provider\nmeans adding a new variant and the existing rows are untouched.\nOld rows (pre-config) and rows with `NULL` config are treated as\n\"accept all events, no filtering\" via [`ProviderConfig::default_for`].", "oneOf": [ { "allOf": [ @@ -27788,18 +27863,18 @@ "$ref": "#/components/schemas/StripeConfig" }, { - "type": "object", - "required": [ - "provider" - ], "properties": { "provider": { - "type": "string", "enum": [ "stripe" - ] + ], + "type": "string" } - } + }, + "required": [ + "provider" + ], + "type": "object" } ] }, @@ -27809,38 +27884,31 @@ "$ref": "#/components/schemas/LemonSqueezyConfig" }, { - "type": "object", - "required": [ - "provider" - ], "properties": { "provider": { - "type": "string", "enum": [ "lemon_squeezy" - ] + ], + "type": "string" } - } + }, + "required": [ + "provider" + ], + "type": "object" } ] } - ], - "description": "Provider-specific integration settings persisted in\n`revenue_integrations.config`.\n\nThe tag is the lowercase provider name, so adding a new provider\nmeans adding a new variant and the existing rows are untouched.\nOld rows (pre-config) and rows with `NULL` config are treated as\n\"accept all events, no filtering\" via [`ProviderConfig::default_for`]." + ] }, "ProviderConfigMasked": { - "type": "object", - "required": [ - "auth_type", - "credential_saved", - "extra" - ], "properties": { "auth_type": { "type": "string" }, "credential_saved": { - "type": "boolean", - "description": "True if a credential is stored for this provider. The encrypted blob\nis never returned over HTTP." + "description": "True if a credential is stored for this provider. The encrypted blob\nis never returned over HTTP.", + "type": "boolean" }, "default_model": { "type": [ @@ -27849,15 +27917,15 @@ ] }, "extra": {} - } - }, - "ProviderDeletionCheckResponse": { - "type": "object", + }, "required": [ - "can_delete", - "projects_in_use", - "message" + "auth_type", + "credential_saved", + "extra" ], + "type": "object" + }, + "ProviderDeletionCheckResponse": { "properties": { "can_delete": { "type": "boolean" @@ -27866,20 +27934,20 @@ "type": "string" }, "projects_in_use": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectUsageInfoResponse" - } + }, + "type": "array" } - } - }, - "ProviderDescriptor": { - "type": "object", + }, "required": [ - "name", - "display_name", - "recommended_events" + "can_delete", + "projects_in_use", + "message" ], + "type": "object" + }, + "ProviderDescriptor": { "properties": { "display_name": { "type": "string" @@ -27888,28 +27956,24 @@ "type": "string" }, "recommended_events": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } - }, - "ProviderKeyResponse": { - "type": "object", + }, "required": [ - "id", - "provider", + "name", "display_name", - "api_key_masked", - "is_active", - "created_at", - "updated_at" + "recommended_events" ], + "type": "object" + }, + "ProviderKeyResponse": { "properties": { "api_key_masked": { - "type": "string", - "description": "Masked API key (only last 4 chars visible)" + "description": "Masked API key (only last 4 chars visible)", + "type": "string" }, "base_url": { "type": [ @@ -27921,18 +27985,18 @@ "type": "string" }, "default_model": { + "description": "Model id this provider serves (NULL → per-provider default).", "type": [ "string", "null" - ], - "description": "Model id this provider serves (NULL \u2192 per-provider default)." + ] }, "display_name": { "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -27943,51 +28007,50 @@ "updated_at": { "type": "string" } - } - }, - "ProviderMetadata": { - "type": "object", + }, "required": [ - "service_type", + "id", + "provider", "display_name", - "description", - "icon_url", - "color" + "api_key_masked", + "is_active", + "created_at", + "updated_at" ], + "type": "object" + }, + "ProviderMetadata": { "properties": { "color": { - "type": "string", - "example": "#336791" + "example": "#336791", + "type": "string" }, "description": { - "type": "string", - "example": "Relational database management system" + "example": "Relational database management system", + "type": "string" }, "display_name": { - "type": "string", - "example": "PostgreSQL" + "example": "PostgreSQL", + "type": "string" }, "icon_url": { - "type": "string", - "example": "https://cdn.simpleicons.org/postgresql" + "example": "https://cdn.simpleicons.org/postgresql", + "type": "string" }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute" } - } - }, - "ProviderResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "provider_type", - "auth_method", - "is_active", - "is_default", - "created_at", - "updated_at" + "service_type", + "display_name", + "description", + "icon_url", + "color" ], + "type": "object" + }, + "ProviderResponse": { "properties": { "auth_method": { "type": "string" @@ -27999,12 +28062,12 @@ ] }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -28019,46 +28082,57 @@ "type": "string" }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "ProviderUsage": { - "type": "object", + }, "required": [ - "provider", - "request_count", - "input_tokens", - "output_tokens", - "avg_latency_ms", - "error_count" + "id", + "name", + "provider_type", + "auth_method", + "is_active", + "is_default", + "created_at", + "updated_at" ], + "type": "object" + }, + "ProviderUsage": { "properties": { "avg_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "error_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "provider": { "type": "string" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "provider", + "request_count", + "input_tokens", + "output_tokens", + "avg_latency_ms", + "error_count" + ], + "type": "object" }, "ProvisionResponse": { "oneOf": [ @@ -28068,18 +28142,18 @@ "$ref": "#/components/schemas/DomainError" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "error" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -28089,18 +28163,18 @@ "$ref": "#/components/schemas/DomainResponse" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "complete" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] }, @@ -28110,38 +28184,25 @@ "$ref": "#/components/schemas/DomainChallengeResponse" }, { - "type": "object", - "required": [ - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "pending" - ] + ], + "type": "string" } - } + }, + "required": [ + "type" + ], + "type": "object" } ] } ] }, "ProxyLogResponse": { - "type": "object", "description": "Response model for proxy logs", - "required": [ - "id", - "timestamp", - "method", - "path", - "host", - "status_code", - "request_source", - "is_system_request", - "routing_status", - "request_id" - ], "properties": { "bot_name": { "type": [ @@ -28180,11 +28241,11 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "device_type": { "type": [ @@ -28193,11 +28254,11 @@ ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_message": { "type": [ @@ -28209,15 +28270,15 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_geolocation_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "is_bot": { "type": [ @@ -28241,11 +28302,11 @@ "type": "string" }, "project_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "query_string": { "type": [ @@ -28263,42 +28324,42 @@ "type": "string" }, "request_size_bytes": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "request_source": { "type": "string" }, "response_size_bytes": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "response_time_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "routing_status": { "type": "string" }, "session_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "status_code": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "timestamp": { "type": "string" @@ -28316,169 +28377,176 @@ ] }, "visitor_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "required": [ + "id", + "timestamp", + "method", + "path", + "host", + "status_code", + "request_source", + "is_system_request", + "routing_status", + "request_id" + ], + "type": "object" }, "ProxyLogsPaginatedResponse": { - "type": "object", "description": "Paginated response for proxy logs", - "required": [ - "logs", - "total", - "page", - "page_size", - "total_pages" - ], "properties": { "logs": { - "type": "array", "items": { "$ref": "#/components/schemas/ProxyLogResponse" - } + }, + "type": "array" }, "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_pages": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "logs", + "total", + "page", + "page_size", + "total_pages" + ], + "type": "object" }, "PublicHostnameStrategy": { - "type": "string", "description": "Public hostname generation mode for Temps-managed preview routes.\n\nThe mode is stored per managed domain (`dns_managed_domains.generated_hostname_mode`)\nrather than globally, so a provider such as Cloudflare can offer the flat layout\nrequired by its Universal SSL wildcard cert without changing every domain's behaviour.", "enum": [ "standard", "flat" - ] + ], + "type": "string" }, "PublicPresetResponse": { - "type": "object", "description": "Response for preset detection", - "required": [ - "branch", - "presets" - ], "properties": { "branch": { - "type": "string", - "description": "Branch name where presets were detected" + "description": "Branch name where presets were detected", + "type": "string" }, "presets": { - "type": "array", + "description": "List of detected presets", "items": { "$ref": "#/components/schemas/PresetInfo" }, - "description": "List of detected presets" + "type": "array" } - } + }, + "required": [ + "branch", + "presets" + ], + "type": "object" }, "PublicRepositoryInfo": { - "type": "object", "description": "Public repository information", - "required": [ - "owner", - "name", - "full_name", - "default_branch", - "stars", - "forks" - ], "properties": { "default_branch": { - "type": "string", - "description": "Default branch name" + "description": "Default branch name", + "type": "string" }, "description": { + "description": "Repository description", "type": [ "string", "null" - ], - "description": "Repository description" + ] }, "forks": { - "type": "integer", + "description": "Fork count", "format": "int32", - "description": "Fork count" + "type": "integer" }, "full_name": { - "type": "string", - "description": "Full repository name (owner/repo)" + "description": "Full repository name (owner/repo)", + "type": "string" }, "language": { + "description": "Primary programming language", "type": [ "string", "null" - ], - "description": "Primary programming language" + ] }, "name": { - "type": "string", - "description": "Repository name" + "description": "Repository name", + "type": "string" }, "owner": { - "type": "string", - "description": "Repository owner" + "description": "Repository owner", + "type": "string" }, "stars": { - "type": "integer", + "description": "Star count", "format": "int32", - "description": "Star count" + "type": "integer" } - } - }, - "PurgeLogsRequest": { - "type": "object", + }, "required": [ - "before" + "owner", + "name", + "full_name", + "default_branch", + "stars", + "forks" ], + "type": "object" + }, + "PurgeLogsRequest": { "properties": { "before": { - "type": "string", - "description": "Delete all logs before this timestamp (ISO 8601)" + "description": "Delete all logs before this timestamp (ISO 8601)", + "type": "string" } - } + }, + "required": [ + "before" + ], + "type": "object" }, "PushImageRequest": { - "type": "object", "description": "Request to push an external image", - "required": [ - "image_ref" - ], "properties": { "image_ref": { "type": "string" }, "metadata": {} - } + }, + "required": [ + "image_ref" + ], + "type": "object" }, "PushedExternalImageResponse": { - "type": "object", "description": "Response for in-memory external image operations (legacy push flow).\n\nRenamed to avoid shadowing the richer database-backed `ExternalImageResponse`\nin `handlers/remote_deployments.rs`. The two types serve different routes\n(`/images` ephemeral push vs `/external-images` registered images).", - "required": [ - "id", - "image_ref", - "pushed_at" - ], "properties": { "digest": { "type": [ @@ -28493,332 +28561,333 @@ "type": "string" }, "pushed_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "size": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } - } + }, + "required": [ + "id", + "image_ref", + "pushed_at" + ], + "type": "object" }, "QueryDataRequest": { - "type": "object", "properties": { "filters": { "description": "JSON filters (backend-specific format)" }, "limit": { - "type": "integer", "description": "Maximum number of rows to return", "example": 100, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "offset": { - "type": "integer", "description": "Number of rows to skip", "example": 0, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sort_by": { + "description": "Sort by field name", "type": [ "string", "null" - ], - "description": "Sort by field name" + ] }, "sort_order": { + "description": "Sort order (asc/desc)", "type": [ "string", "null" - ], - "description": "Sort order (asc/desc)" + ] } - } + }, + "type": "object" }, "QueryDataResponse": { - "type": "object", - "required": [ - "fields", - "rows", - "total_count", - "returned_count", - "execution_time_ms", - "truncated" - ], "properties": { "execution_time_ms": { - "type": "integer", - "format": "int64", "description": "Query execution time in milliseconds", "example": 45, - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "fields": { - "type": "array", + "description": "Field definitions", "items": { "$ref": "#/components/schemas/FieldResponse" }, - "description": "Field definitions" + "type": "array" }, "returned_count": { - "type": "integer", "description": "Number of rows returned in this response", "example": 100, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "rows": { - "type": "array", + "description": "Data rows (array of JSON objects)", "items": {}, - "description": "Data rows (array of JSON objects)" + "type": "array" }, "total_count": { - "type": "integer", - "format": "int64", "description": "Total number of rows matching the query (before limit/offset)", "example": 1234, - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "truncated": { - "type": "boolean", - "description": "Whether rows were dropped from this response to stay inside the byte budget.\n\n`returned_count` is always the number of rows actually present, so a truncated page is still internally consistent \u2014 but a caller comparing it against the requested limit would otherwise conclude the table simply ended. Reported explicitly so a partial page is never mistaken for a complete one, by a human, a script, or a model reading a tool result.", - "example": false + "description": "Whether rows were dropped from this response to stay inside the byte\nbudget.\n\n`returned_count` is always the number of rows actually present, so a\ntruncated page is still internally consistent — but a caller comparing\nit against the requested limit would otherwise conclude the table simply\nended. Reported explicitly so a partial page is never mistaken for a\ncomplete one, by a human, a script, or a model reading a tool result.", + "example": false, + "type": "boolean" } - } - }, - "QuotaResponse": { - "type": "object", + }, "required": [ - "quota" + "fields", + "rows", + "total_count", + "returned_count", + "execution_time_ms", + "truncated" ], + "type": "object" + }, + "QuotaResponse": { "properties": { "quota": { "$ref": "#/components/schemas/StorageQuota" } - } + }, + "required": [ + "quota" + ], + "type": "object" }, "RateLimitConfig": { - "type": "object", "description": "Rate limiting configuration (subset of global RateLimitSettings)", "properties": { "blacklistIps": { - "type": "array", + "description": "Blacklist specific IPs for this project/environment", "items": { "type": "string" }, - "description": "Blacklist specific IPs for this project/environment" + "type": "array" }, "maxRequestsPerHour": { + "description": "Override rate limit per hour", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Override rate limit per hour", - "minimum": 0 + ] }, "maxRequestsPerMinute": { + "description": "Override rate limit per minute", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Override rate limit per minute", - "minimum": 0 + ] }, "whitelistIps": { - "type": "array", + "description": "Whitelist specific IPs for this project/environment", "items": { "type": "string" }, - "description": "Whitelist specific IPs for this project/environment" + "type": "array" } - } + }, + "type": "object" }, "RateLimitSettings": { - "type": "object", "properties": { "blacklist_ips": { - "type": "array", + "default": [], "items": { "type": "string" }, - "default": [] + "type": "array" }, "enabled": { - "type": "boolean", - "default": false + "default": false, + "type": "boolean" }, "max_requests_per_hour": { - "type": "integer", - "format": "int32", "default": 1000, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "max_requests_per_minute": { - "type": "integer", - "format": "int32", "default": 60, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "whitelist_ips": { - "type": "array", + "default": [], "items": { "type": "string" }, - "default": [] + "type": "array" } - } + }, + "type": "object" }, "ReachabilityStatus": { - "type": "string", "description": "Email reachability status", "enum": [ "safe", "risky", "invalid", "unknown" - ] + ], + "type": "string" }, "ReadFileResponse": { - "type": "object", - "required": [ - "path", - "contents_b64", - "size" - ], "properties": { "contents_b64": { - "type": "string", - "description": "File contents, base64-encoded. Symmetric with `WriteFileBody`." + "description": "File contents, base64-encoded. Symmetric with `WriteFileBody`.", + "type": "string" }, "path": { "type": "string" }, "size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "path", + "contents_b64", + "size" + ], + "type": "object" }, "ReadRowsQuery": { - "type": "object", "description": "Query-string form of [`QueryDataRequest`] for the read-only `GET` rows\nendpoint.\n\nThe `POST` variant exists because filters are arbitrary backend-specific\nJSON. Reading rows is nonetheless a *read*, and the AI agent's tool index\nis GET-only by construction, so the same capability has to be reachable\nwithout a body. `filter` therefore carries the JSON as a string.", "properties": { "filter": { + "description": "Backend-specific filter, JSON-encoded. Fetch the expected shape from\nthe `filter_schema` field of the explorer-support endpoint — e.g.\n`{\"where\":\"created_at > now() - interval '7 days'\"}` for SQL sources.", "type": [ "string", "null" - ], - "description": "Backend-specific filter, JSON-encoded. Fetch the expected shape from\nthe `filter_schema` field of the explorer-support endpoint \u2014 e.g.\n`{\"where\":\"created_at > now() - interval '7 days'\"}` for SQL sources." + ] }, "limit": { - "type": "integer", "description": "Maximum number of rows to return", "example": 100, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "offset": { - "type": "integer", "description": "Number of rows to skip", "example": 0, - "minimum": 0 + "minimum": 0, + "type": "integer" }, "sort_by": { + "description": "Sort by field name", "type": [ "string", "null" - ], - "description": "Sort by field name" + ] }, "sort_order": { + "description": "Sort order (asc/desc)", "type": [ "string", "null" - ], - "description": "Sort order (asc/desc)" + ] } - } + }, + "type": "object" }, "RecentActivityQuery": { - "type": "object", "description": "Query parameters for recent activity endpoint", - "required": [ - "project_id" - ], "properties": { "environment_id": { + "description": "Environment ID (optional)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Environment ID (optional)" + ] }, "limit": { + "description": "Max number of events to return (default: 50, max: 100)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Max number of events to return (default: 50, max: 100)" + ] }, "project_id": { - "type": "integer", + "description": "Project ID", "format": "int32", - "description": "Project ID" + "type": "integer" }, "since_id": { + "description": "Return events with ID greater than this (for cursor-based polling)", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Return events with ID greater than this (for cursor-based polling)" + ] } - } + }, + "required": [ + "project_id" + ], + "type": "object" }, "RecentActivityResponse": { - "type": "object", "description": "Response for recent activity events endpoint", - "required": [ - "events", - "count" - ], "properties": { "count": { - "type": "integer", "description": "Total events returned", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "events": { - "type": "array", + "description": "Recent events, newest first", "items": { "$ref": "#/components/schemas/ActivityEvent" }, - "description": "Recent events, newest first" + "type": "array" } - } - }, - "RecentEventResponse": { - "type": "object", + }, "required": [ - "occurred_at", - "event_type" + "events", + "count" ], + "type": "object" + }, + "RecentEventResponse": { "properties": { "amount_minor": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "currency": { "type": [ @@ -28836,332 +28905,336 @@ "type": "string" }, "mrr_minor": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "occurred_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "occurred_at", + "event_type" + ], + "type": "object" }, "RecentQueryParams": { - "type": "object", "properties": { "conversation_id": { + "description": "Filter by conversation ID", "type": [ "string", "null" - ], - "description": "Filter by conversation ID" + ] }, "cost_gt": { + "description": "Cost strictly greater-than, in microcents", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost strictly greater-than, in microcents" + ] }, "cost_gte": { + "description": "Cost greater-than-or-equal, in microcents", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost greater-than-or-equal, in microcents" + ] }, "cost_lt": { + "description": "Cost strictly less-than, in microcents", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost strictly less-than, in microcents" + ] }, "cost_lte": { + "description": "Cost less-than-or-equal, in microcents", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost less-than-or-equal, in microcents" + ] }, "limit": { + "description": "Page size (defaults to 20, max 50)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Page size (defaults to 20, max 50)", - "minimum": 0 + ] }, "model": { + "description": "Filter by model name", "type": [ "string", "null" - ], - "description": "Filter by model name" + ] }, "offset": { + "description": "Number of results to skip for pagination (defaults to 0)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Number of results to skip for pagination (defaults to 0)", - "minimum": 0 + ] }, "provider": { + "description": "Filter by provider name", "type": [ "string", "null" - ], - "description": "Filter by provider name" + ] }, "status": { + "description": "Filter by HTTP status code (exact match)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by HTTP status code (exact match)" + ] }, "tags": { + "description": "Filter by tags (comma-separated, AND logic)", "type": [ "string", "null" - ], - "description": "Filter by tags (comma-separated, AND logic)" + ] }, "tokens_gt": { + "description": "Total tokens (input + output) strictly greater-than", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) strictly greater-than" + ] }, "tokens_gte": { + "description": "Total tokens (input + output) greater-than-or-equal", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) greater-than-or-equal" + ] }, "tokens_lt": { + "description": "Total tokens (input + output) strictly less-than", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) strictly less-than" + ] }, "tokens_lte": { + "description": "Total tokens (input + output) less-than-or-equal", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) less-than-or-equal" + ] }, "user_id": { + "description": "Filter by user ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by user ID" + ] } - } + }, + "type": "object" }, "RecordExposureRequest": { - "type": "object", "description": "Keys a running app actually evaluated since its last report.", - "required": [ - "keys" - ], "properties": { "keys": { - "type": "array", - "items": { - "type": "string" - }, "description": "Flag keys evaluated since the last report. Unknown keys are ignored.", "example": [ "checkout.v2", "api.rate_limit" - ] + ], + "items": { + "type": "string" + }, + "type": "array" } - } - }, - "RecordExposureResponse": { - "type": "object", + }, "required": [ - "recorded" + "keys" ], + "type": "object" + }, + "RecordExposureResponse": { "properties": { "recorded": { - "type": "integer", - "format": "int64", "description": "How many keys were accepted for processing.\n\nDeliberately not the number of rows updated: echoing that back would\nlet a caller post a single candidate key and read the result as \"this\nflag exists\", turning the endpoint into an existence oracle.", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "recorded" + ], + "type": "object" }, "RecordListResponse": { - "type": "object", "description": "Record list response", - "required": [ - "records" - ], "properties": { "records": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsRecord" - } + }, + "type": "array" } - } + }, + "required": [ + "records" + ], + "type": "object" }, "RecoveryTarget": { + "description": "Engine-specific recovery target for PITR.\n\nPostgres honors all variants; Redis/Mongo/S3 will likely reject non-Time\nvariants or define their own semantics when they grow PITR support.", "oneOf": [ { - "type": "object", "description": "Recover to a specific timestamp.", - "required": [ - "time", - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "time" - ] + ], + "type": "string" }, "time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - { - "type": "object", - "description": "Recover to a specific transaction id (Postgres).", + }, "required": [ - "xid", + "time", "kind" ], + "type": "object" + }, + { + "description": "Recover to a specific transaction id (Postgres).", "properties": { "kind": { - "type": "string", "enum": [ "xid" - ] + ], + "type": "string" }, "xid": { "type": "string" } - } - }, - { - "type": "object", - "description": "Recover to a specific log sequence number (Postgres).", + }, "required": [ - "lsn", + "xid", "kind" ], + "type": "object" + }, + { + "description": "Recover to a specific log sequence number (Postgres).", "properties": { "kind": { - "type": "string", "enum": [ "lsn" - ] + ], + "type": "string" }, "lsn": { "type": "string" } - } - }, - { - "type": "object", - "description": "Recover to a named restore point created via `pg_create_restore_point` (Postgres).", + }, "required": [ - "name", + "lsn", "kind" ], + "type": "object" + }, + { + "description": "Recover to a named restore point created via `pg_create_restore_point` (Postgres).", "properties": { "kind": { - "type": "string", "enum": [ "name" - ] + ], + "type": "string" }, "name": { "type": "string" } - } + }, + "required": [ + "name", + "kind" + ], + "type": "object" } - ], - "description": "Engine-specific recovery target for PITR.\n\nPostgres honors all variants; Redis/Mongo/S3 will likely reject non-Time\nvariants or define their own semantics when they grow PITR support." + ] }, "ReferrerCount": { - "type": "object", - "required": [ - "referrer", - "count", - "percentage" - ], "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "referrer": { "type": "string" } - } - }, - "ReferrersAnalyticsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "referrer", + "count", + "percentage" ], + "type": "object" + }, + "ReferrersAnalyticsQuery": { "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" }, "RegenerateDSNRequest": { - "type": "object", "properties": { "base_url": { "type": [ @@ -29169,152 +29242,146 @@ "null" ] } - } + }, + "type": "object" }, "RegisterImageRequest": { - "type": "object", - "required": [ - "image_ref" - ], "properties": { "digest": { + "description": "Image digest (sha256:...)", + "example": "sha256:abc123def456", "type": [ "string", "null" - ], - "description": "Image digest (sha256:...)", - "example": "sha256:abc123def456" + ] }, "image_ref": { - "type": "string", "description": "Docker image reference (e.g., \"ghcr.io/org/app:v1.0\")", - "example": "ghcr.io/myorg/myapp:v1.0" + "example": "ghcr.io/myorg/myapp:v1.0", + "type": "string" }, "metadata": { "description": "Additional metadata" }, "tag": { + "description": "Image tag", + "example": "v1.0", "type": [ "string", "null" - ], - "description": "Image tag", - "example": "v1.0" + ] } - } - }, - "RegisterNodeApiRequest": { - "type": "object", + }, "required": [ - "name", - "token", - "address", - "private_address" + "image_ref" ], + "type": "object" + }, + "RegisterNodeApiRequest": { "properties": { "address": { - "type": "string", - "description": "Node's reachable address (e.g., \"10.100.0.2\" or \"192.168.1.50\")" + "description": "Node's reachable address (e.g., \"10.100.0.2\" or \"192.168.1.50\")", + "type": "string" }, "architecture": { + "description": "Container platform of this node's Docker daemon (`linux/amd64`,\n`linux/arm64`). Optional: agents older than multi-arch support omit it\nand the value is learned from the first heartbeat instead.", "type": [ "string", "null" - ], - "description": "Container platform of this node's Docker daemon (`linux/amd64`,\n`linux/arm64`). Optional: agents older than multi-arch support omit it\nand the value is learned from the first heartbeat instead." + ] }, "csr_pem": { + "description": "Node-generated certificate signing request (PEM) for multi-node mTLS\n(ADR-020 WS-2.1). When present, the control plane signs it with the\ncluster CA and returns the leaf + CA cert. Optional — token-only nodes\n(legacy / edge) still register without one.", "type": [ "string", "null" - ], - "description": "Node-generated certificate signing request (PEM) for multi-node mTLS\n(ADR-020 WS-2.1). When present, the control plane signs it with the\ncluster CA and returns the leaf + CA cert. Optional \u2014 token-only nodes\n(legacy / edge) still register without one." + ] }, "edge_public_key": { + "description": "X25519 public key for ECIES certificate encryption (base64-encoded, edge nodes only)", "type": [ "string", "null" - ], - "description": "X25519 public key for ECIES certificate encryption (base64-encoded, edge nodes only)" + ] }, "join_token": { + "description": "Join token to authorize this registration (must match the token generated in Settings)", "type": [ "string", "null" - ], - "description": "Join token to authorize this registration (must match the token generated in Settings)" + ] }, "labels": { "description": "Labels for scheduling (e.g., {\"region\": \"us-east\", \"gpu\": \"true\"})" }, "name": { - "type": "string", - "description": "Unique name for this node" + "description": "Unique name for this node", + "type": "string" }, "prior_token": { + "description": "The node's *current* token, supplied to prove possession when\nre-registering (changing the identity of) a node that already exists.\nOptional; only needed to rebind a still-live node. (ADR-020 WS-1.2.)", "type": [ "string", "null" - ], - "description": "The node's *current* token, supplied to prove possession when\nre-registering (changing the identity of) a node that already exists.\nOptional; only needed to rebind a still-live node. (ADR-020 WS-1.2.)" + ] }, "private_address": { - "type": "string", - "description": "Private/WireGuard address for inter-node communication" + "description": "Private/WireGuard address for inter-node communication", + "type": "string" }, "public_endpoint": { + "description": "Public endpoint for WireGuard (e.g., \"203.0.113.1:51820\")", "type": [ "string", "null" - ], - "description": "Public endpoint for WireGuard (e.g., \"203.0.113.1:51820\")" + ] }, "role": { + "description": "Node role (default: \"worker\")", "type": [ "string", "null" - ], - "description": "Node role (default: \"worker\")" + ] }, "token": { - "type": "string", - "description": "Registration token (plaintext, will be hashed before storage)" + "description": "Registration token (plaintext, will be hashed before storage)", + "type": "string" }, "wg_public_key": { + "description": "WireGuard public key", "type": [ "string", "null" - ], - "description": "WireGuard public key" + ] } - } - }, - "RegisterNodeResponse": { - "type": "object", + }, "required": [ - "id", "name", - "status", - "message" + "token", + "address", + "private_address" ], + "type": "object" + }, + "RegisterNodeResponse": { "properties": { "ca_cert_pem": { + "description": "The cluster CA certificate (PEM) the node pins as its trust root.\nPresent only when a `csr_pem` was supplied. (ADR-020 WS-2.1.)", "type": [ "string", "null" - ], - "description": "The cluster CA certificate (PEM) the node pins as its trust root.\nPresent only when a `csr_pem` was supplied. (ADR-020 WS-2.1.)" + ] }, "cert_pem": { + "description": "The signed per-node leaf certificate (PEM) the agent serves as its TLS\nserver cert. Present only when a `csr_pem` was supplied. (ADR-020 WS-2.1.)", "type": [ "string", "null" - ], - "description": "The signed per-node leaf certificate (PEM) the agent serves as its TLS\nserver cert. Present only when a `csr_pem` was supplied. (ADR-020 WS-2.1.)" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -29325,15 +29392,16 @@ "status": { "type": "string" } - } - }, - "RegisterRequest": { - "type": "object", + }, "required": [ - "email", - "password", - "name" + "id", + "name", + "status", + "message" ], + "type": "object" + }, + "RegisterRequest": { "properties": { "email": { "type": "string" @@ -29344,96 +29412,129 @@ "password": { "type": "string" } - } + }, + "required": [ + "email", + "password", + "name" + ], + "type": "object" }, "ReinstallWebhookResponse": { - "type": "object", "description": "Response for `POST /projects/{project_id}/gitlab/reinstall-webhook`", - "required": [ - "hook_id", - "message" - ], "properties": { "hook_id": { - "type": "integer", + "description": "The new GitLab hook ID that was installed.", "format": "int32", - "description": "The new GitLab hook ID that was installed." + "type": "integer" }, "message": { - "type": "string", - "description": "Human-readable status message." + "description": "Human-readable status message.", + "type": "string" } - } + }, + "required": [ + "hook_id", + "message" + ], + "type": "object" }, - "ReleaseListResponse": { - "type": "object", + "ReleaseCheckResult": { + "description": "Outcome of an operator-triggered release check.", + "properties": { + "channel": { + "description": "Channel that was queried.", + "type": "string" + }, + "current_version": { + "description": "Version tag of the running binary.", + "type": "string" + }, + "latest_version": { + "description": "Newest release published on that channel, if any could be resolved.", + "type": [ + "string", + "null" + ] + }, + "release_url": { + "description": "Release-notes page for `latest_version`.", + "type": [ + "string", + "null" + ] + }, + "update_available": { + "description": "True when `latest_version` is strictly newer than what is running.\nFalse on a channel whose newest release is older — which is normal and\nexpected right after switching a nightly box onto stable.", + "type": "boolean" + } + }, "required": [ - "releases" + "channel", + "current_version", + "update_available" ], + "type": "object" + }, + "ReleaseListResponse": { "properties": { "releases": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } - } + }, + "required": [ + "releases" + ], + "type": "object" }, "ReloadResponse": { - "type": "object", "description": "Response from the reload endpoint.", - "required": [ - "loaded", - "plugins", - "message" - ], "properties": { "loaded": { - "type": "integer", "description": "Number of plugins successfully loaded after reload", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "message": { - "type": "string", - "description": "Human-readable status message" + "description": "Human-readable status message", + "type": "string" }, "plugins": { - "type": "array", + "description": "Names of loaded plugins", "items": { "type": "string" }, - "description": "Names of loaded plugins" + "type": "array" } - } - }, - "RemoteDeploymentResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "environment_id", - "slug", - "state", - "source_type", - "created_at" + "loaded", + "plugins", + "message" ], + "type": "object" + }, + "RemoteDeploymentResponse": { "properties": { "created_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "slug": { "type": "string" @@ -29444,38 +29545,47 @@ "state": { "type": "string" } - } - }, - "RemoveNodeResponse": { - "type": "object", + }, "required": [ "id", - "message" + "project_id", + "environment_id", + "slug", + "state", + "source_type", + "created_at" ], + "type": "object" + }, + "RemoveNodeResponse": { "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" } - } - }, - "RenameConversationRequest": { - "type": "object", + }, "required": [ - "title" + "id", + "message" ], + "type": "object" + }, + "RenameConversationRequest": { "properties": { "title": { - "type": "string", - "description": "New human-facing title. Trimmed; must be non-empty after trimming." + "description": "New human-facing title. Trimmed; must be non-empty after trimming.", + "type": "string" } - } + }, + "required": [ + "title" + ], + "type": "object" }, "RepositoryListQuery": { - "type": "object", "properties": { "direction": { "type": [ @@ -29496,20 +29606,20 @@ ] }, "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "per_page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "private": { "type": [ @@ -29529,40 +29639,33 @@ "null" ] } - } + }, + "type": "object" }, "RepositoryListResponse": { - "type": "object", - "required": [ - "repositories", - "total_count" - ], "properties": { "repositories": { - "type": "array", "items": { "$ref": "#/components/schemas/RepositoryResponse" - } + }, + "type": "array" }, "total_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "RepositoryPresetResponse": { - "type": "object", + }, "required": [ - "repository_id", - "owner", - "name", - "presets", - "calculated_at" + "repositories", + "total_count" ], + "type": "object" + }, + "RepositoryPresetResponse": { "properties": { "calculated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "name": { "type": "string" @@ -29571,42 +29674,37 @@ "type": "string" }, "presets": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectPresetResponse" - } + }, + "type": "array" }, "repository_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "RepositoryResponse": { - "type": "object", + }, "required": [ - "id", + "repository_id", "owner", "name", - "full_name", - "private", - "default_branch", - "created_at", - "updated_at", - "pushed_at", - "git_provider_connection_id" + "presets", + "calculated_at" ], + "type": "object" + }, + "RepositoryResponse": { "properties": { "clone_url": { + "description": "HTTPS clone URL (e.g., https://github.com/owner/repo.git)", "type": [ "string", "null" - ], - "description": "HTTPS clone URL (e.g., https://github.com/owner/repo.git)" + ] }, "created_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "default_branch": { "type": "string" @@ -29621,13 +29719,13 @@ "type": "string" }, "git_provider_connection_id": { - "type": "integer", + "description": "ID of the git provider connection this repository was synced from.", "format": "int32", - "description": "ID of the git provider connection this repository was synced from." + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "language": { "type": [ @@ -29642,69 +29740,70 @@ "type": "string" }, "preset": { + "items": { + "$ref": "#/components/schemas/ProjectPresetResponse" + }, "type": [ "array", "null" - ], - "items": { - "$ref": "#/components/schemas/ProjectPresetResponse" - } + ] }, "private": { "type": "boolean" }, "pushed_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "ssh_url": { + "description": "SSH clone URL (e.g., git@github.com:owner/repo.git)", "type": [ "string", "null" - ], - "description": "SSH clone URL (e.g., git@github.com:owner/repo.git)" + ] }, "updated_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "id", + "owner", + "name", + "full_name", + "private", + "default_branch", + "created_at", + "updated_at", + "pushed_at", + "git_provider_connection_id" + ], + "type": "object" }, "RepositorySyncStartedResponse": { - "type": "object", "description": "Returned by `POST /git-connections/{id}/sync` to acknowledge that a\nsync has been kicked off in the background. Clients should poll the\nconnection's `syncing` and `synced_repository_count` fields to track\nprogress rather than waiting on this response.", - "required": [ - "connection_id", - "syncing", - "started_at" - ], "properties": { "connection_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "started_at": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "syncing": { "type": "boolean" } - } - }, - "RequestRow": { - "type": "object", + }, "required": [ - "id", - "ts", - "method", - "host", - "path", - "status", - "request_headers", - "response_headers", - "headers_truncated" + "connection_id", + "syncing", + "started_at" ], + "type": "object" + }, + "RequestRow": { "properties": { "client_ip": { "type": [ @@ -29719,25 +29818,25 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_group_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "headers_truncated": { "type": "boolean" @@ -29746,15 +29845,15 @@ "type": "string" }, "id": { - "type": "string", - "description": "The request's unique `request_id` (assigned by the proxy). Used as the\nrow identity instead of the storage PK because the ClickHouse backend\nhas no serial id (rows come back with `id = 0`) while `request_id` is\nunique and present on both backends." + "description": "The request's unique `request_id` (assigned by the proxy). Used as the\nrow identity instead of the storage PK because the ClickHouse backend\nhas no serial id (rows come back with `id = 0`) while `request_id` is\nunique and present on both backends.", + "type": "string" }, "latency_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "method": { "type": "string" @@ -29777,8 +29876,8 @@ "request_headers": {}, "response_headers": {}, "status": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "trace_id": { "type": [ @@ -29787,8 +29886,8 @@ ] }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "user_agent": { "type": [ @@ -29796,85 +29895,134 @@ "null" ] } - } - }, - "ResetPasswordRequest": { - "type": "object", + }, "required": [ - "token", - "new_password" + "id", + "ts", + "method", + "host", + "path", + "status", + "request_headers", + "response_headers", + "headers_truncated" ], + "type": "object" + }, + "RequiredPasswordChangeRequest": { "properties": { "new_password": { "type": "string" - }, - "token": { - "type": "string" } - } - }, - "ResetPgStatStatementsRequest": { - "type": "object", - "description": "Explicit confirmation required for the destructive statistics reset.\n\nRequiring JSON makes the endpoint non-simple for browsers, preventing a\ndeployed same-site application from triggering it with a plain HTML form.", + }, "required": [ - "confirm" + "new_password" ], - "properties": { - "confirm": { - "type": "boolean", - "description": "Must be `true` to acknowledge the global, irreversible reset." - } - } + "type": "object" }, - "ResetPgStatStatementsResponse": { - "type": "object", - "description": "Response for the pg_stat_statements reset endpoint.", - "required": [ - "message" - ], + "RequiredPasswordChangeResponse": { "properties": { "message": { - "type": "string", - "description": "Human-readable message confirming the destructive action." - } - } - }, - "ResizeSandboxBody": { - "type": "object", - "required": [ - "disk_size_mb" - ], - "properties": { - "disk_size_mb": { - "type": "integer", - "format": "int64", - "description": "New root disk size in MB. Grow-only; must exceed the current size.", - "minimum": 0 - } - }, - "additionalProperties": false - }, - "ResolvedEnvVarResponse": { - "type": "object", - "description": "One entry in the computed env-var view that merges manual and integration\nsources and tags each result with its origin. `value_preview` is always\nmasked \u2014 plaintext must be fetched per-key via the existing reveal endpoint,\nwhich is audit-logged.", + "type": "string" + }, + "mfa_enrollment_required": { + "type": "boolean" + }, + "mfa_setup": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/MfaSetupResponse" + } + ] + }, + "success": { + "type": "boolean" + }, + "user_id": { + "format": "int32", + "type": "integer" + } + }, "required": [ - "key", - "value_preview", - "source", - "environments", - "include_in_preview" + "success", + "message", + "user_id", + "mfa_enrollment_required" + ], + "type": "object" + }, + "ResetPasswordRequest": { + "properties": { + "new_password": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "required": [ + "token", + "new_password" + ], + "type": "object" + }, + "ResetPgStatStatementsRequest": { + "description": "Explicit confirmation required for the destructive statistics reset.\n\nRequiring JSON makes the endpoint non-simple for browsers, preventing a\ndeployed same-site application from triggering it with a plain HTML form.", + "properties": { + "confirm": { + "description": "Must be `true` to acknowledge the global, irreversible reset.", + "type": "boolean" + } + }, + "required": [ + "confirm" + ], + "type": "object" + }, + "ResetPgStatStatementsResponse": { + "description": "Response for the pg_stat_statements reset endpoint.", + "properties": { + "message": { + "description": "Human-readable message confirming the destructive action.", + "type": "string" + } + }, + "required": [ + "message" ], + "type": "object" + }, + "ResizeSandboxBody": { + "additionalProperties": false, + "properties": { + "disk_size_mb": { + "description": "New root disk size in MB. Grow-only; must exceed the current size.", + "format": "int64", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "disk_size_mb" + ], + "type": "object" + }, + "ResolvedEnvVarResponse": { + "description": "One entry in the computed env-var view that merges manual and integration\nsources and tags each result with its origin. `value_preview` is always\nmasked — plaintext must be fetched per-key via the existing reveal endpoint,\nwhich is audit-logged.", "properties": { "environments": { - "type": "array", + "description": "Environments this var applies to. For integration-sourced vars this\nreflects every environment of the project (integrations are global).", "items": { "$ref": "#/components/schemas/EnvironmentInfo" }, - "description": "Environments this var applies to. For integration-sourced vars this\nreflects every environment of the project (integrations are global)." + "type": "array" }, "include_in_preview": { - "type": "boolean", - "description": "Whether the var would be auto-applied to preview environments.\nIntegration vars always surface in preview; manual vars follow the flag." + "description": "Whether the var would be auto-applied to preview environments.\nIntegration vars always surface in preview; manual vars follow the flag.", + "type": "boolean" }, "key": { "type": "string" @@ -29883,20 +30031,24 @@ "$ref": "#/components/schemas/ResolvedEnvVarSource" }, "value_preview": { - "type": "string", - "description": "Masked or truncated preview. Never the raw value." + "description": "Masked or truncated preview. Never the raw value.", + "type": "string" } - } + }, + "required": [ + "key", + "value_preview", + "source", + "environments", + "include_in_preview" + ], + "type": "object" }, "ResolvedEnvVarSource": { + "description": "Where a resolved env var comes from. Integration-sourced vars may be\n\"shadowed\" by a manual entry with the same key, in which case the response\ncarries `Manual` with `overrides_service` populated so the UI can still show\nthe integration icon.", "oneOf": [ { - "type": "object", - "description": "Manually-defined env var. If `overrides_service` is set, this key would\notherwise have been supplied by an integration \u2014 the UI should show the\nintegration icon plus an \"overridden\" indicator.", - "required": [ - "var_id", - "type" - ], + "description": "Manually-defined env var. If `overrides_service` is set, this key would\notherwise have been supplied by an integration — the UI should show the\nintegration icon plus an \"overridden\" indicator.", "properties": { "overrides_service": { "oneOf": [ @@ -29909,104 +30061,103 @@ ] }, "type": { - "type": "string", "enum": [ "manual" - ] + ], + "type": "string" }, "var_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - { - "type": "object", - "description": "Supplied by a linked external service (Postgres, Redis, S3, etc.).", + }, "required": [ - "service", + "var_id", "type" ], + "type": "object" + }, + { + "description": "Supplied by a linked external service (Postgres, Redis, S3, etc.).", "properties": { "service": { "$ref": "#/components/schemas/EnvVarIntegrationInfo" }, "type": { - "type": "string", "enum": [ "integration" - ] + ], + "type": "string" } - } + }, + "required": [ + "service", + "type" + ], + "type": "object" } - ], - "description": "Where a resolved env var comes from. Integration-sourced vars may be\n\"shadowed\" by a manual entry with the same key, in which case the response\ncarries `Manual` with `overrides_service` populated so the UI can still show\nthe integration icon." + ] }, "ResourceCounts": { - "type": "object", "description": "Quick count of resources involved in the migration", - "required": [ - "projects", - "environments", - "deployments", - "environment_variables", - "services", - "domains" - ], "properties": { "deployments": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "domains": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "environment_variables": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "environments": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "projects": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "services": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "projects", + "environments", + "deployments", + "environment_variables", + "services", + "domains" + ], + "type": "object" }, "ResourceFootprint": { - "type": "object", "description": "A CPU + memory footprint (requests or measured usage)", - "required": [ - "cpu_millis", - "memory_mb" - ], "properties": { "cpu_millis": { - "type": "integer", + "description": "CPU in millicores", "format": "int64", - "description": "CPU in millicores" + "type": "integer" }, "memory_mb": { - "type": "integer", + "description": "Memory in MB", "format": "int64", - "description": "Memory in MB" + "type": "integer" } - } + }, + "required": [ + "cpu_millis", + "memory_mb" + ], + "type": "object" }, "ResourceInfo": { - "type": "object", "description": "Resource attributes extracted from OTel resource descriptors.", - "required": [ - "service_name", - "attributes" - ], "properties": { "attributes": { "type": "object" @@ -30026,189 +30177,194 @@ "null" ] } - } + }, + "required": [ + "service_name", + "attributes" + ], + "type": "object" }, "ResourceLimitApplyResult": { - "type": "object", "description": "Per-container outcome of a live `docker update` call. Surfaced from the\nPATCH /resources endpoint so the UI can tell the operator whether the\nnew caps are already in effect or whether they only apply on next\nrecreate (e.g., container was missing).", - "required": [ - "role", - "container_name", - "outcome" - ], "properties": { "container_name": { "type": "string" }, "error": { + "description": "Populated only when `outcome == \"failed\"`.", "type": [ "string", "null" - ], - "description": "Populated only when `outcome == \"failed\"`." + ] }, "outcome": { - "type": "string", - "description": "One of:\n- \"applied\" \u2014 Docker accepted the update; caps are live now.\n- \"missing\" \u2014 container does not exist; caps stored, will apply on next start.\n- \"stopped\" \u2014 container exists but isn't running; Docker still\n accepts the update (the new caps apply on next start).\n- \"failed\" \u2014 `docker update` returned an error (see `error`)." + "description": "One of:\n- \"applied\" — Docker accepted the update; caps are live now.\n- \"missing\" — container does not exist; caps stored, will apply on next start.\n- \"stopped\" — container exists but isn't running; Docker still\n accepts the update (the new caps apply on next start).\n- \"failed\" — `docker update` returned an error (see `error`).", + "type": "string" }, "role": { - "type": "string", - "description": "`service_members.role` for cluster members; \"standalone\" otherwise." + "description": "`service_members.role` for cluster members; \"standalone\" otherwise.", + "type": "string" } - } + }, + "required": [ + "role", + "container_name", + "outcome" + ], + "type": "object" }, "ResourceLimits": { - "type": "object", "description": "Resource limits and requests", "properties": { "cpu_limit": { + "description": "CPU limit (millicores)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU limit (millicores)" + ] }, "cpu_request": { + "description": "CPU request (millicores)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "CPU request (millicores)" + ] }, "memory_limit": { + "description": "Memory limit (MB)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory limit (MB)" + ] }, "memory_request": { + "description": "Memory request (MB)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Memory request (MB)" + ] } - } + }, + "type": "object" }, "ResourceLimitsResponse": { - "type": "object", "description": "Container resource limits", "properties": { "cpu_limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "cpu_request": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "memory_limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "memory_request": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "ResourceLimitsUpdateResponse": { - "type": "object", "description": "Response from PATCH /external-services/{id}/resources.", - "required": [ - "limits", - "applied" - ], "properties": { "applied": { - "type": "array", + "description": "Per-container result of trying to apply the limits live.", "items": { "$ref": "#/components/schemas/ResourceLimitApplyResult" }, - "description": "Per-container result of trying to apply the limits live." + "type": "array" }, "limits": { "$ref": "#/components/schemas/ServiceResourceLimits", "description": "The limits that were persisted to the encrypted config." } - } + }, + "required": [ + "limits", + "applied" + ], + "type": "object" }, "ResourcesBody": { - "type": "object", "description": "Nested `resources: { memory, vcpus }` as sent by `@vercel/sandbox`.\n`memory` is in MB, `vcpus` is fractional CPU count.", "properties": { "memory": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "vcpus": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] } - } + }, + "type": "object" }, "RestoreCapabilities": { - "type": "object", "description": "Capabilities a service exposes for the generic restore framework.\n\nEach engine overrides `ExternalService::restore_capabilities` to declare\nwhat it supports. The handler layer uses this to validate requests and\nthe UI uses it to conditionally show options (e.g., PITR picker).", - "required": [ - "restore_in_place", - "restore_to_new_service", - "pitr" - ], "properties": { "earliest_pitr_time": { + "description": "Earliest recoverable timestamp, if `pitr` is true. Derived from\nengine-specific archive metadata (e.g., `pg_stat_archiver`).", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "Earliest recoverable timestamp, if `pitr` is true. Derived from\nengine-specific archive metadata (e.g., `pg_stat_archiver`)." + ] }, "latest_pitr_time": { + "description": "Latest recoverable timestamp, if `pitr` is true.", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "Latest recoverable timestamp, if `pitr` is true." + ] }, "pitr": { - "type": "boolean", - "description": "Point-in-time recovery using engine-specific continuous archives\n(WAL for Postgres, AOF for Redis, oplog for MongoDB, object versions for S3)." + "description": "Point-in-time recovery using engine-specific continuous archives\n(WAL for Postgres, AOF for Redis, oplog for MongoDB, object versions for S3).", + "type": "boolean" }, "restore_in_place": { - "type": "boolean", - "description": "Restore a backup onto the same running service (destructive)." + "description": "Restore a backup onto the same running service (destructive).", + "type": "boolean" }, "restore_to_new_service": { - "type": "boolean", - "description": "Restore a backup into a freshly provisioned service." + "description": "Restore a backup into a freshly provisioned service.", + "type": "boolean" } - } + }, + "required": [ + "restore_in_place", + "restore_to_new_service", + "pitr" + ], + "type": "object" }, "RestoreCapabilitiesResponse": { "allOf": [ @@ -30217,167 +30373,157 @@ "description": "Trait-declared capabilities." }, { - "type": "object", - "required": [ - "suggested_new_service_name" - ], "properties": { "suggested_new_service_name": { - "type": "string", - "description": "Suggested name for the new service when creating a clone. Safe to\npre-fill into the UI dialog; the user can edit before submitting." + "description": "Suggested name for the new service when creating a clone. Safe to\npre-fill into the UI dialog; the user can edit before submitting.", + "type": "string" } - } + }, + "required": [ + "suggested_new_service_name" + ], + "type": "object" } ] }, "RestorePlan": { - "type": "object", "description": "Preview of a restore operation. Answers \"what will happen if I click\nstart?\" with engine-level specificity so the user can confirm before\ncommitting to a destructive action.", - "required": [ - "engine", - "target_service", - "source_backup", - "strategy", - "steps", - "warnings", - "errors", - "destructive", - "mode" - ], "properties": { "destructive": { - "type": "boolean", - "description": "Whether any step overwrites existing data on the target service." + "description": "Whether any step overwrites existing data on the target service.", + "type": "boolean" }, "engine": { - "type": "string", - "description": "Target engine (\"postgres\", etc.)." + "description": "Target engine (\"postgres\", etc.).", + "type": "string" }, "errors": { - "type": "array", + "description": "Blocking problems. The UI disables the Start button when non-empty.", "items": { "type": "string" }, - "description": "Blocking problems. The UI disables the Start button when non-empty." + "type": "array" }, "mode": { - "type": "string", - "description": "Echo of the requested mode for the UI." + "description": "Echo of the requested mode for the UI.", + "type": "string" }, "source_backup": { "$ref": "#/components/schemas/PlanSourceBackup", "description": "Backup we'll read from." }, "steps": { - "type": "array", + "description": "Ordered list of human-readable actions the orchestrator will take.", "items": { "type": "string" }, - "description": "Ordered list of human-readable actions the orchestrator will take." + "type": "array" }, "strategy": { - "type": "string", - "description": "How the restore will be performed: \"walg_restore\", \"pg_dump_restore\",\nor \"unsupported\"." + "description": "How the restore will be performed: \"walg_restore\", \"pg_dump_restore\",\nor \"unsupported\".", + "type": "string" }, "target_service": { "$ref": "#/components/schemas/PlanTarget", "description": "Service we'll operate on (or provision a sibling of)." }, "warnings": { - "type": "array", + "description": "Non-blocking caveats the user should see (cross-service, empty\nlocation that will be auto-resolved, missing engine metadata, ...).", "items": { "type": "string" }, - "description": "Non-blocking caveats the user should see (cross-service, empty\nlocation that will be auto-resolved, missing engine metadata, ...)." + "type": "array" } - } + }, + "required": [ + "engine", + "target_service", + "source_backup", + "strategy", + "steps", + "warnings", + "errors", + "destructive", + "mode" + ], + "type": "object" }, "RestoreRequestMode": { + "description": "What the caller wants to do. Mirrors `externalsvc::RestoreMode` but\nflattened for JSON over the wire.", "oneOf": [ { - "type": "object", "description": "Restore the backup onto the existing service (destructive).", - "required": [ - "mode" - ], "properties": { "mode": { - "type": "string", "enum": [ "in_place" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "Provision a new service and restore into it.", + }, "required": [ - "name", "mode" ], + "type": "object" + }, + { + "description": "Provision a new service and restore into it.", "properties": { "mode": { - "type": "string", "enum": [ "new_service" - ] + ], + "type": "string" }, "name": { - "type": "string", - "description": "Name for the new service. Orchestrator auto-suggests\n`{source}-restore-{yyyymmdd-hhmm}` if caller omits, but we require\nan explicit value at the API boundary." + "description": "Name for the new service. Orchestrator auto-suggests\n`{source}-restore-{yyyymmdd-hhmm}` if caller omits, but we require\nan explicit value at the API boundary.", + "type": "string" }, "parameter_overrides": { "description": "Optional parameter overrides (port, docker_image, database)." } - } - }, - { - "type": "object", - "description": "Point-in-time recovery. Only valid on WAL-G backups (Postgres).", + }, "required": [ - "to_new_service", - "target", + "name", "mode" ], + "type": "object" + }, + { + "description": "Point-in-time recovery. Only valid on WAL-G backups (Postgres).", "properties": { "mode": { - "type": "string", "enum": [ "pitr" - ] + ], + "type": "string" }, "new_service_name": { + "description": "Required when `to_new_service` is true.", "type": [ "string", "null" - ], - "description": "Required when `to_new_service` is true." + ] }, "target": { "$ref": "#/components/schemas/RecoveryTarget", "description": "Recovery target kind + value." }, "to_new_service": { - "type": "boolean", - "description": "Whether PITR restores in place or creates a new service." + "description": "Whether PITR restores in place or creates a new service.", + "type": "boolean" } - } + }, + "required": [ + "to_new_service", + "target", + "mode" + ], + "type": "object" } - ], - "description": "What the caller wants to do. Mirrors `externalsvc::RestoreMode` but\nflattened for JSON over the wire." + ] }, "RestoreRunView": { - "type": "object", - "required": [ - "id", - "source_backup_id", - "source_service_id", - "mode", - "status", - "phase", - "created_at" - ], "properties": { "created_at": { "type": "string" @@ -30395,8 +30541,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "mode": { "type": "string" @@ -30406,12 +30552,12 @@ }, "recovery_target": {}, "source_backup_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "source_service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "started_at": { "type": [ @@ -30423,11 +30569,11 @@ "type": "string" }, "target_service_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "target_service_name": { "type": [ @@ -30435,24 +30581,27 @@ "null" ] } - } - }, - "RetentionCleanupFailure": { - "type": "object", + }, "required": [ - "backup_id", - "reason", - "partial", - "deleted_objects" + "id", + "source_backup_id", + "source_service_id", + "mode", + "status", + "phase", + "created_at" ], + "type": "object" + }, + "RetentionCleanupFailure": { "properties": { "backup_id": { "type": "string" }, "deleted_objects": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "partial": { "type": "boolean" @@ -30460,117 +30609,117 @@ "reason": { "type": "string" } - } - }, - "RetentionCleanupReport": { - "type": "object", + }, "required": [ - "dry_run", - "expired", - "deleted", - "failed", - "failures", - "deleted_backup_ids", - "deleted_backup_ids_truncated", - "partially_deleted_backup_ids", - "partially_deleted_backup_ids_truncated", - "candidate_backup_ids", - "candidate_backup_ids_truncated" + "backup_id", + "reason", + "partial", + "deleted_objects" ], + "type": "object" + }, + "RetentionCleanupReport": { "properties": { "candidate_backup_ids": { - "type": "array", + "description": "Capped sample of backups selected by the retention policy.", "items": { "type": "string" }, - "description": "Capped sample of backups selected by the retention policy." + "type": "array" }, "candidate_backup_ids_truncated": { "type": "boolean" }, "deleted": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "deleted_backup_ids": { - "type": "array", + "description": "Capped sample of deleted backup UUIDs for audit attribution.", "items": { "type": "string" }, - "description": "Capped sample of deleted backup UUIDs for audit attribution." + "type": "array" }, "deleted_backup_ids_truncated": { "type": "boolean" }, "dry_run": { - "type": "boolean", - "description": "True when this report is a non-destructive preview." + "description": "True when this report is a non-destructive preview.", + "type": "boolean" }, "expired": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "failed": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "failures": { - "type": "array", + "description": "Capped diagnostic sample; `failed` remains the authoritative total.", "items": { "$ref": "#/components/schemas/RetentionCleanupFailure" }, - "description": "Capped diagnostic sample; `failed` remains the authoritative total." + "type": "array" }, "partially_deleted_backup_ids": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "partially_deleted_backup_ids_truncated": { "type": "boolean" }, "schedule_id": { + "description": "Schedule scope, or `None` when every schedule was considered.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Schedule scope, or `None` when every schedule was considered." + ] } - } + }, + "required": [ + "dry_run", + "expired", + "deleted", + "failed", + "failures", + "deleted_backup_ids", + "deleted_backup_ids_truncated", + "partially_deleted_backup_ids", + "partially_deleted_backup_ids_truncated", + "candidate_backup_ids", + "candidate_backup_ids_truncated" + ], + "type": "object" }, "RetryClusterRequest": { - "type": "object", "description": "Request body for retrying a failed cluster initialization.", "properties": { "members": { - "type": "array", + "description": "Cluster member specifications (same format as create).\nIf omitted, the original member configuration is reconstructed from\nthe preserved service_members records.", "items": { "$ref": "#/components/schemas/ClusterMemberRequest" }, - "description": "Cluster member specifications (same format as create).\nIf omitted, the original member configuration is reconstructed from\nthe preserved service_members records." + "type": "array" } - } + }, + "type": "object" }, "RevenueRow": { - "type": "object", - "required": [ - "id", - "ts", - "provider", - "event_type" - ], "properties": { "amount_minor": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "currency": { "type": [ @@ -30585,25 +30734,25 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "event_type": { "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "provider": { "type": "string" @@ -30615,13 +30764,19 @@ ] }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "id", + "ts", + "provider", + "event_type" + ], + "type": "object" }, "RiskLevel": { - "type": "string", "description": "Risk level for a migration step", "enum": [ "none", @@ -30629,131 +30784,126 @@ "medium", "high", "critical" - ] + ], + "type": "string" }, "RoleInfo": { - "type": "object", "description": "Information about a role", - "required": [ - "name", - "description", - "permissions" - ], "properties": { "description": { - "type": "string", - "description": "Human-readable description of the role" + "description": "Human-readable description of the role", + "type": "string" }, "name": { - "type": "string", - "description": "The role identifier (e.g., \"admin\")" + "description": "The role identifier (e.g., \"admin\")", + "type": "string" }, "permissions": { - "type": "array", + "description": "Permissions included in this role", "items": { "type": "string" }, - "description": "Permissions included in this role" + "type": "array" } - } + }, + "required": [ + "name", + "description", + "permissions" + ], + "type": "object" }, "RootfsCacheEntry": { - "type": "object", "description": "A cached rootfs image (Firecracker backend). Digest-keyed build artifact\nshared by all VMs created from the same image.", - "required": [ - "digest", - "bytes", - "referenced_by" - ], "properties": { "bytes": { - "type": "integer", - "format": "int64", "description": "Actual on-disk size in bytes (sparse-aware).", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "digest": { - "type": "string", - "description": "Image digest this rootfs was built from (the cache key)." + "description": "Image digest this rootfs was built from (the cache key).", + "type": "string" }, "referenced_by": { - "type": "array", + "description": "IDs of live sandboxes whose per-VM disk was cloned from this entry.\nEmpty means the entry is reclaimable — no sandbox needs it.", "items": { "type": "string" }, - "description": "IDs of live sandboxes whose per-VM disk was cloned from this entry.\nEmpty means the entry is reclaimable \u2014 no sandbox needs it." + "type": "array" } - } + }, + "required": [ + "digest", + "bytes", + "referenced_by" + ], + "type": "object" }, "RootfsGcReport": { - "type": "object", "description": "Outcome of a rootfs garbage-collection pass.", - "required": [ - "removed_digests", - "freed_bytes" - ], "properties": { "freed_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "removed_digests": { - "type": "array", + "description": "Digests of cache entries removed because no sandbox referenced them.", "items": { "type": "string" }, - "description": "Digests of cache entries removed because no sandbox referenced them." + "type": "array" } - } + }, + "required": [ + "removed_digests", + "freed_bytes" + ], + "type": "object" }, "RootfsReport": { - "type": "object", "description": "Snapshot of a backend's rootfs storage for the management API. Backends\nwithout a rootfs concept (Docker, local) return an empty report.", - "required": [ - "cache_bytes", - "cache", - "vm_bytes", - "vms" - ], "properties": { "cache": { - "type": "array", "items": { "$ref": "#/components/schemas/RootfsCacheEntry" - } + }, + "type": "array" }, "cache_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "vm_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "vms": { - "type": "array", "items": { "$ref": "#/components/schemas/RootfsVmEntry" - } + }, + "type": "array" } - } - }, - "RootfsVmEntry": { - "type": "object", - "description": "A per-sandbox rootfs disk (Firecracker backend). One per non-destroyed\nsandbox \u2014 the authoritative storage, independent of the cache.", + }, "required": [ - "sandbox_name", - "bytes", - "running" + "cache_bytes", + "cache", + "vm_bytes", + "vms" ], + "type": "object" + }, + "RootfsVmEntry": { + "description": "A per-sandbox rootfs disk (Firecracker backend). One per non-destroyed\nsandbox — the authoritative storage, independent of the cache.", "properties": { "bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "running": { "type": "boolean" @@ -30761,42 +30911,37 @@ "sandbox_name": { "type": "string" } - } - }, - "RouteRefreshResponse": { - "type": "object", + }, "required": [ - "route_count", - "message" + "sandbox_name", + "bytes", + "running" ], + "type": "object" + }, + "RouteRefreshResponse": { "properties": { "message": { - "type": "string", - "description": "Human-readable message" + "description": "Human-readable message", + "type": "string" }, "route_count": { - "type": "integer", "description": "Number of routes loaded", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "route_count", + "message" + ], + "type": "object" }, "RouteResponse": { - "type": "object", - "required": [ - "id", - "domain", - "host", - "port", - "enabled", - "route_type", - "created_at", - "updated_at" - ], "properties": { "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "domain": { "type": "string" @@ -30808,76 +30953,75 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "port": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "route_type": { - "type": "string", - "description": "Route type: \"http\" or \"tls\"" + "description": "Route type: \"http\" or \"tls\"", + "type": "string" }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "RouteRole": { - "type": "object", + }, "required": [ "id", - "name", + "domain", + "host", + "port", + "enabled", + "route_type", "created_at", "updated_at" ], + "type": "object" + }, + "RouteRole": { "properties": { "created_at": { - "type": "integer", + "example": "1683900000000", "format": "int64", - "example": "1683900000000" + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" }, "updated_at": { - "type": "integer", + "example": "1683900000000", "format": "int64", - "example": "1683900000000" + "type": "integer" } - } - }, - "RouteUser": { - "type": "object", + }, "required": [ "id", "name", - "username", - "email", - "image", - "mfa_enabled", - "email_verified", "created_at", "updated_at" ], + "type": "object" + }, + "RouteUser": { "properties": { "created_at": { - "type": "integer", + "example": "1683900000000", "format": "int64", - "example": "1683900000000" + "type": "integer" }, "deleted_at": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] }, "email": { "type": "string" @@ -30886,8 +31030,8 @@ "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "image": { "type": "string" @@ -30895,100 +31039,108 @@ "mfa_enabled": { "type": "boolean" }, + "must_change_password": { + "type": "boolean" + }, "name": { "type": "string" }, "updated_at": { - "type": "integer", + "example": "1683900000000", "format": "int64", - "example": "1683900000000" + "type": "integer" }, "username": { "type": "string" } - } - }, - "RouteUserWithRoles": { - "type": "object", + }, "required": [ - "user", - "roles" + "id", + "name", + "username", + "email", + "image", + "mfa_enabled", + "email_verified", + "must_change_password", + "created_at", + "updated_at" ], + "type": "object" + }, + "RouteUserWithRoles": { "properties": { "roles": { - "type": "array", "items": { "$ref": "#/components/schemas/RouteRole" - } + }, + "type": "array" }, "user": { "$ref": "#/components/schemas/RouteUser" } - } - }, - "RunBackupRequest": { - "type": "object", + }, "required": [ - "backup_type" + "user", + "roles" ], + "type": "object" + }, + "RunBackupRequest": { "properties": { "backup_type": { - "type": "string", "description": "Type of backup to perform", - "example": "full" + "example": "full", + "type": "string" } - } + }, + "required": [ + "backup_type" + ], + "type": "object" }, "RunExternalServiceBackupRequest": { - "type": "object", "properties": { "backup_type": { + "description": "Type of backup to perform (e.g., \"full\", \"incremental\")", + "example": "full", "type": [ "string", "null" - ], - "description": "Type of backup to perform (e.g., \"full\", \"incremental\")", - "example": "full" + ] }, "s3_source_id": { + "description": "ID of the S3 source to store the backup. If omitted, the current default S3 source is used.", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "ID of the S3 source to store the backup. If omitted, the current default S3 source is used.", - "example": 1 + ] } - } + }, + "type": "object" }, "S3ConnectionTestResponse": { - "type": "object", "description": "Response body for an S3 connection test.", - "required": [ - "ok", - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable message (success confirmation or error detail)." + "description": "Human-readable message (success confirmation or error detail).", + "type": "string" }, "ok": { - "type": "boolean", - "description": "Whether the connection and credentials worked." + "description": "Whether the connection and credentials worked.", + "type": "boolean" } - } + }, + "required": [ + "ok", + "message" + ], + "type": "object" }, "S3CredentialsResponse": { - "type": "object", "description": "S3 credentials distributed to agents for backup/restore operations.", - "required": [ - "access_key_id", - "secret_key", - "region", - "bucket_name", - "force_path_style" - ], "properties": { "access_key_id": { "type": "string" @@ -31011,27 +31163,22 @@ "secret_key": { "type": "string" } - } - }, - "S3SourceResponse": { - "type": "object", - "description": "Response type for S3 source", + }, "required": [ - "id", - "name", - "bucket_name", - "bucket_path", "access_key_id", "secret_key", "region", - "is_default", - "created_at", - "updated_at" + "bucket_name", + "force_path_style" ], + "type": "object" + }, + "S3SourceResponse": { + "description": "Response type for S3 source", "properties": { "access_key_id": { - "type": "string", - "example": "AKIAXXXXXXXXXXXXXXXX" + "example": "AKIAXXXXXXXXXXXXXXXX", + "type": "string" }, "bucket_name": { "type": "string" @@ -31040,15 +31187,15 @@ "type": "string" }, "created_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "endpoint": { + "example": "http://minio.example.com:9000", "type": [ "string", "null" - ], - "example": "http://minio.example.com:9000" + ] }, "force_path_style": { "type": [ @@ -31057,8 +31204,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_default": { "type": "boolean" @@ -31074,107 +31221,104 @@ "writeOnly": true }, "updated_at": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SandboxDomainResponse": { - "type": "object", + }, "required": [ - "url" + "id", + "name", + "bucket_name", + "bucket_path", + "access_key_id", + "secret_key", + "region", + "is_default", + "created_at", + "updated_at" ], + "type": "object" + }, + "SandboxDomainResponse": { "properties": { "url": { "type": "string" } - } + }, + "required": [ + "url" + ], + "type": "object" }, "SandboxEvent": { - "type": "object", "description": "One entry in a sandbox's operations timeline.", - "required": [ - "event_type", - "at" - ], "properties": { "at": { - "type": "integer", + "description": "Unix epoch milliseconds.", "format": "int64", - "description": "Unix epoch milliseconds." + "type": "integer" }, "detail": { "description": "Optional structured context (shape depends on `event_type`)." }, "event_type": { - "type": "string", - "description": "Machine-readable operation (`created`, `stopped`, `resumed`,\n`restarted`, `timeout_extended`, `resized`, `preview_password_set`,\n`preview_password_cleared`, `preview_share_link_created`, `source_seeded`,\n`destroyed`)." + "description": "Machine-readable operation (`created`, `stopped`, `resumed`,\n`restarted`, `timeout_extended`, `resized`, `preview_password_set`,\n`preview_password_cleared`, `preview_share_link_created`, `source_seeded`,\n`destroyed`).", + "type": "string" } - } - }, - "SandboxEventsResponse": { - "type": "object", + }, "required": [ - "events" + "event_type", + "at" ], + "type": "object" + }, + "SandboxEventsResponse": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/SandboxEvent" - } + }, + "type": "array" } - } - }, - "SandboxInner": { - "type": "object", - "description": "Inner `sandbox` object in `@vercel/sandbox` responses. Strict shape \u2014\nthe SDK's zod validator rejects missing required fields.", + }, "required": [ - "id", - "memory", - "vcpus", - "region", - "runtime", - "timeout", - "status", - "requestedAt", - "createdAt", - "updatedAt", - "cwd", - "name", - "preview_url_template" + "events" ], + "type": "object" + }, + "SandboxInner": { + "description": "Inner `sandbox` object in `@vercel/sandbox` responses. Strict shape —\nthe SDK's zod validator rejects missing required fields.", "properties": { "agent_run_id": { + "description": "Agent run this sandbox executes (autofixer / workflow agent).\n`None` for sandboxes created via this API.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Agent run this sandbox executes (autofixer / workflow agent).\n`None` for sandboxes created via this API." + ] }, "backend": { + "description": "Isolation backend: \"docker\" | \"firecracker\". `None` on legacy rows\ncreated before the backend was recorded.", "type": [ "string", "null" - ], - "description": "Isolation backend: \"docker\" | \"firecracker\". `None` on legacy rows\ncreated before the backend was recorded." + ] }, "createdAt": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "cwd": { "type": "string" }, "disk_size_mb": { + "description": "Configured root disk size in MB (Firecracker). `None` when unknown or\nthe default.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Configured root disk size in MB (Firecracker). `None` when unknown or\nthe default.", - "minimum": 0 + ] }, "id": { "type": "string" @@ -31186,9 +31330,9 @@ ] }, "memory": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "name": { "type": "string" @@ -31206,9 +31350,9 @@ "type": "string" }, "requestedAt": { - "type": "integer", + "description": "Creation time as Unix epoch milliseconds.", "format": "int64", - "description": "Creation time as Unix epoch milliseconds." + "type": "integer" }, "runtime": { "type": "string" @@ -31217,53 +31361,63 @@ "type": "string" }, "timeout": { - "type": "integer", - "format": "int64", "description": "Idle timeout in milliseconds (SDK convention).", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "updatedAt": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "vcpus": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "id", + "memory", + "vcpus", + "region", + "runtime", + "timeout", + "status", + "requestedAt", + "createdAt", + "updatedAt", + "cwd", + "name", + "preview_url_template" + ], + "type": "object" }, "SandboxResponse": { - "type": "object", "description": "`@vercel/sandbox` wraps every single-sandbox response as\n`{ sandbox: {...}, routes: [...] }`. The SDK reads both.", - "required": [ - "sandbox", - "routes" - ], "properties": { "routes": { - "type": "array", "items": { "$ref": "#/components/schemas/SandboxRoute" - } + }, + "type": "array" }, "sandbox": { "$ref": "#/components/schemas/SandboxInner" } - } - }, - "SandboxRoute": { - "type": "object", - "description": "A single preview route, one per declared port. We don't know ports\nupfront, so we surface an empty array by default \u2014 SDK clients use\ntheir own port when calling `sandbox.domain(port)`.", + }, "required": [ - "url", - "subdomain", - "port" + "sandbox", + "routes" ], + "type": "object" + }, + "SandboxRoute": { + "description": "A single preview route, one per declared port. We don't know ports\nupfront, so we surface an empty array by default — SDK clients use\ntheir own port when calling `sandbox.domain(port)`.", "properties": { "port": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "subdomain": { "type": "string" @@ -31271,16 +31425,15 @@ "url": { "type": "string" } - } - }, - "SandboxStatusResponse": { - "type": "object", + }, "required": [ - "docker_available", - "image_ready", - "image_name", - "firecracker_available" + "url", + "subdomain", + "port" ], + "type": "object" + }, + "SandboxStatusResponse": { "properties": { "docker_available": { "type": "boolean" @@ -31300,55 +31453,56 @@ "image_ready": { "type": "boolean" } - } - }, - "SaveAgentTokenRequest": { - "type": "object", + }, "required": [ - "token" + "docker_available", + "image_ready", + "image_name", + "firecracker_available" ], + "type": "object" + }, + "SaveAgentTokenRequest": { "properties": { "token": { - "type": "string", - "description": "The OAuth token from `claude setup-token` or an API key.\nWill be encrypted before storage." + "description": "The OAuth token from `claude setup-token` or an API key.\nWill be encrypted before storage.", + "type": "string" } - } - }, - "SaveAgentTokenResponse": { - "type": "object", + }, "required": [ - "saved" + "token" ], + "type": "object" + }, + "SaveAgentTokenResponse": { "properties": { "saved": { "type": "boolean" } - } - }, - "SaveCredentialRequest": { - "type": "object", + }, "required": [ - "auth_type", - "credential" + "saved" ], + "type": "object" + }, + "SaveCredentialRequest": { "properties": { "auth_type": { - "type": "string", - "description": "Auth flavor id (must match one of the provider's catalog entries)." + "description": "Auth flavor id (must match one of the provider's catalog entries).", + "type": "string" }, "credential": { - "type": "string", - "description": "Plaintext credential body (API key, OAuth token, or full config file\ncontents). Encrypted with `EncryptionService` before being persisted\ninside the `agent_sandbox.providers` JSON map." + "description": "Plaintext credential body (API key, OAuth token, or full config file\ncontents). Encrypted with `EncryptionService` before being persisted\ninside the `agent_sandbox.providers` JSON map.", + "type": "string" } - } - }, - "SaveCredentialResponse": { - "type": "object", + }, "required": [ - "saved", - "provider_id", - "auth_type" + "auth_type", + "credential" ], + "type": "object" + }, + "SaveCredentialResponse": { "properties": { "auth_type": { "type": "string" @@ -31359,42 +31513,32 @@ "saved": { "type": "boolean" } - } - }, - "ScalewayCredentialsRequest": { - "type": "object", + }, "required": [ - "api_key", - "project_id" + "saved", + "provider_id", + "auth_type" ], + "type": "object" + }, + "ScalewayCredentialsRequest": { "properties": { "api_key": { - "type": "string", - "example": "scw-secret-key-12345" + "example": "scw-secret-key-12345", + "type": "string" }, "project_id": { - "type": "string", - "example": "12345678-1234-1234-1234-123456789012" + "example": "12345678-1234-1234-1234-123456789012", + "type": "string" } - } - }, - "ScanResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "scanner_type", - "status", - "total_count", - "critical_count", - "high_count", - "medium_count", - "low_count", - "unknown_count", - "started_at", - "created_at", - "updated_at" + "api_key", + "project_id" ], + "type": "object" + }, + "ScanResponse": { "properties": { "branch": { "type": [ @@ -31409,33 +31553,33 @@ ] }, "completed_at": { + "example": "2025-12-08T12:15:47.609192Z", "type": [ "string", "null" - ], - "example": "2025-12-08T12:15:47.609192Z" + ] }, "created_at": { - "type": "string", - "example": "2025-12-08T12:15:47.609192Z" + "example": "2025-12-08T12:15:47.609192Z", + "type": "string" }, "critical_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_message": { "type": [ @@ -31444,24 +31588,24 @@ ] }, "high_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "low_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "medium_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "scanner_type": { "type": "string" @@ -31473,490 +31617,500 @@ ] }, "started_at": { - "type": "string", - "example": "2025-12-08T12:15:47.609192Z" + "example": "2025-12-08T12:15:47.609192Z", + "type": "string" }, "status": { "type": "string" }, "total_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "unknown_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", - "example": "2025-12-08T12:15:47.609192Z" + "example": "2025-12-08T12:15:47.609192Z", + "type": "string" } - } - }, - "ScheduleRunEntry": { - "type": "object", - "description": "A single run-history entry for the schedule detail page (deliverable 1).\n\nCombines one `backups` row with the most-recent `backup_jobs` row for that\nbackup via a lateral JOIN. Fields from `backup_jobs` are `None` for legacy\nbackup rows that pre-date ADR-014.", + }, "required": [ - "backup_id", - "backup_uuid", - "state", + "id", + "project_id", + "scanner_type", + "status", + "total_count", + "critical_count", + "high_count", + "medium_count", + "low_count", + "unknown_count", "started_at", - "s3_location" + "created_at", + "updated_at" ], + "type": "object" + }, + "ScheduleRunEntry": { + "description": "A single run-history entry for the schedule detail page (deliverable 1).\n\nCombines one `backups` row with the most-recent `backup_jobs` row for that\nbackup via a lateral JOIN. Fields from `backup_jobs` are `None` for legacy\nbackup rows that pre-date ADR-014.", "properties": { "attempts": { + "description": "Number of claim-and-run attempts so far. `None` for legacy rows.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Number of claim-and-run attempts so far. `None` for legacy rows." + ] }, "backup_id": { - "type": "integer", + "description": "DB id of the `backups` row.", "format": "int32", - "description": "DB id of the `backups` row." + "type": "integer" }, "backup_uuid": { - "type": "string", - "description": "UUID string (`backups.backup_id`)." + "description": "UUID string (`backups.backup_id`).", + "type": "string" }, "current_step": { + "description": "Last completed step reported by the engine (e.g. `\"upload\"`).\n`None` when no step has been persisted yet.", "type": [ "string", "null" - ], - "description": "Last completed step reported by the engine (e.g. `\"upload\"`).\n`None` when no step has been persisted yet." + ] }, "error_message": { + "description": "Engine-reported error message when `state = \"failed\"`.", "type": [ "string", "null" - ], - "description": "Engine-reported error message when `state = \"failed\"`." + ] }, "finished_at": { + "description": "When the backup finished, if known.", "type": [ "string", "null" - ], - "description": "When the backup finished, if known." + ] }, "job_id": { + "description": "Most recent `backup_jobs.id` for this backup. `None` for legacy rows.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Most recent `backup_jobs.id` for this backup. `None` for legacy rows." + ] }, "s3_location": { - "type": "string", - "description": "S3 object key or URL where the backup data lives." + "description": "S3 object key or URL where the backup data lives.", + "type": "string" }, "size_bytes": { + "description": "Final size in bytes once completed. `None` while running.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Final size in bytes once completed. `None` while running." + ] }, "started_at": { - "type": "string", - "description": "When the backup was started (ISO 8601 / RFC 3339)." + "description": "When the backup was started (ISO 8601 / RFC 3339).", + "type": "string" }, "state": { - "type": "string", - "description": "Current state: `\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`." + "description": "Current state: `\"pending\"`, `\"running\"`, `\"completed\"`, `\"failed\"`.", + "type": "string" } - } - }, - "ScheduleRunJobEntry": { - "type": "object", - "description": "A single job entry inside an expanded schedule run, returned by\n[`BackupService::list_schedule_run_jobs`].", + }, "required": [ "backup_id", "backup_uuid", - "engine", - "service_name", "state", "started_at", - "s3_source_id" + "s3_location" ], + "type": "object" + }, + "ScheduleRunJobEntry": { + "description": "A single job entry inside an expanded schedule run, returned by\n[`BackupService::list_schedule_run_jobs`].", "properties": { "backup_id": { - "type": "integer", + "description": "`backups.id` for this job.", "format": "int32", - "description": "`backups.id` for this job." + "type": "integer" }, "backup_uuid": { - "type": "string", - "description": "`backups.backup_id` UUID string." + "description": "`backups.backup_id` UUID string.", + "type": "string" }, "engine": { - "type": "string", - "description": "Engine key (e.g. `\"control_plane\"`, `\"redis\"`)." + "description": "Engine key (e.g. `\"control_plane\"`, `\"redis\"`).", + "type": "string" }, "error_message": { + "description": "Engine-reported error message when `state = \"failed\"`.", "type": [ "string", "null" - ], - "description": "Engine-reported error message when `state = \"failed\"`." + ] }, "finished_at": { + "description": "When this child backup finished, if known.", "type": [ "string", "null" - ], - "description": "When this child backup finished, if known." + ] }, "s3_source_id": { - "type": "integer", + "description": "FK to `s3_sources.id` — needed for the backup detail link.", "format": "int32", - "description": "FK to `s3_sources.id` \u2014 needed for the backup detail link." + "type": "integer" }, "service_id": { + "description": "`external_services.id` — `NULL` for the control-plane job.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "`external_services.id` \u2014 `NULL` for the control-plane job." + ] }, "service_name": { - "type": "string", - "description": "Name of the external service, or `\"control plane\"` for the\ncontrol-plane job." + "description": "Name of the external service, or `\"control plane\"` for the\ncontrol-plane job.", + "type": "string" }, "size_bytes": { + "description": "Size in bytes once completed; `None` while running.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size in bytes once completed; `None` while running." + ] }, "started_at": { - "type": "string", - "description": "When this child backup started (ISO 8601 / RFC 3339)." + "description": "When this child backup started (ISO 8601 / RFC 3339).", + "type": "string" }, "state": { - "type": "string", - "description": "Current state of this child backup." + "description": "Current state of this child backup.", + "type": "string" } - } + }, + "required": [ + "backup_id", + "backup_uuid", + "engine", + "service_name", + "state", + "started_at", + "s3_source_id" + ], + "type": "object" }, "ScheduleRunListResponse": { - "type": "object", "description": "Paginated run-history response for a backup schedule (deliverable 1).", - "required": [ - "runs", - "total", - "page", - "page_size" - ], "properties": { "page": { - "type": "integer", + "description": "Current page (1-based).", "format": "int64", - "description": "Current page (1-based)." + "type": "integer" }, "page_size": { - "type": "integer", + "description": "Number of items per page (clamped to 1–100).", "format": "int64", - "description": "Number of items per page (clamped to 1\u2013100)." + "type": "integer" }, "runs": { - "type": "array", + "description": "Run entries, newest first.", "items": { "$ref": "#/components/schemas/ScheduleRunEntry" }, - "description": "Run entries, newest first." + "type": "array" }, "total": { - "type": "integer", + "description": "Total number of runs across all pages.", "format": "int64", - "description": "Total number of runs across all pages." + "type": "integer" } - } + }, + "required": [ + "runs", + "total", + "page", + "page_size" + ], + "type": "object" }, "ScheduleRunResponse": { - "type": "object", "description": "HTTP response body for `POST /api/backups/schedules/{id}/run` (fan-out).", - "required": [ - "schedule_run_id", - "jobs" - ], "properties": { "jobs": { - "type": "array", + "description": "All jobs that were enqueued in this fan-out.", "items": { "$ref": "#/components/schemas/EnqueuedJob" }, - "description": "All jobs that were enqueued in this fan-out." + "type": "array" }, "schedule_run_id": { - "type": "integer", + "description": "The `schedule_runs.id` of the newly created run.", "format": "int64", - "description": "The `schedule_runs.id` of the newly created run." + "type": "integer" } - } - }, - "ScheduleRunSummary": { - "type": "object", - "description": "Summary of one scheduler tick (or one \"Run now\" click), returned by\n[`BackupService::list_schedule_runs`].\n\nThe `aggregate_state` is computed at read time from child backup counts:\n- `\"running\"` \u2014 at least one child is `\"pending\"` or `\"running\"`.\n- `\"failed\"` \u2014 at least one child is `\"failed\"` and none are running.\n- `\"completed\"` \u2014 all children are `\"completed\"`.", + }, "required": [ - "run_id", - "schedule_id", - "triggered_by", - "started_at", - "aggregate_state", - "total_jobs", - "completed_jobs", - "failed_jobs", - "running_jobs", - "pending_jobs" + "schedule_run_id", + "jobs" ], + "type": "object" + }, + "ScheduleRunSummary": { + "description": "Summary of one scheduler tick (or one \"Run now\" click), returned by\n[`BackupService::list_schedule_runs`].\n\nThe `aggregate_state` is computed at read time from child backup counts:\n- `\"running\"` — at least one child is `\"pending\"` or `\"running\"`.\n- `\"failed\"` — at least one child is `\"failed\"` and none are running.\n- `\"completed\"` — all children are `\"completed\"`.", "properties": { "aggregate_state": { - "type": "string", - "description": "Aggregate state computed from child counts (see struct docs)." + "description": "Aggregate state computed from child counts (see struct docs).", + "type": "string" }, "completed_jobs": { - "type": "integer", + "description": "Number of children in `state = \"completed\"`.", "format": "int64", - "description": "Number of children in `state = \"completed\"`." + "type": "integer" }, "failed_jobs": { - "type": "integer", + "description": "Number of children in `state = \"failed\"`.", "format": "int64", - "description": "Number of children in `state = \"failed\"`." + "type": "integer" }, "finished_at": { + "description": "When all children reached a terminal state. `None` while any child is\nstill `\"pending\"` or `\"running\"`.", "type": [ "string", "null" - ], - "description": "When all children reached a terminal state. `None` while any child is\nstill `\"pending\"` or `\"running\"`." + ] }, "pending_jobs": { - "type": "integer", + "description": "Number of children in `state = \"pending\"`.", "format": "int64", - "description": "Number of children in `state = \"pending\"`." + "type": "integer" }, "run_id": { - "type": "integer", + "description": "`schedule_runs.id` for this tick.", "format": "int64", - "description": "`schedule_runs.id` for this tick." + "type": "integer" }, "running_jobs": { - "type": "integer", + "description": "Number of children in `state = \"running\"`.", "format": "int64", - "description": "Number of children in `state = \"running\"`." + "type": "integer" }, "schedule_id": { - "type": "integer", + "description": "FK to `backup_schedules.id`.", "format": "int32", - "description": "FK to `backup_schedules.id`." + "type": "integer" }, "started_at": { - "type": "string", - "description": "When the fan-out started (ISO 8601 / RFC 3339)." + "description": "When the fan-out started (ISO 8601 / RFC 3339).", + "type": "string" }, "total_jobs": { - "type": "integer", + "description": "Total number of child backup jobs in this run.", "format": "int64", - "description": "Total number of child backup jobs in this run." + "type": "integer" }, "triggered_by": { - "type": "string", - "description": "How the run was triggered: `\"cron\"` or `\"manual\"`." + "description": "How the run was triggered: `\"cron\"` or `\"manual\"`.", + "type": "string" } - } + }, + "required": [ + "run_id", + "schedule_id", + "triggered_by", + "started_at", + "aggregate_state", + "total_jobs", + "completed_jobs", + "failed_jobs", + "running_jobs", + "pending_jobs" + ], + "type": "object" }, "ScheduleRunSummaryList": { - "type": "object", "description": "Paginated list of schedule run summaries returned by the new\n[`BackupService::list_schedule_runs`].", - "required": [ - "runs", - "total", - "page", - "page_size" - ], "properties": { "page": { - "type": "integer", + "description": "Current page (1-based).", "format": "int64", - "description": "Current page (1-based)." + "type": "integer" }, "page_size": { - "type": "integer", + "description": "Number of items per page.", "format": "int64", - "description": "Number of items per page." + "type": "integer" }, "runs": { - "type": "array", + "description": "Run summaries, newest first. Includes synthetic single-job rows for\nlegacy `backups` rows that have `schedule_id` set but no\n`schedule_run_id` (pre-fan-out history).", "items": { "$ref": "#/components/schemas/ScheduleRunSummary" }, - "description": "Run summaries, newest first. Includes synthetic single-job rows for\nlegacy `backups` rows that have `schedule_id` set but no\n`schedule_run_id` (pre-fan-out history)." + "type": "array" }, "total": { - "type": "integer", + "description": "Total number of run entries across all pages.", "format": "int64", - "description": "Total number of run entries across all pages." + "type": "integer" } - } + }, + "required": [ + "runs", + "total", + "page", + "page_size" + ], + "type": "object" }, "ScreenshotSettings": { - "type": "object", "properties": { "enabled": { - "type": "boolean", - "default": false + "default": false, + "type": "boolean" }, "provider": { - "type": "string", - "default": "local" + "default": "local", + "type": "string" }, "url": { - "type": "string", - "default": "" + "default": "", + "type": "string" } - } + }, + "type": "object" }, "SearchLogsRequest": { - "type": "object", - "required": [ - "project_id" - ], "properties": { "container_ids": { - "type": "array", + "description": "Filter to specific containers (Docker container IDs). Empty = all\ncontainers. Drives \"filter by container / show all\" in a project's\nhistory, which spans multiple deployments and containers.", "items": { "type": "string" }, - "description": "Filter to specific containers (Docker container IDs). Empty = all\ncontainers. Drives \"filter by container / show all\" in a project's\nhistory, which spans multiple deployments and containers." + "type": "array" }, "context_lines": { + "description": "grep -C: number of raw context lines to include before and after each\nmatch (0 = none, default). Clamped to 50 server-side. The surrounding\nlines ignore the level/text filters — they are the actual adjacent log\nlines, merged across overlapping matches.", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "grep -C: number of raw context lines to include before and after each\nmatch (0 = none, default). Clamped to 50 server-side. The surrounding\nlines ignore the level/text filters \u2014 they are the actual adjacent log\nlines, merged across overlapping matches.", - "minimum": 0 + ] }, "cursor": { + "description": "Pagination cursor", "type": [ "string", "null" - ], - "description": "Pagination cursor" + ] }, "deploy_id": { + "description": "Filter by deployment ID (deployments.id)", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by deployment ID (deployments.id)" + ] }, "end_time": { + "description": "End of time range (ISO 8601). Defaults to now.", "type": [ "string", "null" - ], - "description": "End of time range (ISO 8601). Defaults to now." + ] }, "envs": { - "type": "array", + "description": "Filter by environments", "items": { "type": "string" }, - "description": "Filter by environments" + "type": "array" }, "external_service_id": { + "description": "When set, search an imported/managed external service's logs instead\nof a project's. `project_id` is ignored in this mode.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "When set, search an imported/managed external service's logs instead\nof a project's. `project_id` is ignored in this mode." + ] }, "levels": { - "type": "array", + "description": "Filter by log levels", "items": { "type": "string" }, - "description": "Filter by log levels" + "type": "array" }, "node_ids": { - "type": "array", + "description": "Filter to specific worker nodes (node_id). Empty = all nodes, including\ncontrol-plane-local logs.", "items": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, - "description": "Filter to specific worker nodes (node_id). Empty = all nodes, including\ncontrol-plane-local logs." + "type": "array" }, "page_size": { + "description": "Page size (default: 100, max: 500)", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Page size (default: 100, max: 500)", - "minimum": 0 + ] }, "project_id": { - "type": "integer", + "description": "Project ID (integer, as used by the rest of the platform)", "format": "int32", - "description": "Project ID (integer, as used by the rest of the platform)" + "type": "integer" }, "services": { - "type": "array", + "description": "Filter by services", "items": { "type": "string" }, - "description": "Filter by services" + "type": "array" }, "start_time": { + "description": "Start of time range (ISO 8601). Defaults to 1 hour ago.", "type": [ "string", "null" - ], - "description": "Start of time range (ISO 8601). Defaults to 1 hour ago." + ] }, "text": { + "description": "Full text search query", "type": [ "string", "null" - ], - "description": "Full text search query" + ] } - } - }, - "SearchLogsResponse": { - "type": "object", + }, "required": [ - "lines", - "search_mode", - "total_scanned" + "project_id" ], + "type": "object" + }, + "SearchLogsResponse": { "properties": { "available_sources": { - "type": "array", + "description": "Distinct containers/nodes/services available in the queried scope, for\nthe filter dropdowns. Populated on the first page (no cursor).", "items": { "$ref": "#/components/schemas/LogSource" }, - "description": "Distinct containers/nodes/services available in the queried scope, for\nthe filter dropdowns. Populated on the first page (no cursor)." + "type": "array" }, "lines": { - "type": "array", "items": { "$ref": "#/components/schemas/LogSearchLine" - } + }, + "type": "array" }, "next_cursor": { "type": [ @@ -31968,40 +32122,37 @@ "$ref": "#/components/schemas/SearchMode" }, "total_scanned": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "lines", + "search_mode", + "total_scanned" + ], + "type": "object" }, "SearchMode": { - "type": "string", "description": "Search execution mode", "enum": [ "index", "archive" - ] + ], + "type": "string" }, "Seasonality": { - "type": "string", "description": "Seasonality model for an anomaly baseline.", "enum": [ "none", "hourly", "daily", "weekly" - ] + ], + "type": "string" }, "SecretResponse": { - "type": "object", - "required": [ - "id", - "name", - "secret_type", - "value", - "created_at", - "updated_at" - ], "properties": { "created_at": { "type": "string" @@ -32013,8 +32164,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "mount_path": { "type": [ @@ -32032,21 +32183,29 @@ "type": "string" }, "value": { - "type": "string", - "description": "Always masked in responses" + "description": "Always masked in responses", + "type": "string" } - } + }, + "required": [ + "id", + "name", + "secret_type", + "value", + "created_at", + "updated_at" + ], + "type": "object" }, "SecurityConfig": { - "type": "object", "description": "Security configuration for projects and environments\n\nThis configuration can be set at three levels:\n1. Global (in settings table) - applies to all projects\n2. Project level - overrides global settings for specific project\n3. Environment level - overrides project settings for specific environment\n\nThe inheritance chain: Environment > Project > Global", "properties": { "attackMode": { + "description": "Attack mode configuration (future: \"off\", \"challenge\", \"block\")\nPlaceholder for DDoS protection, bot detection, etc.", "type": [ "string", "null" - ], - "description": "Attack mode configuration (future: \"off\", \"challenge\", \"block\")\nPlaceholder for DDoS protection, bot detection, etc." + ] }, "challengeConfig": { "oneOf": [ @@ -32060,11 +32219,11 @@ ] }, "enabled": { + "description": "Enable/disable security features at this level\nIf None, inherits from parent level", "type": [ "boolean", "null" - ], - "description": "Enable/disable security features at this level\nIf None, inherits from parent level" + ] }, "geoRestrictions": { "oneOf": [ @@ -32110,375 +32269,500 @@ } ] } - } + }, + "type": "object" }, "SecurityHeadersConfig": { - "type": "object", "description": "Security headers configuration (subset of global SecurityHeadersSettings)", "properties": { "contentSecurityPolicy": { + "description": "Custom CSP (only used if preset is \"custom\")", "type": [ "string", "null" - ], - "description": "Custom CSP (only used if preset is \"custom\")" + ] }, "preset": { + "description": "Use a preset: \"strict\", \"moderate\", \"permissive\", \"disabled\", \"custom\"", "type": [ "string", "null" - ], - "description": "Use a preset: \"strict\", \"moderate\", \"permissive\", \"disabled\", \"custom\"" + ] }, "referrerPolicy": { + "description": "Referrer-Policy override", "type": [ "string", "null" - ], - "description": "Referrer-Policy override" + ] }, "strictTransportSecurity": { + "description": "HSTS override", "type": [ "string", "null" - ], - "description": "HSTS override" + ] }, "xFrameOptions": { + "description": "X-Frame-Options override", "type": [ "string", "null" - ], - "description": "X-Frame-Options override" + ] } - } + }, + "type": "object" }, "SecurityHeadersSettings": { - "type": "object", "properties": { "content_security_policy": { + "default": "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'", "type": [ "string", "null" - ], - "default": "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'" + ] }, "enabled": { - "type": "boolean", - "default": false + "default": false, + "type": "boolean" }, "permissions_policy": { + "default": "geolocation=(), microphone=(), camera=()", "type": [ "string", "null" - ], - "default": "geolocation=(), microphone=(), camera=()" + ] }, "preset": { - "type": "string", - "default": "moderate" + "default": "moderate", + "type": "string" }, "referrer_policy": { - "type": "string", - "default": "strict-origin-when-cross-origin" + "default": "strict-origin-when-cross-origin", + "type": "string" }, "strict_transport_security": { - "type": "string", - "default": "max-age=31536000; includeSubDomains" + "default": "max-age=31536000; includeSubDomains", + "type": "string" }, "x_content_type_options": { - "type": "string", - "default": "nosniff" + "default": "nosniff", + "type": "string" }, "x_frame_options": { - "type": "string", - "default": "SAMEORIGIN" + "default": "SAMEORIGIN", + "type": "string" }, "x_xss_protection": { - "type": "string", - "default": "1; mode=block" + "default": "1; mode=block", + "type": "string" } - } + }, + "type": "object" }, - "SendEmailRequestBody": { - "type": "object", + "SelfUpdateAttempt": { + "description": "A single update attempt. Persisted to `/self-update.json` so the\nresult survives the restart it causes.", + "properties": { + "error": { + "description": "Operator-facing failure reason. Always set when `status` is `Failed`.", + "type": [ + "string", + "null" + ] + }, + "finished_at": { + "description": "When the outcome was decided. `None` while still `Pending`.", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "from_version": { + "description": "Version the attempt started from.", + "type": "string" + }, + "previous_binary_path": { + "description": "Where the replaced binary was kept, so a bad release can be reverted by\nhand (`mv `). Set once the swap completes.", + "type": [ + "string", + "null" + ] + }, + "started_at": { + "example": "2026-08-06T09:12:31Z", + "format": "date-time", + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/SelfUpdateStatus" + }, + "to_version": { + "description": "Version the attempt targeted. `None` if it failed before resolving one.", + "type": [ + "string", + "null" + ] + }, + "triggered_by_user_id": { + "description": "User who clicked the button. `None` for attempts started by the CLI.", + "format": "int32", + "type": [ + "integer", + "null" + ] + } + }, "required": [ - "from", - "to", - "subject" + "from_version", + "status", + "started_at" + ], + "type": "object" + }, + "SelfUpdateBlocker": { + "description": "Why a one-click update is unavailable. Exactly one is reported — the most\nfundamental blocker wins, so the operator fixes the real problem first\nrather than clearing one only to hit the next.", + "enum": [ + "disabled_by_flag", + "disabled_by_setting", + "not_supported", + "binary_not_writable", + "unsupported_platform", + "in_progress" + ], + "type": "string" + }, + "SelfUpdatePhase": { + "description": "Where an in-flight update has got to. Polled by the console so a long\ndownload shows progress instead of an indefinite spinner.", + "enum": [ + "idle", + "resolving", + "downloading", + "verifying", + "installing", + "restarting", + "pending_restart", + "failed" + ], + "type": "string" + }, + "SelfUpdateRestartMode": { + "description": "What happens to the running process once the new binary is in place.", + "enum": [ + "automatic", + "manual" ], + "type": "string" + }, + "SelfUpdateSettings": { + "description": "Controls the console's one-click \"Update now\" action.", "properties": { - "bcc": { + "channel": { + "default": null, + "description": "Release channel this install tracks: `stable`, `beta` or `nightly`.\n\n`None` (the default) means \"infer from the running version tag\", which\nis what the CLI has always done — a `-nightly.` build tracks nightly, a\n`-beta.N` build tracks beta, a plain tag tracks stable. Setting it\nexplicitly pins the channel, so an operator can move a nightly box back\nonto stable without reinstalling.", + "example": "stable", "type": [ - "array", + "string", "null" - ], + ] + }, + "enabled": { + "default": true, + "description": "Allow admins to apply a release and restart the server from the console.\n`true` by default: the action is permission-gated, audited, and only\never installs an official release whose published SHA-256 matches.\n\nTurning this off hides nothing — the console still shows the update\nbanner and the manual command, it just refuses to run it for you.", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "SelfUpdateStatus": { + "description": "Outcome of an update attempt, as persisted in the journal.", + "enum": [ + "pending", + "succeeded", + "installed_pending_restart", + "failed" + ], + "type": "string" + }, + "SendEmailRequestBody": { + "properties": { + "bcc": { + "description": "BCC recipients", "items": { "type": "string" }, - "description": "BCC recipients" - }, - "cc": { "type": [ "array", "null" - ], + ] + }, + "cc": { + "description": "CC recipients", "items": { "type": "string" }, - "description": "CC recipients" + "type": [ + "array", + "null" + ] }, "from": { - "type": "string", "description": "Sender email address (domain will be auto-extracted for lookup)", - "example": "hello@updates.example.com" + "example": "hello@updates.example.com", + "type": "string" }, "from_name": { + "description": "Sender display name", + "example": "My App", "type": [ "string", "null" - ], - "description": "Sender display name", - "example": "My App" + ] }, "headers": { - "type": [ - "object", - "null" - ], - "description": "Custom headers", "additionalProperties": { "type": "string" }, + "description": "Custom headers", "propertyNames": { "type": "string" - } + }, + "type": [ + "object", + "null" + ] }, "html": { + "description": "HTML body content", + "example": "

Hello World

", "type": [ "string", "null" - ], - "description": "HTML body content", - "example": "

Hello World

" + ] }, "reply_to": { + "description": "Reply-to address", "type": [ "string", "null" - ], - "description": "Reply-to address" + ] }, "subject": { - "type": "string", "description": "Email subject", - "example": "Welcome to our platform!" + "example": "Welcome to our platform!", + "type": "string" }, "tags": { - "type": [ - "array", - "null" - ], - "items": { - "type": "string" - }, "description": "Tags for categorization", "example": [ "welcome", "onboarding" + ], + "items": { + "type": "string" + }, + "type": [ + "array", + "null" ] }, "text": { + "description": "Plain text body content", + "example": "Hello World", "type": [ "string", "null" - ], - "description": "Plain text body content", - "example": "Hello World" + ] }, "to": { - "type": "array", - "items": { - "type": "string" - }, "description": "Recipient email addresses", "example": [ "user@example.com" - ] + ], + "items": { + "type": "string" + }, + "type": "array" }, "track_clicks": { + "description": "Enable click tracking (link rewriting). Defaults to false.", "type": [ "boolean", "null" - ], - "description": "Enable click tracking (link rewriting). Defaults to false." + ] }, "track_opens": { + "description": "Enable open tracking (tracking pixel injection). Defaults to false.", "type": [ "boolean", "null" - ], - "description": "Enable open tracking (tracking pixel injection). Defaults to false." + ] } - } - }, - "SendEmailResponseBody": { - "type": "object", + }, "required": [ - "id", - "status" + "from", + "to", + "subject" ], + "type": "object" + }, + "SendEmailResponseBody": { "properties": { "id": { - "type": "string", "description": "Email ID", - "example": "550e8400-e29b-41d4-a716-446655440000" + "example": "550e8400-e29b-41d4-a716-446655440000", + "type": "string" }, "provider_message_id": { + "description": "Provider message ID", "type": [ "string", "null" - ], - "description": "Provider message ID" + ] }, "status": { - "type": "string", "description": "Email status", - "example": "sent" + "example": "sent", + "type": "string" } - } - }, - "SendMessageRequest": { - "type": "object", + }, "required": [ - "content" + "id", + "status" ], + "type": "object" + }, + "SendMessageRequest": { "properties": { "content": { "type": "string" }, "page_context": { + "description": "Optional, client-supplied description of the page/entity the user is\ncurrently viewing (e.g. a trace in a project). Injected into the model's\nview of this turn only — never stored or shown in history. Capped server\nside; oversized values are ignored rather than rejected.", "type": [ "string", "null" - ], - "description": "Optional, client-supplied description of the page/entity the user is\ncurrently viewing (e.g. a trace in a project). Injected into the model's\nview of this turn only \u2014 never stored or shown in history. Capped server\nside; oversized values are ignored rather than rejected." + ] } - } - }, - "SensitiveConfigValueResponse": { - "type": "object", + }, "required": [ - "value" + "content" ], + "type": "object" + }, + "SensitiveConfigValueResponse": { "properties": { "value": { "type": "string" } - } - }, - "SensitiveMcpConfigValueResponse": { - "type": "object", + }, "required": [ "value" ], + "type": "object" + }, + "SensitiveMcpConfigValueResponse": { "properties": { "value": { "type": "string" } - } - }, - "SensitiveValueResponse": { - "type": "object", + }, "required": [ "value" ], + "type": "object" + }, + "SensitiveValueResponse": { "properties": { "value": { "type": "string" } - } - }, - "SentryChunkUploadResponse": { - "type": "object", + }, "required": [ - "url", - "chunkSize", - "chunksPerRequest", - "maxFileSize", - "maxRequestSize", - "concurrency", - "hashAlgorithm", - "compression", - "accept" + "value" ], + "type": "object" + }, + "SentryChunkUploadResponse": { "properties": { "accept": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "chunkSize": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "chunksPerRequest": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "compression": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "concurrency": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "hashAlgorithm": { "type": "string" }, "maxFileSize": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "maxRequestSize": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "url": { "type": "string" } - } - }, - "SentryCreateReleaseRequest": { - "type": "object", + }, "required": [ - "version" + "url", + "chunkSize", + "chunksPerRequest", + "maxFileSize", + "maxRequestSize", + "concurrency", + "hashAlgorithm", + "compression", + "accept" ], + "type": "object" + }, + "SentryCreateReleaseRequest": { "properties": { "projects": { - "type": "array", + "description": "Project slugs this release belongs to", "items": { "type": "string" }, - "description": "Project slugs this release belongs to" + "type": "array" }, "version": { - "type": "string", - "description": "Release version identifier" + "description": "Release version identifier", + "type": "string" } - } + }, + "required": [ + "version" + ], + "type": "object" }, "SentryEventRequest": { - "type": "object", "properties": { "event_id": { "type": [ @@ -32504,29 +32788,21 @@ "null" ] } - } + }, + "type": "object" }, "SentryEventResponse": { - "type": "object", - "required": [ - "id" - ], "properties": { "id": { "type": "string" } - } - }, - "SentryReleaseFileResponse": { - "type": "object", + }, "required": [ - "id", - "name", - "headers", - "size", - "sha1", - "dateCreated" + "id" ], + "type": "object" + }, + "SentryReleaseFileResponse": { "properties": { "dateCreated": { "type": "string" @@ -32548,17 +32824,21 @@ "type": "string" }, "size": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SentryReleaseProjectRef": { - "type": "object", + }, "required": [ + "id", "name", - "slug" + "headers", + "size", + "sha1", + "dateCreated" ], + "type": "object" + }, + "SentryReleaseProjectRef": { "properties": { "name": { "type": "string" @@ -32566,16 +32846,14 @@ "slug": { "type": "string" } - } - }, - "SentryReleaseResponse": { - "type": "object", + }, "required": [ - "version", - "dateCreated", - "shortVersion", - "projects" + "name", + "slug" ], + "type": "object" + }, + "SentryReleaseResponse": { "properties": { "dateCreated": { "type": "string" @@ -32587,10 +32865,10 @@ ] }, "projects": { - "type": "array", "items": { "$ref": "#/components/schemas/SentryReleaseProjectRef" - } + }, + "type": "array" }, "shortVersion": { "type": "string" @@ -32598,117 +32876,113 @@ "version": { "type": "string" } - } + }, + "required": [ + "version", + "dateCreated", + "shortVersion", + "projects" + ], + "type": "object" }, "SeriesStateEntry": { - "type": "object", "description": "One series' persisted state snapshot for a dynamic rule (ADR-026 follow-up):\nthe state after the latest tick, the value evaluated this tick, and the open\nalarm id (when firing). Serialized into the `series_states` jsonb column keyed\nby the human-readable [`series_label`]; the alert response decodes it back.", - "required": [ - "state", - "value" - ], "properties": { "alarm_id": { + "description": "The open alarm's id when the series is firing; `null` when ok.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "The open alarm's id when the series is firing; `null` when ok." + ] }, "state": { - "type": "string", - "description": "`firing` or `ok` for this series after the latest tick." + "description": "`firing` or `ok` for this series after the latest tick.", + "type": "string" }, "value": { - "type": "number", + "description": "The value the rule evaluated for this series this tick.", "format": "double", - "description": "The value the rule evaluated for this series this tick." + "type": "number" } - } + }, + "required": [ + "state", + "value" + ], + "type": "object" }, "ServiceAccessInfo": { - "type": "object", "description": "Response containing information about how the service is being accessed", - "required": [ - "access_mode", - "can_create_domains" - ], "properties": { "access_mode": { - "type": "string", - "description": "Mode of access: \"local\", \"direct\", \"nat\", or \"cloudflare_tunnel\"" + "description": "Mode of access: \"local\", \"direct\", \"nat\", or \"cloudflare_tunnel\"", + "type": "string" }, "can_create_domains": { - "type": "boolean", - "description": "Whether domain creation is allowed in this mode" + "description": "Whether domain creation is allowed in this mode", + "type": "boolean" }, "domain_creation_error": { + "description": "Error message if domain creation is not allowed", "type": [ "string", "null" - ], - "description": "Error message if domain creation is not allowed" + ] }, "private_ip": { + "description": "Server's private/local IP address (always returned if available)", "type": [ "string", "null" - ], - "description": "Server's private/local IP address (always returned if available)" + ] }, "public_ip": { + "description": "Server's public IP address (always returned if available)", "type": [ "string", "null" - ], - "description": "Server's public IP address (always returned if available)" + ] } - } + }, + "required": [ + "access_mode", + "can_create_domains" + ], + "type": "object" }, "ServiceAction": { - "type": "string", "description": "What to do with a service during migration", "enum": [ "create", "link-external", "skip" - ] + ], + "type": "string" }, "ServiceAlertRuleResponse": { - "type": "object", "description": "Wire representation of a monitoring alert rule.\n\nRegistered under a domain-prefixed OpenAPI schema name to avoid colliding\nwith `temps-error-tracking`'s unrelated `AlertRuleResponse` (utoipa keys\nschemas by their bare struct name, so without `as = ...` the last crate to\nregister would silently shadow this one in the merged spec / generated SDK).", - "required": [ - "id", - "name", - "metric_name", - "threshold", - "comparator", - "severity", - "for_duration_secs", - "enabled" - ], "properties": { "comparator": { "type": "string" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "enabled": { "type": "boolean" }, "for_duration_secs": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "metric_name": { "type": "string" @@ -32717,11 +32991,11 @@ "type": "string" }, "service_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "severity": { "type": "string" @@ -32733,157 +33007,160 @@ ] }, "threshold": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "ServiceBackupEntryResponse": { - "type": "object", - "description": "A single backup entry in the per-service backup list.", + }, "required": [ "id", - "backup_id", "name", - "state", - "backup_type", - "started_at", - "s3_location", - "compression_type", - "s3_source_id", - "s3_source_name", - "external_service_backup_id" + "metric_name", + "threshold", + "comparator", + "severity", + "for_duration_secs", + "enabled" ], + "type": "object" + }, + "ServiceBackupEntryResponse": { + "description": "A single backup entry in the per-service backup list.", "properties": { "backup_id": { - "type": "string", - "description": "UUID string assigned at backup creation time." + "description": "UUID string assigned at backup creation time.", + "type": "string" }, "backup_type": { - "type": "string", - "description": "Backup variant (e.g. \"full\", \"incremental\")." + "description": "Backup variant (e.g. \"full\", \"incremental\").", + "type": "string" }, "compression_type": { - "type": "string", - "description": "Compression algorithm used (e.g. \"gzip\")." + "description": "Compression algorithm used (e.g. \"gzip\").", + "type": "string" }, "error_message": { + "description": "Engine-reported error message, populated when `state = \"failed\"`.", "type": [ "string", "null" - ], - "description": "Engine-reported error message, populated when `state = \"failed\"`." + ] }, "external_service_backup_id": { - "type": "integer", + "description": "Row ID from `external_service_backups`.", "format": "int32", - "description": "Row ID from `external_service_backups`." + "type": "integer" }, "finished_at": { + "description": "ISO 8601 timestamp when the backup finished, if known.", + "example": "2025-01-15T14:35:00Z", "type": [ "string", "null" - ], - "description": "ISO 8601 timestamp when the backup finished, if known.", - "example": "2025-01-15T14:35:00Z" + ] }, "id": { - "type": "integer", + "description": "Row ID from the `backups` table.", "format": "int32", - "description": "Row ID from the `backups` table." + "type": "integer" }, "name": { - "type": "string", - "description": "Human-friendly display name." + "description": "Human-friendly display name.", + "type": "string" }, "s3_location": { - "type": "string", - "description": "Object key or `s3://` URL for the backup data." + "description": "Object key or `s3://` URL for the backup data.", + "type": "string" }, "s3_source_id": { - "type": "integer", + "description": "FK to `s3_sources.id`.", "format": "int32", - "description": "FK to `s3_sources.id`." + "type": "integer" }, "s3_source_name": { - "type": "string", - "description": "Human-readable name of the S3 source." + "description": "Human-readable name of the S3 source.", + "type": "string" }, "size_bytes": { + "description": "Size of the backup in bytes, if available.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size of the backup in bytes, if available." + ] }, "started_at": { - "type": "string", "description": "ISO 8601 timestamp when the backup started.", - "example": "2025-01-15T14:30:00Z" + "example": "2025-01-15T14:30:00Z", + "type": "string" }, "state": { - "type": "string", - "description": "Current state: \"completed\", \"running\", \"failed\"." + "description": "Current state: \"completed\", \"running\", \"failed\".", + "type": "string" } - } + }, + "required": [ + "id", + "backup_id", + "name", + "state", + "backup_type", + "started_at", + "s3_location", + "compression_type", + "s3_source_id", + "s3_source_name", + "external_service_backup_id" + ], + "type": "object" }, "ServiceBackupListResponse": { - "type": "object", "description": "Paginated list of backups for a specific external service.\n\nReturned by `GET /backups/external-services/{service_id}/backups`.", - "required": [ - "backups", - "total", - "page", - "page_size" - ], "properties": { "backups": { - "type": "array", + "description": "Backups belonging to this service, newest first.", "items": { "$ref": "#/components/schemas/ServiceBackupEntryResponse" }, - "description": "Backups belonging to this service, newest first." + "type": "array" }, "page": { - "type": "integer", + "description": "Current page (1-based).", "format": "int64", - "description": "Current page (1-based)." + "type": "integer" }, "page_size": { - "type": "integer", + "description": "Number of items per page.", "format": "int64", - "description": "Number of items per page." + "type": "integer" }, "total": { - "type": "integer", + "description": "Total number of backups for this service across all pages.", "format": "int64", - "description": "Total number of backups for this service across all pages." + "type": "integer" } - } + }, + "required": [ + "backups", + "total", + "page", + "page_size" + ], + "type": "object" }, "ServiceCreateAlertRuleRequest": { - "type": "object", - "description": "Request body for creating an alert rule on an external service.\n\nDomain-prefixed schema name \u2014 see [`AlertRuleResponse`] for why.", - "required": [ - "name", - "metric_name", - "threshold", - "comparator", - "severity" - ], + "description": "Request body for creating an alert rule on an external service.\n\nDomain-prefixed schema name — see [`AlertRuleResponse`] for why.", "properties": { "comparator": { - "type": "string", - "description": "One of `>`, `<`, `>=`, `<=`." + "description": "One of `>`, `<`, `>=`, `<=`.", + "type": "string" }, "enabled": { "type": "boolean" }, "for_duration_secs": { - "type": "integer", + "description": "Seconds the breach must persist before the alarm fires (0 = immediate).", "format": "int32", - "description": "Seconds the breach must persist before the alarm fires (0 = immediate)." + "type": "integer" }, "metric_name": { "type": "string" @@ -32892,27 +33169,29 @@ "type": "string" }, "severity": { - "type": "string", - "description": "`\"warning\"` or `\"critical\"`." + "description": "`\"warning\"` or `\"critical\"`.", + "type": "string" }, "threshold": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "ServiceHealthResponse": { - "type": "object", + }, "required": [ - "service_id", - "consecutive_failures", - "recent_checks" + "name", + "metric_name", + "threshold", + "comparator", + "severity" ], + "type": "object" + }, + "ServiceHealthResponse": { "properties": { "consecutive_failures": { - "type": "integer", + "description": "Consecutive failed probes. Alert fires at 3.", "format": "int32", - "description": "Consecutive failed probes. Alert fires at 3." + "type": "integer" }, "last_checked_at": { "type": [ @@ -32927,65 +33206,66 @@ ] }, "recent_checks": { - "type": "array", + "description": "Most recent checks, newest-first (capped at `limit`).", "items": { "$ref": "#/components/schemas/HealthCheckEntryResponse" }, - "description": "Most recent checks, newest-first (capped at `limit`)." + "type": "array" }, "response_time_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { + "description": "Current health. `null` if the service has not been probed yet.", + "example": "operational", "type": [ "string", "null" - ], - "description": "Current health. `null` if the service has not been probed yet.", - "example": "operational" + ] }, "uptime_24h_percent": { + "description": "Uptime percentage over the last 24 hours (0.0 — 100.0).\n`null` when there is not enough history.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Uptime percentage over the last 24 hours (0.0 \u2014 100.0).\n`null` when there is not enough history." + ] } - } - }, - "ServiceHealthStatusBatchResponse": { - "type": "object", + }, "required": [ - "statuses" + "service_id", + "consecutive_failures", + "recent_checks" ], + "type": "object" + }, + "ServiceHealthStatusBatchResponse": { "properties": { "statuses": { - "type": "array", "items": { "$ref": "#/components/schemas/ServiceHealthStatusEntryResponse" - } + }, + "type": "array" } - } - }, - "ServiceHealthStatusEntryResponse": { - "type": "object", + }, "required": [ - "service_id", - "consecutive_failures" + "statuses" ], + "type": "object" + }, + "ServiceHealthStatusEntryResponse": { "properties": { "consecutive_failures": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "last_checked_at": { "type": [ @@ -32994,36 +33274,33 @@ ] }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { + "description": "\"operational\" | \"degraded\" | \"down\". `null` when the service has not\nbeen probed yet.", + "example": "operational", "type": [ "string", "null" - ], - "description": "\"operational\" | \"degraded\" | \"down\". `null` when the service has not\nbeen probed yet.", - "example": "operational" + ] } - } + }, + "required": [ + "service_id", + "consecutive_failures" + ], + "type": "object" }, "ServiceMemberInfo": { - "type": "object", "description": "Public info about a cluster member.", - "required": [ - "id", - "role", - "container_name", - "status", - "ordinal" - ], "properties": { "compute_ip": { + "description": "Container's IP on the `temps-overlay` multi-host network. Populated\nby the lifecycle hook (ADR-011 Phase 3); `None` on single-host\nclusters where the overlay isn't attached.", "type": [ "string", "null" - ], - "description": "Container's IP on the `temps-overlay` multi-host network. Populated\nby the lifecycle hook (ADR-011 Phase 3); `None` on single-host\nclusters where the overlay isn't attached." + ] }, "container_name": { "type": "string" @@ -33035,47 +33312,47 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "live_state": { + "description": "Live FSM state from the pg_auto_failover monitor (`primary`,\n`secondary`, `catchingup`, `report_lsn`, …). `None` when the\nmonitor is unreachable, the service is not a cluster, or the row\nis the monitor itself.\n\n**The UI must render the role badge from this field**, falling\nback to `role` only when `live_state` is null. `role` is now\nconfig-only (`monitor` or `replica`); flipping the badge to\n\"primary\" when the monitor elects a new one used to require a\nreconciler that lagged ~5s behind real failovers — and during\nthat window the UI showed two primaries. `live_state` is read\ndirectly from the monitor on every list, so it can never lag.", "type": [ "string", "null" - ], - "description": "Live FSM state from the pg_auto_failover monitor (`primary`,\n`secondary`, `catchingup`, `report_lsn`, \u2026). `None` when the\nmonitor is unreachable, the service is not a cluster, or the row\nis the monitor itself.\n\n**The UI must render the role badge from this field**, falling\nback to `role` only when `live_state` is null. `role` is now\nconfig-only (`monitor` or `replica`); flipping the badge to\n\"primary\" when the monitor elects a new one used to require a\nreconciler that lagged ~5s behind real failovers \u2014 and during\nthat window the UI showed two primaries. `live_state` is read\ndirectly from the monitor on every list, so it can never lag." + ] }, "node_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "ordinal": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "port": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "provisioning_error": { + "description": "Most recent provisioning failure message, when `status='failed'`.\nSet by the background task so the UI can show *why* the new\nreplica didn't come up.", "type": [ "string", "null" - ], - "description": "Most recent provisioning failure message, when `status='failed'`.\nSet by the background task so the UI can show *why* the new\nreplica didn't come up." + ] }, "provisioning_step": { + "description": "Last-attempted phase of the async `add_cluster_member` background\ntask (e.g. `validating`, `provisioning_container`, `done`,\n`failed`). `None` for members not created through that flow —\nthe UI falls back to the `status` column for those.", "type": [ "string", "null" - ], - "description": "Last-attempted phase of the async `add_cluster_member` background\ntask (e.g. `validating`, `provisioning_container`, `done`,\n`failed`). `None` for members not created through that flow \u2014\nthe UI falls back to the `status` column for those." + ] }, "role": { "type": "string" @@ -33083,25 +33360,26 @@ "status": { "type": "string" } - } - }, - "ServiceParameter": { - "type": "object", + }, "required": [ - "name", - "required", - "encrypted", - "description" + "id", + "role", + "container_name", + "status", + "ordinal" ], + "type": "object" + }, + "ServiceParameter": { "properties": { "choices": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "default_value": { "type": [ @@ -33127,182 +33405,188 @@ "null" ] } - } - }, - "ServicePlan": { - "type": "object", - "description": "Plan for migrating a single service (database, cache, etc.)", + }, "required": [ "name", - "service_type", - "action", - "action_description" + "required", + "encrypted", + "description" ], + "type": "object" + }, + "ServicePlan": { + "description": "Plan for migrating a single service (database, cache, etc.)", "properties": { "action": { "$ref": "#/components/schemas/ServiceAction", "description": "What to do with this service" }, "action_description": { - "type": "string", - "description": "Human-readable explanation of what this action means" + "description": "Human-readable explanation of what this action means", + "type": "string" }, "data_implications": { - "type": "array", + "description": "Data implications specific to this service", "items": { "$ref": "#/components/schemas/DataImplication" }, - "description": "Data implications specific to this service" + "type": "array" }, "env_var_mappings": { - "type": "object", - "description": "Environment variable key mappings: source_key -> temps_key\n\nFor example, Vercel's `POSTGRES_URL` might map to Temps' `DATABASE_URL`.\nBoth keys will be set during migration so the app works with either.", "additionalProperties": { "type": "string" }, + "description": "Environment variable key mappings: source_key -> temps_key\n\nFor example, Vercel's `POSTGRES_URL` might map to Temps' `DATABASE_URL`.\nBoth keys will be set during migration so the app works with either.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "name": { - "type": "string", - "description": "Human-readable service name" + "description": "Human-readable service name", + "type": "string" }, "parameters": { - "type": "object", - "description": "Parameters for creating the service in Temps", "additionalProperties": {}, + "description": "Parameters for creating the service in Temps", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "service_type": { - "type": "string", - "description": "Service type (maps to temps-providers ServiceType)" + "description": "Service type (maps to temps-providers ServiceType)", + "type": "string" }, "version": { + "description": "Service version to create (e.g., \"16\" for Postgres 16)", "type": [ "string", "null" - ], - "description": "Service version to create (e.g., \"16\" for Postgres 16)" + ] } - } + }, + "required": [ + "name", + "service_type", + "action", + "action_description" + ], + "type": "object" }, "ServiceResourceLimits": { - "type": "object", - "description": "Optional cgroup resource limits applied to a service container.\n\nAll fields are `Option`: `None` means \"no limit\" (the kernel default),\nmatching Docker's behavior when the corresponding `HostConfig` field is\nleft at zero. Operators opt in to limits explicitly through the\n`PATCH /external-services/{id}/resources` endpoint or by writing the\n`resources` block into `ServiceConfig::parameters` at create time.\n\nThese map directly onto bollard fields:\n- `memory_mb` \u2192 `HostConfig.memory` (bytes)\n- `memory_swap_mb`\u2192 `HostConfig.memory_swap` (bytes; \u2265 memory)\n- `nano_cpus` \u2192 `HostConfig.nano_cpus` (1e9 = 1 full CPU)\n- `cpu_shares` \u2192 `HostConfig.cpu_shares` (relative weight, default 1024)\n- `shm_size_mb` \u2192 `HostConfig.shm_size` (bytes; default 64 MiB)\n\nIMPORTANT: enabling hard memory limits causes the kernel OOM killer to\nterminate the container when the working set exceeds the limit. The\ncontainer will restart (RestartPolicy::ALWAYS) but in-flight queries\nfail. Surface this clearly in any UI that lets users set limits.", + "description": "Optional cgroup resource limits applied to a service container.\n\nAll fields are `Option`: `None` means \"no limit\" (the kernel default),\nmatching Docker's behavior when the corresponding `HostConfig` field is\nleft at zero. Operators opt in to limits explicitly through the\n`PATCH /external-services/{id}/resources` endpoint or by writing the\n`resources` block into `ServiceConfig::parameters` at create time.\n\nThese map directly onto bollard fields:\n- `memory_mb` → `HostConfig.memory` (bytes)\n- `memory_swap_mb`→ `HostConfig.memory_swap` (bytes; ≥ memory)\n- `nano_cpus` → `HostConfig.nano_cpus` (1e9 = 1 full CPU)\n- `cpu_shares` → `HostConfig.cpu_shares` (relative weight, default 1024)\n- `shm_size_mb` → `HostConfig.shm_size` (bytes; default 64 MiB)\n\nIMPORTANT: enabling hard memory limits causes the kernel OOM killer to\nterminate the container when the working set exceeds the limit. The\ncontainer will restart (RestartPolicy::ALWAYS) but in-flight queries\nfail. Surface this clearly in any UI that lets users set limits.", "properties": { "cpu_shares": { + "description": "Relative CPU weight (default 1024). Only used when `nano_cpus` is None.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Relative CPU weight (default 1024). Only used when `nano_cpus` is None." + ] }, "memory_mb": { + "description": "Hard memory limit in MiB. None = unlimited.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Hard memory limit in MiB. None = unlimited." + ] }, "memory_swap_mb": { + "description": "Memory + swap limit in MiB. None = unlimited.\nMUST be >= memory_mb when both are set; Docker rejects the request otherwise.\nSet equal to `memory_mb` to disable swap entirely.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Memory + swap limit in MiB. None = unlimited.\nMUST be >= memory_mb when both are set; Docker rejects the request otherwise.\nSet equal to `memory_mb` to disable swap entirely." + ] }, "nano_cpus": { + "description": "CPU quota in nano-cpus. 1_000_000_000 = 1 full CPU core. None = unlimited.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "CPU quota in nano-cpus. 1_000_000_000 = 1 full CPU core. None = unlimited." + ] }, "shm_size_mb": { + "description": "Shared memory (/dev/shm) size in MiB. None = Docker default (64 MiB).\nMaps to HostConfig.shm_size (bytes). PostgreSQL uses /dev/shm for parallel\nquery workers and large work_mem; the 64 MiB default causes \"could not\nresize shared memory segment ... No space left on device\" under load.\nNOTE: shm_size is fixed at container-create time — Docker's live update\nAPI cannot change it, so changing this value recreates the container.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Shared memory (/dev/shm) size in MiB. None = Docker default (64 MiB).\nMaps to HostConfig.shm_size (bytes). PostgreSQL uses /dev/shm for parallel\nquery workers and large work_mem; the 64 MiB default causes \"could not\nresize shared memory segment ... No space left on device\" under load.\nNOTE: shm_size is fixed at container-create time \u2014 Docker's live update\nAPI cannot change it, so changing this value recreates the container." + ] } - } + }, + "type": "object" }, "ServiceRuntimeReport": { - "type": "object", "description": "Aggregate runtime info for an external service. For standalone services,\n`members` has exactly one entry. For clusters, one entry per member.", - "required": [ - "service_id", - "topology", - "members" - ], "properties": { "members": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerRuntimeInfo" - } + }, + "type": "array" }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "topology": { "type": "string" } - } - }, - "ServiceStatsReport": { - "type": "object", + }, "required": [ "service_id", "topology", "members" ], + "type": "object" + }, + "ServiceStatsReport": { "properties": { "members": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerStatsSample" - } + }, + "type": "array" }, "service_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "topology": { "type": "string" } - } - }, - "ServiceTypeInfo": { - "type": "object", + }, "required": [ - "service_type", - "parameters" + "service_id", + "topology", + "members" ], + "type": "object" + }, + "ServiceTypeInfo": { "properties": { "parameters": { - "type": "array", + "example": "[{\"name\": \"host\", \"required\": true, \"encrypted\": false, \"description\": \"Database host\"}]", "items": { "$ref": "#/components/schemas/ServiceParameter" }, - "example": "[{\"name\": \"host\", \"required\": true, \"encrypted\": false, \"description\": \"Database host\"}]" + "type": "array" }, "service_type": { "$ref": "#/components/schemas/ServiceTypeRoute" } - } + }, + "required": [ + "service_type", + "parameters" + ], + "type": "object" }, "ServiceTypeRoute": { - "type": "string", "enum": [ "mariadb", "mongodb", @@ -33313,11 +33597,11 @@ "blob", "rustfs", "minio" - ] + ], + "type": "string" }, "ServiceUpdateAlertRuleRequest": { - "type": "object", - "description": "Request body for updating an existing alert rule.\n\nDomain-prefixed schema name \u2014 see [`AlertRuleResponse`] for why.", + "description": "Request body for updating an existing alert rule.\n\nDomain-prefixed schema name — see [`AlertRuleResponse`] for why.", "properties": { "comparator": { "type": [ @@ -33332,11 +33616,11 @@ ] }, "for_duration_secs": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "metric_name": { "type": [ @@ -33357,54 +33641,45 @@ ] }, "threshold": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] } - } + }, + "type": "object" }, "SesCredentialsRequest": { - "type": "object", - "required": [ - "access_key_id", - "secret_access_key" - ], "properties": { "access_key_id": { - "type": "string", - "example": "AKIAIOSFODNN7EXAMPLE" + "example": "AKIAIOSFODNN7EXAMPLE", + "type": "string" }, "secret_access_key": { - "type": "string", - "example": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + "example": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "type": "string" } - } - }, - "SessionDetails": { - "type": "object", + }, "required": [ - "session_id", - "visitor_id", - "started_at", - "duration_seconds", - "is_bounced", - "is_engaged", - "page_views" + "access_key_id", + "secret_access_key" ], + "type": "object" + }, + "SessionDetails": { "properties": { "duration_seconds": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "ended_at": { + "example": "2024-01-01T00:00:00", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-01-01T00:00:00" + ] }, "entry_path": { "type": [ @@ -33425,8 +33700,8 @@ "type": "boolean" }, "page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "referrer": { "type": [ @@ -33435,44 +33710,49 @@ ] }, "session_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "started_at": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "visitor_id": { "type": "string" } - } - }, - "SessionDetailsQuery": { - "type": "object", + }, "required": [ - "project_id" + "session_id", + "visitor_id", + "started_at", + "duration_seconds", + "is_bounced", + "is_engaged", + "page_views" ], + "type": "object" + }, + "SessionDetailsQuery": { "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "SessionEvent": { - "type": "object", + }, "required": [ - "id", - "timestamp" + "project_id" ], + "type": "object" + }, + "SessionEvent": { "properties": { "event_data": {}, "event_name": { @@ -33488,8 +33768,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "page_title": { "type": [ @@ -33506,129 +33786,130 @@ "timestamp": { "type": "string" } - } - }, - "SessionEventDto": { - "type": "object", + }, "required": [ "id", - "session_id", - "data", "timestamp" ], + "type": "object" + }, + "SessionEventDto": { "properties": { "data": {}, "event_type": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "session_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "timestamp": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SessionEventsQuery": { - "type": "object", + }, "required": [ - "project_id" + "id", + "session_id", + "data", + "timestamp" ], + "type": "object" + }, + "SessionEventsQuery": { "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "SessionEventsResponse": { - "type": "object", + }, "required": [ - "session_id", - "events", - "total_count", - "offset", - "limit" + "project_id" ], + "type": "object" + }, + "SessionEventsResponse": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionEvent" - } + }, + "type": "array" }, "limit": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "offset": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "session_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "total_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SessionLogsQuery": { - "type": "object", + }, "required": [ - "project_id" + "session_id", + "events", + "total_count", + "offset", + "limit" ], + "type": "object" + }, + "SessionLogsQuery": { "properties": { "end_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "offset": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "sort_order": { "type": [ @@ -33637,61 +33918,60 @@ ] }, "start_date": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "visitor_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } - }, - "SessionLogsResponse": { - "type": "object", + }, "required": [ - "session_id", - "logs", - "total_count", - "offset", - "limit" + "project_id" ], + "type": "object" + }, + "SessionLogsResponse": { "properties": { "limit": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "logs": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionRequestLog" - } + }, + "type": "array" }, "offset": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "session_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "total_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SessionReplayEventsRequest": { - "type": "object", + }, "required": [ - "sessionId", - "events" + "session_id", + "logs", + "total_count", + "offset", + "limit" ], + "type": "object" + }, + "SessionReplayEventsRequest": { "properties": { "events": { "type": "string" @@ -33699,14 +33979,14 @@ "sessionId": { "type": "string" } - } - }, - "SessionReplayInfoDto": { - "type": "object", + }, "required": [ - "id", - "visitor_id" + "sessionId", + "events" ], + "type": "object" + }, + "SessionReplayInfoDto": { "properties": { "created_at": { "type": [ @@ -33715,11 +33995,11 @@ ] }, "duration": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { "type": "string" @@ -33731,18 +34011,18 @@ ] }, "screen_height": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "screen_width": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "timezone": { "type": [ @@ -33763,38 +34043,39 @@ ] }, "viewport_height": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "viewport_width": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "visitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "SessionReplayInitRequest": { - "type": "object", + }, "required": [ - "sessionId" + "id", + "visitor_id" ], + "type": "object" + }, + "SessionReplayInitRequest": { "properties": { "colorDepth": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "language": { "type": [ @@ -33803,20 +34084,20 @@ ] }, "screenHeight": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "screenWidth": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "sessionId": { "type": "string" @@ -33846,29 +34127,28 @@ ] }, "viewportHeight": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "viewportWidth": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] } - } - }, - "SessionReplayInitResponse": { - "type": "object", + }, "required": [ - "session_id", - "message" + "sessionId" ], + "type": "object" + }, + "SessionReplayInitResponse": { "properties": { "message": { "type": "string" @@ -33876,39 +34156,32 @@ "session_id": { "type": "string" } - } - }, - "SessionReplayWithEventsDto": { - "type": "object", + }, "required": [ - "session", - "events" + "session_id", + "message" ], + "type": "object" + }, + "SessionReplayWithEventsDto": { "properties": { "events": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionEventDto" - } + }, + "type": "array" }, "session": { "$ref": "#/components/schemas/SessionReplayWithVisitorDto" } - } - }, - "SessionReplayWithVisitorDto": { - "type": "object", + }, "required": [ - "id", - "session_replay_id", - "visitor_id", - "visitor_uuid", - "visitor_project_id", - "visitor_environment_id", - "visitor_first_seen", - "visitor_last_seen", - "visitor_is_crawler" + "session", + "events" ], + "type": "object" + }, + "SessionReplayWithVisitorDto": { "properties": { "browser": { "type": [ @@ -33935,15 +34208,15 @@ ] }, "duration": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "language": { "type": [ @@ -33964,18 +34237,18 @@ ] }, "screen_height": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "screen_width": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "session_replay_id": { "type": "string" @@ -33999,18 +34272,18 @@ ] }, "viewport_height": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "viewport_width": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "visitor_city": { "type": [ @@ -34038,15 +34311,15 @@ }, "visitor_custom_data": {}, "visitor_environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "visitor_first_seen": { "type": "string" }, "visitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "visitor_is_crawler": { "type": "boolean" @@ -34055,8 +34328,8 @@ "type": "string" }, "visitor_project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "visitor_region": { "type": [ @@ -34067,26 +34340,30 @@ "visitor_uuid": { "type": "string" } - } - }, - "SessionRequestLog": { - "type": "object", + }, "required": [ "id", - "method", - "path", - "status_code", - "created_at" + "session_replay_id", + "visitor_id", + "visitor_uuid", + "visitor_project_id", + "visitor_environment_id", + "visitor_first_seen", + "visitor_last_seen", + "visitor_is_crawler" ], + "type": "object" + }, + "SessionRequestLog": { "properties": { "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "method": { "type": "string" @@ -34113,15 +34390,15 @@ ] }, "response_time_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "status_code": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "user_agent": { "type": [ @@ -34129,32 +34406,29 @@ "null" ] } - } - }, - "SessionSummary": { - "type": "object", + }, "required": [ - "session_id", - "started_at", - "duration_seconds", - "page_views", - "events_count", - "requests_count", - "is_bounced", - "is_engaged" + "id", + "method", + "path", + "status_code", + "created_at" ], + "type": "object" + }, + "SessionSummary": { "properties": { "duration_seconds": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "ended_at": { + "example": "2024-01-01T00:00:00", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-01-01T00:00:00" + ] }, "entry_path": { "type": [ @@ -34163,8 +34437,8 @@ ] }, "events_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "exit_path": { "type": [ @@ -34179,8 +34453,8 @@ "type": "boolean" }, "page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "referrer": { "type": [ @@ -34189,283 +34463,284 @@ ] }, "requests_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "session_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "started_at": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" } - } + }, + "required": [ + "session_id", + "started_at", + "duration_seconds", + "page_views", + "events_count", + "requests_count", + "is_bounced", + "is_engaged" + ], + "type": "object" }, "SetFlagEnvironmentRequest": { - "type": "object", "properties": { "enabled": { + "description": "The kill switch. `false` makes the flag serve its default regardless of\nany override — and, once targeting exists, regardless of any rule.", "type": [ "boolean", "null" - ], - "description": "The kill switch. `false` makes the flag serve its default regardless of\nany override \u2014 and, once targeting exists, regardless of any rule." + ] }, "value": { "description": "Tri-state: absent leaves the override, `null` clears it (inherit the\nflag default), anything else sets it. Must match `value_type`." } - } + }, + "type": "object" }, "SetPreviewPasswordBody": { - "type": "object", - "required": [ - "password" - ], "properties": { "password": { - "type": "string", - "description": "Plaintext password to protect the sandbox's preview URLs. Hashed\nserver-side with argon2id \u2014 we never persist or echo this back.\nMust be between 8 and 256 characters." + "description": "Plaintext password to protect the sandbox's preview URLs. Hashed\nserver-side with argon2id — we never persist or echo this back.\nMust be between 8 and 256 characters.", + "type": "string" } - } - }, - "SetPreviewPasswordResponse": { - "type": "object", + }, "required": [ - "preview_password_hint" + "password" ], + "type": "object" + }, + "SetPreviewPasswordResponse": { "properties": { "preview_password_hint": { - "type": "string", - "description": "Last 4 chars of the password we just stored. Surface in the UI so\nusers can confirm which password is live without re-entering it." + "description": "Last 4 chars of the password we just stored. Surface in the UI so\nusers can confirm which password is live without re-entering it.", + "type": "string" } - } + }, + "required": [ + "preview_password_hint" + ], + "type": "object" }, "SetRequest": { - "type": "object", "description": "Request to set a value", - "required": [ - "key", - "value" - ], "properties": { "ex": { + "description": "Expire in seconds", + "example": 3600, + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Expire in seconds", - "example": 3600 + ] }, "key": { - "type": "string", "description": "The key to set", - "example": "user:123" + "example": "user:123", + "type": "string" }, "nx": { - "type": "boolean", - "description": "Only set if key does not exist" + "description": "Only set if key does not exist", + "type": "boolean" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] }, "px": { + "description": "Expire in milliseconds", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Expire in milliseconds" + ] }, "value": { "description": "The value to store (can be any JSON value)" }, "xx": { - "type": "boolean", - "description": "Only set if key exists" + "description": "Only set if key exists", + "type": "boolean" } - } + }, + "required": [ + "key", + "value" + ], + "type": "object" }, "SetResponse": { - "type": "object", "description": "Response for set operation", - "required": [ - "result" - ], "properties": { "result": { - "type": "string", "description": "Always \"OK\" on success", - "example": "OK" + "example": "OK", + "type": "string" } - } + }, + "required": [ + "result" + ], + "type": "object" }, "SettingsUpdateResponse": { - "type": "object", "description": "Response for successful settings update", - "required": [ - "message" - ], "properties": { "message": { "type": "string" } - } + }, + "required": [ + "message" + ], + "type": "object" }, "SetupDnsChallengeRequest": { - "type": "object", "description": "Request to setup DNS challenge records using a configured DNS provider", - "required": [ - "dns_provider_id" - ], "properties": { "dns_provider_id": { - "type": "integer", + "description": "The ID of the DNS provider to use for creating the TXT records", "format": "int32", - "description": "The ID of the DNS provider to use for creating the TXT records" + "type": "integer" } - } + }, + "required": [ + "dns_provider_id" + ], + "type": "object" }, "SetupDnsChallengeResponse": { - "type": "object", "description": "Response from DNS challenge setup operation", - "required": [ - "success", - "records_created", - "total_records", - "results", - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable summary message" + "description": "Human-readable summary message", + "type": "string" }, "records_created": { - "type": "integer", - "format": "int32", "description": "Number of TXT records that were successfully created", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "results": { - "type": "array", + "description": "Results for each individual TXT record", "items": { "$ref": "#/components/schemas/DnsChallengeRecordResult" }, - "description": "Results for each individual TXT record" + "type": "array" }, "success": { - "type": "boolean", - "description": "Overall success status (true if all records were created)" + "description": "Overall success status (true if all records were created)", + "type": "boolean" }, "total_records": { - "type": "integer", - "format": "int32", "description": "Total number of TXT records required for the challenge", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "success", + "records_created", + "total_records", + "results", + "message" + ], + "type": "object" }, "SetupDnsRequest": { - "type": "object", "description": "Request to setup DNS records using a configured DNS provider", - "required": [ - "dns_provider_id" - ], "properties": { "dns_provider_id": { - "type": "integer", + "description": "The ID of the DNS provider to use for creating records", "format": "int32", - "description": "The ID of the DNS provider to use for creating records" + "type": "integer" } - } + }, + "required": [ + "dns_provider_id" + ], + "type": "object" }, "SetupDnsResponse": { - "type": "object", "description": "Response from DNS setup operation", - "required": [ - "success", - "records_created", - "total_records", - "results", - "message" - ], "properties": { "message": { - "type": "string", - "description": "Human-readable summary message" + "description": "Human-readable summary message", + "type": "string" }, "records_created": { - "type": "integer", - "format": "int32", "description": "Number of records that were successfully created", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "results": { - "type": "array", + "description": "Results for each individual record", "items": { "$ref": "#/components/schemas/DnsRecordSetupResult" }, - "description": "Results for each individual record" + "type": "array" }, "success": { - "type": "boolean", - "description": "Overall success status" + "description": "Overall success status", + "type": "boolean" }, "total_records": { - "type": "integer", - "format": "int32", "description": "Total number of records attempted", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "success", + "records_created", + "total_records", + "results", + "message" + ], + "type": "object" }, "SiblingRef": { - "type": "object", "description": "A sibling project that shares the same `trace_id` and has opted in to\ncross-project trace sharing (`cross_project_trace_sharing = TRUE`).\n\nReturned by `CrossProjectTraceService::find_sibling_projects` and exposed\nby the Phase 1 `GET /otel/traces/cross-project/{trace_id}` endpoint.", - "required": [ - "project_id", - "project_name", - "project_slug", - "first_seen" - ], "properties": { "first_seen": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" }, "project_slug": { - "type": "string", - "description": "URL slug used to link into the sibling project's single-project trace view." + "description": "URL slug used to link into the sibling project's single-project trace view.", + "type": "string" } - } - }, - "SkillDefinitionResponse": { - "type": "object", + }, "required": [ - "id", - "slug", - "name", - "content", - "has_archive", - "created_at", - "updated_at" + "project_id", + "project_name", + "project_slug", + "first_seen" ], + "type": "object" + }, + "SkillDefinitionResponse": { "properties": { "content": { "type": "string" @@ -34483,18 +34758,18 @@ "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" }, "project_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "slug": { "type": "string" @@ -34502,13 +34777,19 @@ "updated_at": { "type": "string" } - } - }, - "SlackConfig": { - "type": "object", + }, "required": [ - "webhook_url" + "id", + "slug", + "name", + "content", + "has_archive", + "created_at", + "updated_at" ], + "type": "object" + }, + "SlackConfig": { "properties": { "channel": { "type": [ @@ -34519,338 +34800,333 @@ "webhook_url": { "type": "string" } - } + }, + "required": [ + "webhook_url" + ], + "type": "object" }, "SlowQueriesResponse": { - "type": "object", "description": "Response envelope for the slow-queries list endpoint.", - "required": [ - "queries", - "page", - "page_size", - "total_count" - ], "properties": { "page": { - "type": "integer", - "format": "int32", "description": "Current page number (1-based).", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", - "format": "int32", "description": "Number of rows per page used for this request.", - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "queries": { - "type": "array", + "description": "Ordered list of query stats, slowest first by mean_exec_time_ms.", "items": { "$ref": "#/components/schemas/SlowQueryRow" }, - "description": "Ordered list of query stats, slowest first by mean_exec_time_ms." + "type": "array" }, "total_count": { - "type": "integer", - "format": "int64", "description": "Total number of qualifying rows across all pages.", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "queries", + "page", + "page_size", + "total_count" + ], + "type": "object" }, "SlowQueryRow": { - "type": "object", "description": "A single entry from `pg_stat_statements`, representing one normalized\nquery fingerprint and its aggregate execution stats.", - "required": [ - "query", - "database", - "calls", - "total_exec_time_ms", - "mean_exec_time_ms", - "rows" - ], "properties": { "cache_hit_ratio": { + "description": "Shared block cache hit ratio (0.0–1.0).\n`None` when total block accesses are zero (e.g. function-only queries).", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Shared block cache hit ratio (0.0\u20131.0).\n`None` when total block accesses are zero (e.g. function-only queries)." + ] }, "calls": { - "type": "integer", + "description": "Number of times this query was executed.", "format": "int64", - "description": "Number of times this query was executed." + "type": "integer" }, "database": { - "type": "string", - "description": "Name of the database this query ran against. `(dropped database)`\nwhen the originating database no longer exists but\n`pg_stat_statements` still holds stats for it." + "description": "Name of the database this query ran against. `(dropped database)`\nwhen the originating database no longer exists but\n`pg_stat_statements` still holds stats for it.", + "type": "string" }, "mean_exec_time_ms": { - "type": "number", + "description": "Average wall-clock time per execution, in milliseconds.", "format": "double", - "description": "Average wall-clock time per execution, in milliseconds." + "type": "number" }, "query": { - "type": "string", - "description": "Normalized query text (parameter literals replaced with `$N`)." + "description": "Normalized query text (parameter literals replaced with `$N`).", + "type": "string" }, "rows": { - "type": "integer", + "description": "Total number of rows returned or affected.", "format": "int64", - "description": "Total number of rows returned or affected." + "type": "integer" }, "total_exec_time_ms": { - "type": "number", + "description": "Total wall-clock time spent executing this query, in milliseconds.", "format": "double", - "description": "Total wall-clock time spent executing this query, in milliseconds." + "type": "number" } - } + }, + "required": [ + "query", + "database", + "calls", + "total_exec_time_ms", + "mean_exec_time_ms", + "rows" + ], + "type": "object" }, "SmartFilter": { + "description": "Smart filter presets for common funnel patterns", "oneOf": [ { - "type": "object", "description": "Match specific page path", - "required": [ - "value", - "type" - ], "properties": { "type": { - "type": "string", "enum": [ "page_path" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match specific page path" + "description": "Match specific page path", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match specific hostname", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match specific hostname", "properties": { "type": { - "type": "string", "enum": [ "hostname" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match specific hostname" + "description": "Match specific hostname", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match UTM source", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match UTM source", "properties": { "type": { - "type": "string", "enum": [ "utm_source" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match UTM source" + "description": "Match UTM source", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match UTM campaign", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match UTM campaign", "properties": { "type": { - "type": "string", "enum": [ "utm_campaign" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match UTM campaign" + "description": "Match UTM campaign", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match UTM medium", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match UTM medium", "properties": { "type": { - "type": "string", "enum": [ "utm_medium" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match UTM medium" + "description": "Match UTM medium", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match referrer hostname", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match referrer hostname", "properties": { "type": { - "type": "string", "enum": [ "referrer_hostname" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match referrer hostname" + "description": "Match referrer hostname", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match specific channel (organic, paid, direct, referral, etc.)", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match specific channel (organic, paid, direct, referral, etc.)", "properties": { "type": { - "type": "string", "enum": [ "channel" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match specific channel (organic, paid, direct, referral, etc.)" + "description": "Match specific channel (organic, paid, direct, referral, etc.)", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match device type (mobile, desktop, tablet)", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match device type (mobile, desktop, tablet)", "properties": { "type": { - "type": "string", "enum": [ "device_type" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match device type (mobile, desktop, tablet)" + "description": "Match device type (mobile, desktop, tablet)", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match browser", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match browser", "properties": { "type": { - "type": "string", "enum": [ "browser" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match browser" + "description": "Match browser", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match operating system", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match operating system", "properties": { "type": { - "type": "string", "enum": [ "operating_system" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match operating system" + "description": "Match operating system", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match language", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match language", "properties": { "type": { - "type": "string", "enum": [ "language" - ] + ], + "type": "string" }, "value": { - "type": "string", - "description": "Match language" + "description": "Match language", + "type": "string" } - } - }, - { - "type": "object", - "description": "Match custom event_data by JSON path\nFormat: {\"path\": \"user.plan\", \"value\": \"premium\"}\nThis will match events where event_data->'user'->>'plan' = 'premium'", + }, "required": [ "value", "type" ], + "type": "object" + }, + { + "description": "Match custom event_data by JSON path\nFormat: {\"path\": \"user.plan\", \"value\": \"premium\"}\nThis will match events where event_data->'user'->>'plan' = 'premium'", "properties": { "type": { - "type": "string", "enum": [ "custom_data" - ] + ], + "type": "string" }, "value": { - "type": "object", "description": "Match custom event_data by JSON path\nFormat: {\"path\": \"user.plan\", \"value\": \"premium\"}\nThis will match events where event_data->'user'->>'plan' = 'premium'", - "required": [ - "path", - "value" - ], "properties": { "path": { "type": "string" @@ -34858,315 +35134,320 @@ "value": { "type": "string" } - } + }, + "required": [ + "path", + "value" + ], + "type": "object" } - } + }, + "required": [ + "value", + "type" + ], + "type": "object" } - ], - "description": "Smart filter presets for common funnel patterns" + ] }, "SmokeTestResponse": { - "type": "object", - "required": [ - "passed", - "environment", - "cli_installed", - "cli_authenticated" - ], "properties": { "auth_info": { + "description": "Auth email / method", "type": [ "string", "null" - ], - "description": "Auth email / method" + ] }, "cli_authenticated": { - "type": "boolean", - "description": "Claude CLI authenticated?" + "description": "Claude CLI authenticated?", + "type": "boolean" }, "cli_installed": { - "type": "boolean", - "description": "Claude CLI installed?" + "description": "Claude CLI installed?", + "type": "boolean" }, "cli_version": { + "description": "Claude CLI version", "type": [ "string", "null" - ], - "description": "Claude CLI version" + ] }, "detail": { + "description": "Full output for debugging", "type": [ "string", "null" - ], - "description": "Full output for debugging" + ] }, "environment": { - "type": "string", - "description": "Where the test ran: \"host\" or \"sandbox\"" + "description": "Where the test ran: \"host\" or \"sandbox\"", + "type": "string" }, "passed": { - "type": "boolean", - "description": "Whether the smoke test passed" + "description": "Whether the smoke test passed", + "type": "boolean" }, "setup_hint": { + "description": "What the user needs to do if the test failed", "type": [ "string", "null" - ], - "description": "What the user needs to do if the test failed" + ] } - } - }, - "SmtpCredentialsRequest": { - "type": "object", - "description": "Generic SMTP credentials request body.\n\nWorks with any SMTP relay \u2014 AWS SES SMTP endpoints, Sendgrid, Mailgun,\nPostmark, or a self-hosted Postfix. Use this when you only have SMTP\ncredentials (i.e. you cannot create identities via the upstream API).", + }, "required": [ - "host", - "port" + "passed", + "environment", + "cli_installed", + "cli_authenticated" ], + "type": "object" + }, + "SmtpCredentialsRequest": { + "description": "Generic SMTP credentials request body.\n\nWorks with any SMTP relay — AWS SES SMTP endpoints, Sendgrid, Mailgun,\nPostmark, or a self-hosted Postfix. Use this when you only have SMTP\ncredentials (i.e. you cannot create identities via the upstream API).", "properties": { "accept_invalid_certs": { - "type": "boolean", - "description": "Accept self-signed certificates. Only safe for local testing." + "description": "Accept self-signed certificates. Only safe for local testing.", + "type": "boolean" }, "encryption": { "$ref": "#/components/schemas/SmtpEncryptionRoute", "description": "TLS mode. Defaults to STARTTLS." }, "host": { - "type": "string", "description": "SMTP host, e.g. `email-smtp.eu-west-1.amazonaws.com`.", - "example": "email-smtp.eu-west-1.amazonaws.com" + "example": "email-smtp.eu-west-1.amazonaws.com", + "type": "string" }, "password": { + "description": "SMTP password / API token. Required when `username` is set.", "type": [ "string", "null" - ], - "description": "SMTP password / API token. Required when `username` is set." + ] }, "port": { - "type": "integer", - "format": "int32", "description": "SMTP port (587 for STARTTLS, 465 for implicit TLS, 25/1025 for plain).", "example": 587, - "minimum": 0 + "format": "int32", + "minimum": 0, + "type": "integer" }, "username": { + "description": "SMTP username. Leave empty for unauthenticated relays.", + "example": "AKIAIOSFODNN7EXAMPLE", "type": [ "string", "null" - ], - "description": "SMTP username. Leave empty for unauthenticated relays.", - "example": "AKIAIOSFODNN7EXAMPLE" + ] } - } + }, + "required": [ + "host", + "port" + ], + "type": "object" }, "SmtpEncryptionRoute": { - "type": "string", "description": "TLS mode for the SMTP relay.", "enum": [ "starttls", "tls", "none" - ] + ], + "type": "string" }, "SmtpResult": { - "type": "object", "description": "SMTP validation result", - "required": [ - "can_connect_smtp", - "has_full_inbox", - "is_catch_all", - "is_deliverable", - "is_disabled" - ], "properties": { "can_connect_smtp": { - "type": "boolean", - "description": "Whether we could connect to the SMTP server" + "description": "Whether we could connect to the SMTP server", + "type": "boolean" }, "error": { + "description": "Error message if SMTP check failed", "type": [ "string", "null" - ], - "description": "Error message if SMTP check failed" + ] }, "has_full_inbox": { - "type": "boolean", - "description": "Whether the mailbox appears to have a full inbox" + "description": "Whether the mailbox appears to have a full inbox", + "type": "boolean" }, "is_catch_all": { - "type": "boolean", - "description": "Whether this is a catch-all domain" + "description": "Whether this is a catch-all domain", + "type": "boolean" }, "is_deliverable": { - "type": "boolean", - "description": "Whether the email is deliverable" + "description": "Whether the email is deliverable", + "type": "boolean" }, "is_disabled": { - "type": "boolean", - "description": "Whether the mailbox is disabled" + "description": "Whether the mailbox is disabled", + "type": "boolean" } - } - }, - "SourceArchiveUpload": { - "type": "object", + }, "required": [ - "file" + "can_connect_smtp", + "has_full_inbox", + "is_catch_all", + "is_deliverable", + "is_disabled" ], + "type": "object" + }, + "SourceArchiveUpload": { "properties": { "file": { - "type": "string", - "format": "binary" + "format": "binary", + "type": "string" } - } - }, - "SourceBackupEntry": { - "type": "object", - "description": "Entry in the source backup index. Covers both DB-tracked backups\n(have a row in `backups`) and S3-scan discoveries (raw S3 objects with\nno DB row \u2014 used for disaster-recovery from another Temps instance).", + }, "required": [ - "id", - "backup_id", - "name", - "backup_type", - "created_at", - "location", - "metadata_location", - "source", - "state" + "file" ], + "type": "object" + }, + "SourceBackupEntry": { + "description": "Entry in the source backup index. Covers both DB-tracked backups\n(have a row in `backups`) and S3-scan discoveries (raw S3 objects with\nno DB row — used for disaster-recovery from another Temps instance).", "properties": { "backup_id": { - "type": "string", "description": "UUID identifier from the DB row. Empty for S3-scan entries.", - "example": "550e8400-e29b-41d4-a716-446655440000" + "example": "550e8400-e29b-41d4-a716-446655440000", + "type": "string" }, "backup_type": { - "type": "string", "description": "Backup variant as recorded by the backup pipeline (e.g. \"full\").", - "example": "full" + "example": "full", + "type": "string" }, "created_at": { - "type": "string", "description": "When the backup was created. For S3-scan entries this is the\nobject's LastModified time.", - "example": "2024-01-15T14:30:00.123Z" + "example": "2024-01-15T14:30:00.123Z", + "type": "string" }, "engine": { + "description": "Engine that produced the backup (\"postgres\", \"redis\", \"mongodb\",\n\"s3\", \"rustfs\"). Used by the UI to mark engine-compat with the\ntarget service.", + "example": "postgres", "type": [ "string", "null" - ], - "description": "Engine that produced the backup (\"postgres\", \"redis\", \"mongodb\",\n\"s3\", \"rustfs\"). Used by the UI to mark engine-compat with the\ntarget service.", - "example": "postgres" + ] }, "format": { + "description": "Storage format: \"walg\" for continuous-archive (PITR-capable),\n\"pg_dump\" for point-in-time dumps, \"\" for non-postgres.", + "example": "walg", "type": [ "string", "null" - ], - "description": "Storage format: \"walg\" for continuous-archive (PITR-capable),\n\"pg_dump\" for point-in-time dumps, \"\" for non-postgres.", - "example": "walg" + ] }, "id": { - "type": "integer", - "format": "int32", "description": "DB row id. Zero for S3-scan entries that have no DB row.", - "example": 1 + "example": 1, + "format": "int32", + "type": "integer" }, "location": { - "type": "string", "description": "Raw S3 URL / key where the backup sits. For Postgres WAL-G backups\nthis starts with `s3://`; for pg_dump-style backups it's the\nrelative object key.", - "example": "s3://bucket/external_services/postgres/svc-name/walg" + "example": "s3://bucket/external_services/postgres/svc-name/walg", + "type": "string" }, "metadata_location": { - "type": "string", "description": "Sidecar metadata.json location, if any. Empty when none.", - "example": "" + "example": "", + "type": "string" }, "name": { - "type": "string", "description": "Human-friendly display name (\"postgres backup (svc-name)\" for DB\nrows, or a synthesized label derived from the S3 path for scans).", - "example": "postgres backup (postgres-n4ea)" + "example": "postgres backup (postgres-n4ea)", + "type": "string" }, "origin_service_name": { + "description": "Name of the service that produced the backup. For S3-scan entries\nthis is parsed from the S3 path.", + "example": "postgres-n4ea", "type": [ "string", "null" - ], - "description": "Name of the service that produced the backup. For S3-scan entries\nthis is parsed from the S3 path.", - "example": "postgres-n4ea" + ] }, "size_bytes": { + "description": "Size of the backup in bytes, if known.", + "example": 1024000, + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Size of the backup in bytes, if known.", - "example": 1024000 + ] }, "source": { - "type": "string", "description": "Provenance: \"db\" for rows in this Temps, \"s3_scan\" for objects\ndiscovered by the S3 bucket walk (e.g., backups made by another\nTemps instance).", - "example": "db" + "example": "db", + "type": "string" }, "state": { - "type": "string", - "description": "Observed state (\"completed\", \"running\", \"failed\") \u2014 DB only.\nEmpty string for S3-scan entries.", - "example": "completed" + "description": "Observed state (\"completed\", \"running\", \"failed\") — DB only.\nEmpty string for S3-scan entries.", + "example": "completed", + "type": "string" } - } + }, + "required": [ + "id", + "backup_id", + "name", + "backup_type", + "created_at", + "location", + "metadata_location", + "source", + "state" + ], + "type": "object" }, "SourceBackupIndexResponse": { - "type": "object", "description": "Response type for source backup index", - "required": [ - "backups", - "last_updated" - ], "properties": { "backups": { - "type": "array", + "description": "List of backups in the source", "items": { "$ref": "#/components/schemas/SourceBackupEntry" }, - "description": "List of backups in the source" + "type": "array" }, "last_updated": { - "type": "string", "description": "When the index was last updated", - "example": "2024-01-15T14:30:00.123Z" + "example": "2024-01-15T14:30:00.123Z", + "type": "string" } - } + }, + "required": [ + "backups", + "last_updated" + ], + "type": "object" }, "SourceBody": { + "description": "Initial content to seed into the sandbox work dir. Mirrors the\n`@vercel/sandbox` `source` option. `type` is one of:\n- `git` — clone `url`; optionally check out `revision`\n- `tarball` — download `url` (must be tar or tar.gz) and extract\n\nFor private git repos, pass credentials one of two ways:\n1. **Inline (SDK-compatible):** `username` + `password`. GitHub\n tokens use `username: \"x-access-token\"`.\n2. **Stored connection (temps-native):** `git_connection_id`\n references a row in the caller's git provider connections. Temps\n resolves the token server-side and injects it safely.\n\n`git_connection_id` is mutually exclusive with `username`/`password`.", "oneOf": [ { - "type": "object", - "required": [ - "url", - "type" - ], "properties": { "depth": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] }, "git_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "password": { "type": [ @@ -35181,10 +35462,10 @@ ] }, "type": { - "type": "string", "enum": [ "git" - ] + ], + "type": "string" }, "url": { "type": "string" @@ -35195,58 +35476,53 @@ "null" ] } - } - }, - { - "type": "object", + }, "required": [ "url", "type" ], + "type": "object" + }, + { "properties": { "type": { - "type": "string", "enum": [ "tarball" - ] + ], + "type": "string" }, "url": { "type": "string" } - } + }, + "required": [ + "url", + "type" + ], + "type": "object" } - ], - "description": "Initial content to seed into the sandbox work dir. Mirrors the\n`@vercel/sandbox` `source` option. `type` is one of:\n- `git` \u2014 clone `url`; optionally check out `revision`\n- `tarball` \u2014 download `url` (must be tar or tar.gz) and extract\n\nFor private git repos, pass credentials one of two ways:\n1. **Inline (SDK-compatible):** `username` + `password`. GitHub\n tokens use `username: \"x-access-token\"`.\n2. **Stored connection (temps-native):** `git_connection_id`\n references a row in the caller's git provider connections. Temps\n resolves the token server-side and injects it safely.\n\n`git_connection_id` is mutually exclusive with `username`/`password`." + ] }, "SourceFileListResponse": { - "type": "object", - "required": [ - "source_files", - "total" - ], "properties": { "source_files": { - "type": "array", "items": { "$ref": "#/components/schemas/SourceFileResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "SourceFileResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "release", - "file_path", - "size_bytes", - "created_at" + "source_files", + "total" ], + "type": "object" + }, + "SourceFileResponse": { "properties": { "checksum": { "type": [ @@ -35255,58 +35531,58 @@ ] }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "file_path": { "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "release": { "type": "string" }, "size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "SourceMapListResponse": { - "type": "object", + }, "required": [ - "source_maps", - "total" + "id", + "project_id", + "release", + "file_path", + "size_bytes", + "created_at" ], + "type": "object" + }, + "SourceMapListResponse": { "properties": { "source_maps": { - "type": "array", "items": { "$ref": "#/components/schemas/SourceMapResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "SourceMapResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "release", - "file_path", - "size_bytes", - "created_at" + "source_maps", + "total" ], + "type": "object" + }, + "SourceMapResponse": { "properties": { "checksum": { "type": [ @@ -35315,8 +35591,8 @@ ] }, "created_at": { - "type": "string", - "example": "2025-10-12T12:15:47.609192Z" + "example": "2025-10-12T12:15:47.609192Z", + "type": "string" }, "dist": { "type": [ @@ -35328,24 +35604,32 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "release": { "type": "string" }, "size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "id", + "project_id", + "release", + "file_path", + "size_bytes", + "created_at" + ], + "type": "object" }, "SourceType": { - "type": "string", "description": "Source type for project deployments\n\nDetermines where the deployment artifacts come from:\n- `Git`: Source code from a Git repository (traditional flow)\n- `DockerImage`: Pre-built Docker image from external registry\n- `StaticFiles`: Pre-built static files uploaded as a bundle\n- `UploadedSource`: Source archive uploaded without a Git repository\n- `Manual`: Flexible type that accepts any deployment method", "enum": [ "git", @@ -35353,37 +35637,37 @@ "static_files", "uploaded_source", "manual" - ] + ], + "type": "string" }, "SpanEvent": { - "type": "object", "description": "A span event (log-like annotation on a span).", - "required": [ - "timestamp", - "name", - "attributes" - ], "properties": { "attributes": { - "type": "object", "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "name": { "type": "string" }, "timestamp": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "timestamp", + "name", + "attributes" + ], + "type": "object" }, "SpanKind": { - "type": "string", "description": "Span kind.", "enum": [ "UNSPECIFIED", @@ -35392,58 +35676,43 @@ "CLIENT", "PRODUCER", "CONSUMER" - ] + ], + "type": "string" }, "SpanRecord": { - "type": "object", "description": "A single trace span ready for storage.", - "required": [ - "project_id", - "resource", - "trace_id", - "span_id", - "name", - "kind", - "start_time", - "end_time", - "duration_ms", - "status_code", - "status_message", - "attributes", - "events" - ], "properties": { "attributes": { - "type": "object", - "description": "Raw key/value pairs exactly as reported by the instrumenting library.\nNumeric values are NOT guaranteed to share `duration_ms`'s unit \u2014 they\nmay be seconds, milliseconds, microseconds, or nanoseconds depending on\nthe exporter's own convention, and the unit is not labeled here.", "additionalProperties": { "type": "string" }, + "description": "Raw key/value pairs exactly as reported by the instrumenting library.\nNumeric values are NOT guaranteed to share `duration_ms`'s unit — they\nmay be seconds, milliseconds, microseconds, or nanoseconds depending on\nthe exporter's own convention, and the unit is not labeled here.", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "duration_ms": { - "type": "number", + "description": "Span duration in milliseconds. The only field on this struct guaranteed\nto be in milliseconds.", "format": "double", - "description": "Span duration in milliseconds. The only field on this struct guaranteed\nto be in milliseconds." + "type": "number" }, "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "events": { - "type": "array", "items": { "$ref": "#/components/schemas/SpanEvent" - } + }, + "type": "array" }, "kind": { "$ref": "#/components/schemas/SpanKind" @@ -35458,8 +35727,8 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "resource": { "$ref": "#/components/schemas/ResourceInfo" @@ -35468,8 +35737,8 @@ "type": "string" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "status_code": { "$ref": "#/components/schemas/SpanStatusCode" @@ -35480,45 +35749,50 @@ "trace_id": { "type": "string" } - } - }, - "SpanRow": { - "type": "object", + }, "required": [ - "id", - "ts", + "project_id", + "resource", "trace_id", "span_id", - "service", - "operation", + "name", + "kind", + "start_time", + "end_time", + "duration_ms", + "status_code", + "status_message", "attributes", - "attributes_truncated" + "events" ], + "type": "object" + }, + "SpanRow": { "properties": { "attributes": {}, "attributes_truncated": { "type": "boolean" }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "duration_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "id": { "type": "string" @@ -35548,269 +35822,417 @@ "type": "string" }, "ts": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "id", + "ts", + "trace_id", + "span_id", + "service", + "operation", + "attributes", + "attributes_truncated" + ], + "type": "object" + }, + "SpanStats": { + "description": "Latency and error statistics for one operation, i.e. one\n`(project, service, span name)` triple over the queried window.", + "properties": { + "avg_duration_ms": { + "format": "double", + "type": "number" + }, + "coefficient_of_variation": { + "description": "`stddev / avg`, or `0` when `avg` is zero.", + "format": "double", + "type": "number" + }, + "count": { + "description": "Number of spans aggregated.", + "format": "int64", + "type": "integer" + }, + "error_count": { + "format": "int64", + "type": "integer" + }, + "error_rate": { + "description": "`error_count / count`, in `[0, 1]`.", + "format": "double", + "type": "number" + }, + "kind": { + "$ref": "#/components/schemas/SpanKind", + "description": "The most common span kind for this operation." + }, + "last_seen": { + "description": "Start time of the most recent span in this group.", + "format": "date-time", + "type": "string" + }, + "max_duration_ms": { + "format": "double", + "type": "number" + }, + "min_duration_ms": { + "format": "double", + "type": "number" + }, + "p50_duration_ms": { + "format": "double", + "type": "number" + }, + "p95_duration_ms": { + "format": "double", + "type": "number" + }, + "p99_duration_ms": { + "format": "double", + "type": "number" + }, + "project_id": { + "format": "int32", + "type": "integer" + }, + "service_name": { + "type": "string" + }, + "span_name": { + "description": "The span name, which is the operation identity: `GET /api/checkout`,\n`SELECT carts`, `payments.charge`.", + "type": "string" + }, + "stddev_duration_ms": { + "description": "Sample standard deviation. `0` when the operation has a single sample.", + "format": "double", + "type": "number" + }, + "tail_ratio": { + "description": "`p99 / p50`, or `0` when `p50` is zero.", + "format": "double", + "type": "number" + }, + "total_duration_ms": { + "description": "`SUM(duration_ms)` — total wall-clock attributable to this operation.", + "format": "double", + "type": "number" + } + }, + "required": [ + "project_id", + "service_name", + "span_name", + "kind", + "count", + "error_count", + "error_rate", + "total_duration_ms", + "min_duration_ms", + "max_duration_ms", + "avg_duration_ms", + "stddev_duration_ms", + "p50_duration_ms", + "p95_duration_ms", + "p99_duration_ms", + "coefficient_of_variation", + "tail_ratio", + "last_seen" + ], + "type": "object" + }, + "SpanStatsResponse": { + "description": "Response for `GET /otel/span-stats`.", + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/SpanStats" + }, + "type": "array" + }, + "end_time": { + "format": "date-time", + "type": "string" + }, + "start_time": { + "description": "The window actually aggregated, echoed back because it is defaulted\nserver-side when the caller omits it.", + "format": "date-time", + "type": "string" + }, + "total": { + "description": "Total number of distinct operations matching the filters, for pagination.", + "format": "int64", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "data", + "total", + "start_time", + "end_time" + ], + "type": "object" }, "SpanStatusCode": { - "type": "string", "description": "Span status code.", "enum": [ "UNSET", "OK", "ERROR" - ] + ], + "type": "string" }, "SpeedMetricsPayload": { - "type": "object", "description": "Speed metrics payload for recording web vitals", "properties": { "cls": { + "description": "Cumulative Layout Shift (score)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Cumulative Layout Shift (score)" + ] }, "fcp": { + "description": "First Contentful Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "First Contentful Paint (milliseconds)" + ] }, "fid": { + "description": "First Input Delay (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "First Input Delay (milliseconds)" + ] }, "inp": { + "description": "Interaction to Next Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Interaction to Next Paint (milliseconds)" + ] }, "language": { + "description": "Browser language", "type": [ "string", "null" - ], - "description": "Browser language" + ] }, "lcp": { + "description": "Largest Contentful Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Largest Contentful Paint (milliseconds)" + ] }, "pathname": { + "description": "Page pathname", "type": [ "string", "null" - ], - "description": "Page pathname" + ] }, "query": { + "description": "Query string", "type": [ "string", "null" - ], - "description": "Query string" + ] }, "screenHeight": { + "description": "Screen height in pixels", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Screen height in pixels" + ] }, "screenWidth": { + "description": "Screen width in pixels", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Screen width in pixels" + ] }, "ttfb": { + "description": "Time to First Byte (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Time to First Byte (milliseconds)" + ] }, "viewportHeight": { + "description": "Viewport height in pixels", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Viewport height in pixels" + ] }, "viewportWidth": { + "description": "Viewport width in pixels", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Viewport width in pixels" + ] } - } + }, + "type": "object" }, "SpeedSegmentFilters": { - "type": "object", "description": "Optional segment filters for the performance read endpoints, mirroring\nanalytics' `VisitorSegmentFilters`. Each filter narrows results to samples\nmatching the dimension value, so metrics can be scoped to e.g. one page,\none browser, or one country. Geographic filters resolve via\n`ip_geolocations`; the rest live directly on `performance_metrics`.", "properties": { "filter_browser": { + "description": "Browser name (matches `performance_metrics.browser`)", "type": [ "string", "null" - ], - "description": "Browser name (matches `performance_metrics.browser`)" + ] }, "filter_city": { + "description": "Geolocation city (matches `ip_geolocations.city`)", "type": [ "string", "null" - ], - "description": "Geolocation city (matches `ip_geolocations.city`)" + ] }, "filter_country": { + "description": "Geolocation country (matches `ip_geolocations.country`)", "type": [ "string", "null" - ], - "description": "Geolocation country (matches `ip_geolocations.country`)" + ] }, "filter_operating_system": { + "description": "Operating system (matches `performance_metrics.operating_system`)", "type": [ "string", "null" - ], - "description": "Operating system (matches `performance_metrics.operating_system`)" + ] }, "filter_path": { + "description": "Page pathname (matches `performance_metrics.pathname`)", "type": [ "string", "null" - ], - "description": "Page pathname (matches `performance_metrics.pathname`)" + ] }, "filter_region": { + "description": "Geolocation region (matches `ip_geolocations.region`)", "type": [ "string", "null" - ], - "description": "Geolocation region (matches `ip_geolocations.region`)" + ] } - } + }, + "type": "object" }, "StaleSlot": { - "type": "object", - "required": [ - "slot_name", - "active", - "retained_bytes" - ], "properties": { "active": { "type": "boolean" }, "retained_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "slot_name": { "type": "string" } - } - }, - "StartAnalysisRequest": { - "type": "object", + }, "required": [ - "error_group_id" + "slot_name", + "active", + "retained_bytes" ], + "type": "object" + }, + "StartAnalysisRequest": { "properties": { "branch": { + "description": "Branch to clone instead of the project's main branch.", "type": [ "string", "null" - ], - "description": "Branch to clone instead of the project's main branch." + ] }, "error_group_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "max_turns": { + "description": "Per-run turn cap applied to every phase (1–200). Only enforced for\nCLIs with a turn flag (Claude Code). `None` uses the provider's\nconfigured defaults.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Per-run turn cap applied to every phase (1\u2013200). Only enforced for\nCLIs with a turn flag (Claude Code). `None` uses the provider's\nconfigured defaults." + ] }, "model": { + "description": "Model id for the chosen provider. `None` uses the provider's saved\ndefault model.", "type": [ "string", "null" - ], - "description": "Model id for the chosen provider. `None` uses the provider's saved\ndefault model." + ] }, "provider": { + "description": "AI provider id (\"claude_cli\", \"codex_cli\", \"opencode\"). `None` uses\nthe platform default provider.", "type": [ "string", "null" - ], - "description": "AI provider id (\"claude_cli\", \"codex_cli\", \"opencode\"). `None` uses\nthe platform default provider." + ] }, "user_context": { + "description": "Free-text notes for the model (extra context about the error, retry\nguidance, constraints). Included verbatim in the analysis prompt.", "type": [ "string", "null" - ], - "description": "Free-text notes for the model (extra context about the error, retry\nguidance, constraints). Included verbatim in the analysis prompt." + ] } - } - }, - "StartPgUpgradeRequest": { - "type": "object", + }, "required": [ - "from_version", - "to_version", - "from_image", - "to_image" + "error_group_id" ], + "type": "object" + }, + "StartPgUpgradeRequest": { "properties": { "from_image": { - "type": "string", - "example": "postgres:16-bookworm" + "example": "postgres:16-bookworm", + "type": "string" }, "from_version": { - "type": "string", - "example": "16" + "example": "16", + "type": "string" }, "to_image": { - "type": "string", - "example": "postgres:17-bookworm" + "example": "postgres:17-bookworm", + "type": "string" }, "to_version": { - "type": "string", - "example": "17" + "example": "17", + "type": "string" } - } + }, + "required": [ + "from_version", + "to_version", + "from_image", + "to_image" + ], + "type": "object" }, "StartRestoreRequest": { "allOf": [ @@ -35819,51 +36241,85 @@ "description": "Requested restore mode. See `RestoreRequestMode`." }, { - "type": "object", "properties": { "backup_engine": { + "description": "Engine of the backup when specified by `backup_location`\n(\"postgres\", \"redis\", \"mongodb\", \"s3\"). Ignored when `backup_id`\nis used — we infer from the DB row.", "type": [ "string", "null" - ], - "description": "Engine of the backup when specified by `backup_location`\n(\"postgres\", \"redis\", \"mongodb\", \"s3\"). Ignored when `backup_id`\nis used \u2014 we infer from the DB row." + ] }, "backup_id": { + "description": "DB id of the backup to restore from. Either `backup_id` or\n`backup_location` MUST be provided. Use `backup_id` when restoring\na backup this Temps instance recorded.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "DB id of the backup to restore from. Either `backup_id` or\n`backup_location` MUST be provided. Use `backup_id` when restoring\na backup this Temps instance recorded." + ] }, "backup_location": { + "description": "Raw S3 URL / key of the backup — used when restoring a backup\ndiscovered by S3 scan (i.e., produced by another Temps instance).\nRequires `backup_engine` and `s3_source_id` to also be set.", "type": [ "string", "null" - ], - "description": "Raw S3 URL / key of the backup \u2014 used when restoring a backup\ndiscovered by S3 scan (i.e., produced by another Temps instance).\nRequires `backup_engine` and `s3_source_id` to also be set." + ] }, "s3_source_id": { + "description": "S3 source the `backup_location` lives in. Ignored when `backup_id`\nis used.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "S3 source the `backup_location` lives in. Ignored when `backup_id`\nis used." + ] } - } + }, + "type": "object" } ] }, - "StatResponse": { - "type": "object", + "StartUpdateRequest": { + "description": "Optional pin for the version to install.", + "properties": { + "version": { + "description": "Release tag to install (e.g. `v0.2.0`). Omit to take the newest release\non the channel this install already tracks.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "StartUpdateResponse": { + "description": "Acknowledgement that an update was accepted and is running.", + "properties": { + "current_version": { + "description": "Version the server is running as it accepts this request.", + "type": "string" + }, + "estimated_restart_secs": { + "description": "How long to allow for the server to come back before treating the\nrestart as failed. `0` when nothing restarts.", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "message": { + "type": "string" + }, + "restart_mode": { + "$ref": "#/components/schemas/SelfUpdateRestartMode", + "description": "`automatic` (temps restarts itself) or `manual` (installed only)." + } + }, "required": [ - "path", - "exists", - "is_dir", - "is_file", - "size" + "current_version", + "estimated_restart_secs", + "restart_mode", + "message" ], + "type": "object" + }, + "StatResponse": { "properties": { "exists": { "type": "boolean" @@ -35878,23 +36334,21 @@ "type": "string" }, "size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "StaticBundleResponse": { - "type": "object", + }, "required": [ - "id", - "project_id", - "blob_path", - "content_type", - "size_bytes", - "uploaded_at", - "created_at" + "path", + "exists", + "is_dir", + "is_file", + "size" ], + "type": "object" + }, + "StaticBundleResponse": { "properties": { "blob_path": { "type": "string" @@ -35909,9 +36363,9 @@ "type": "string" }, "created_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "format": { "type": [ @@ -35920,8 +36374,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "metadata": {}, "original_filename": { @@ -35931,79 +36385,88 @@ ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "uploaded_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "blob_path", + "content_type", + "size_bytes", + "uploaded_at", + "created_at" + ], + "type": "object" }, "StaticParams": { - "type": "object", "description": "Static threshold detector: compare the aggregated `value` against `threshold`.", - "required": [ - "comparator", - "threshold" - ], "properties": { "comparator": { "$ref": "#/components/schemas/Comparator", "description": "How `value` is compared against `threshold`." }, "threshold": { - "type": "number", + "description": "The threshold the aggregated value is compared against.", "format": "double", - "description": "The threshold the aggregated value is compared against." + "type": "number" } - } + }, + "required": [ + "comparator", + "threshold" + ], + "type": "object" }, "StaticPresetConfig": { - "type": "object", "description": "Configuration for static site presets (Vite, Next.js, Docusaurus, etc.)\nThese presets build static sites that are served via a web server", "properties": { "buildCommand": { + "description": "Custom build command (overrides preset default)", + "example": "npm run build:production", "type": [ "string", "null" - ], - "description": "Custom build command (overrides preset default)", - "example": "npm run build:production" + ] }, "buildContext": { + "description": "Custom build context path (relative to repository root)\nUseful for monorepo setups where the app is in a subdirectory", + "example": "./apps/frontend", "type": [ "string", "null" - ], - "description": "Custom build context path (relative to repository root)\nUseful for monorepo setups where the app is in a subdirectory", - "example": "./apps/frontend" + ] }, "installCommand": { + "description": "Custom install command (overrides auto-detected package manager)", + "example": "npm ci", "type": [ "string", "null" - ], - "description": "Custom install command (overrides auto-detected package manager)", - "example": "npm ci" + ] }, "outputDir": { + "description": "Custom output directory (overrides preset default)\nCommon values: \"dist\", \"build\", \".next\", \"out\"", + "example": "dist", "type": [ "string", "null" - ], - "description": "Custom output directory (overrides preset default)\nCommon values: \"dist\", \"build\", \".next\", \"out\"", - "example": "dist" + ] } - } + }, + "type": "object" }, "StatsFilters": { - "type": "object", "description": "Filters for statistics queries", "properties": { "client_ip": { @@ -36013,11 +36476,11 @@ ] }, "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "device_type": { "type": [ @@ -36026,18 +36489,18 @@ ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "has_project": { + "description": "When true, only count requests that matched a project (project_id IS NOT NULL).\nUsed by the health dashboard so totals match the per-project cards.", "type": [ "boolean", "null" - ], - "description": "When true, only count requests that matched a project (project_id IS NOT NULL).\nUsed by the health dashboard so totals match the per-project cards." + ] }, "host": { "type": [ @@ -36058,11 +36521,11 @@ ] }, "project_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "request_source": { "type": [ @@ -36077,261 +36540,261 @@ ] }, "status_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "status_code_class": { + "description": "Filter by status code class (e.g. \"2xx\", \"3xx\", \"4xx\", \"5xx\")", "type": [ "string", - "null" - ], - "description": "Filter by status code class (e.g. \"2xx\", \"3xx\", \"4xx\", \"5xx\")" - } - } - }, - "StatusBucket": { - "type": "object", - "required": [ - "bucket_start", - "status", - "total_checks", - "operational_count", - "degraded_count", - "down_count", - "uptime_percentage" - ], + "null" + ] + } + }, + "type": "object" + }, + "StatusBucket": { "properties": { "avg_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "bucket_start": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "degraded_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "down_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "max_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "min_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "operational_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "p50_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "p95_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "p99_response_time_ms": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "status": { "type": "string" }, "total_checks": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "uptime_percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - "StatusBucketedResponse": { - "type": "object", + }, "required": [ - "monitor_id", - "interval", - "buckets" + "bucket_start", + "status", + "total_checks", + "operational_count", + "degraded_count", + "down_count", + "uptime_percentage" ], + "type": "object" + }, + "StatusBucketedResponse": { "properties": { "buckets": { - "type": "array", "items": { "$ref": "#/components/schemas/StatusBucket" - } + }, + "type": "array" }, "interval": { "type": "string" }, "monitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "StatusCodeCount": { - "type": "object", + }, "required": [ - "status_code", - "count", - "percentage" + "monitor_id", + "interval", + "buckets" ], + "type": "object" + }, + "StatusCodeCount": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "percentage": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "status_code": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "StatusCodesQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "status_code", + "count", + "percentage" ], + "type": "object" + }, + "StatusCodesQuery": { "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "StatusPageOverview": { - "type": "object", + }, "required": [ - "status", - "monitors", - "recent_incidents" + "start_date", + "end_date", + "project_id" ], + "type": "object" + }, + "StatusPageOverview": { "properties": { "monitors": { - "type": "array", "items": { "$ref": "#/components/schemas/MonitorStatus" - } + }, + "type": "array" }, "recent_incidents": { - "type": "array", "items": { "$ref": "#/components/schemas/IncidentResponse" - } + }, + "type": "array" }, "status": { "type": "string" } - } - }, - "StepConversionResponse": { - "type": "object", + }, "required": [ - "step_id", - "step_name", - "step_order", - "completions", - "conversion_rate", - "drop_off_rate", - "average_time_to_complete_seconds" + "status", + "monitors", + "recent_incidents" ], + "type": "object" + }, + "StepConversionResponse": { "properties": { "average_time_to_complete_seconds": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "completions": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "conversion_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "drop_off_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "step_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "step_name": { "type": "string" }, "step_order": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "step_id", + "step_name", + "step_order", + "completions", + "conversion_rate", + "drop_off_rate", + "average_time_to_complete_seconds" + ], + "type": "object" }, "StepResourceType": { - "type": "string", "description": "What kind of resource a migration step operates on", "enum": [ "project", @@ -36342,67 +36805,68 @@ "domain", "git-link", "other" - ] + ], + "type": "string" }, "StepResult": { - "type": "object", "description": "Result of executing a single migration step", - "required": [ - "step_id", - "step_title", - "success", - "skipped", - "message", - "created_resources", - "duration_seconds" - ], "properties": { "created_resources": { - "type": "array", + "description": "Resources created by this step", "items": { "$ref": "#/components/schemas/CreatedResource" }, - "description": "Resources created by this step" + "type": "array" }, "duration_seconds": { - "type": "number", + "description": "Duration of this step", "format": "double", - "description": "Duration of this step" + "type": "number" }, "message": { - "type": "string", - "description": "Human-readable message about what happened" + "description": "Human-readable message about what happened", + "type": "string" }, "skipped": { - "type": "boolean", - "description": "Whether this step was skipped" + "description": "Whether this step was skipped", + "type": "boolean" }, "step_id": { - "type": "string", - "description": "Step ID (matches `MigrationStep.id`)" + "description": "Step ID (matches `MigrationStep.id`)", + "type": "string" }, "step_title": { - "type": "string", - "description": "Step title (for display)" + "description": "Step title (for display)", + "type": "string" }, "success": { - "type": "boolean", - "description": "Whether this step succeeded" + "description": "Whether this step succeeded", + "type": "boolean" } - } - }, - "StepUpResponse": { - "type": "object", + }, "required": [ - "expires_at" + "step_id", + "step_title", + "success", + "skipped", + "message", + "created_resources", + "duration_seconds" ], + "type": "object" + }, + "StepUpResponse": { "properties": { "expires_at": { - "type": "string", + "description": "ISO 8601 timestamp after which sensitive actions require verification\nagain.", "format": "date-time", - "description": "ISO 8601 timestamp after which sensitive actions require verification\nagain." + "type": "string" } - } + }, + "required": [ + "expires_at" + ], + "type": "object" }, "StopSequence": { "oneOf": [ @@ -36410,90 +36874,99 @@ "type": "string" }, { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } ] }, "StorageQuota": { - "type": "object", "description": "Quota usage information for a project.", - "required": [ - "project_id", - "metrics_bytes", - "traces_bytes", - "logs_bytes", - "total_bytes", - "limit_bytes", - "usage_pct" - ], "properties": { "limit_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "logs_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "metrics_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "total_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "traces_bytes": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "usage_pct": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } + }, + "required": [ + "project_id", + "metrics_bytes", + "traces_bytes", + "logs_bytes", + "total_bytes", + "limit_bytes", + "usage_pct" + ], + "type": "object" }, "StripeConfig": { - "type": "object", "properties": { "include_unpriced_charges": { - "type": "boolean", - "description": "When an allowlist is set, should we still ingest charges that\nlack a price reference (e.g. standalone `charge.succeeded` without\na subscription)? Default true \u2014 charges don't belong to a SKU." + "description": "When an allowlist is set, should we still ingest charges that\nlack a price reference (e.g. standalone `charge.succeeded` without\na subscription)? Default true — charges don't belong to a SKU.", + "type": "boolean" }, "metered_mode": { "$ref": "#/components/schemas/MeteredMode", "description": "How to compute MRR for metered / tiered / hybrid subscriptions." }, "price_allowlist": { - "type": "array", + "description": "Only events tagged with one of these Stripe price IDs are ingested.\nEmpty = accept all prices.", "items": { "type": "string" }, - "description": "Only events tagged with one of these Stripe price IDs are ingested.\nEmpty = accept all prices." + "type": "array" }, "product_allowlist": { - "type": "array", + "description": "Only events tagged with one of these Stripe product IDs are\ningested. Empty = accept all products. Combined with\n`price_allowlist` via OR — if either list has a match, accept.", "items": { "type": "string" }, - "description": "Only events tagged with one of these Stripe product IDs are\ningested. Empty = accept all products. Combined with\n`price_allowlist` via OR \u2014 if either list has a match, accept." + "type": "array" } - } + }, + "type": "object" + }, + "SupervisorKind": { + "description": "What (if anything) will restart the process after it exits.", + "enum": [ + "systemd", + "launchd", + "container", + "none" + ], + "type": "string" }, "SyncedRepositoryListQuery": { - "type": "object", "properties": { "direction": { "type": [ @@ -36502,11 +36975,11 @@ ] }, "git_provider_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "language": { "type": [ @@ -36521,20 +36994,20 @@ ] }, "page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "per_page": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] }, "private": { "type": [ @@ -36554,50 +37027,46 @@ "null" ] } - } + }, + "type": "object" }, "SyntaxResult": { - "type": "object", "description": "Syntax validation result", - "required": [ - "is_valid_syntax" - ], "properties": { "domain": { + "description": "The domain part of the email", + "example": "gmail.com", "type": [ "string", "null" - ], - "description": "The domain part of the email", - "example": "gmail.com" + ] }, "is_valid_syntax": { - "type": "boolean", - "description": "Whether the email syntax is valid" + "description": "Whether the email syntax is valid", + "type": "boolean" }, "suggestion": { + "description": "Suggested email correction if available", "type": [ "string", "null" - ], - "description": "Suggested email correction if available" + ] }, "username": { + "description": "The username part of the email", + "example": "someone", "type": [ "string", "null" - ], - "description": "The username part of the email", - "example": "someone" + ] } - } - }, - "TagInfo": { - "type": "object", + }, "required": [ - "name", - "commit_sha" + "is_valid_syntax" ], + "type": "object" + }, + "TagInfo": { "properties": { "commit_sha": { "type": "string" @@ -36605,51 +37074,50 @@ "name": { "type": "string" } - } - }, - "TagListResponse": { - "type": "object", + }, "required": [ - "tags" + "name", + "commit_sha" ], + "type": "object" + }, + "TagListResponse": { "properties": { "tags": { - "type": "array", "items": { "$ref": "#/components/schemas/TagInfo" - } + }, + "type": "array" } - } - }, - "TailLogsRequest": { - "type": "object", + }, "required": [ - "project_id", - "service", - "env" + "tags" ], + "type": "object" + }, + "TailLogsRequest": { "properties": { "env": { "type": "string" }, "external_service_id": { + "description": "When set, tail an imported/managed external service's logs instead of\na project's (`project_id` is ignored in this mode).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "When set, tail an imported/managed external service's logs instead of\na project's (`project_id` is ignored in this mode)." + ] }, "levels": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "project_id": { - "type": "integer", + "description": "Project ID (integer, as used by the rest of the platform)", "format": "int32", - "description": "Project ID (integer, as used by the rest of the platform)" + "type": "integer" }, "service": { "type": "string" @@ -36660,179 +37128,176 @@ "null" ] } - } + }, + "required": [ + "project_id", + "service", + "env" + ], + "type": "object" }, "TargetRecommendation": { - "type": "object", "description": "The temps/Hetzner target sizing and savings estimate", - "required": [ - "server_type", - "vcpus", - "memory_gb", - "monthly_eur", - "fits_single_node", - "sizing_basis", - "rationale" - ], "properties": { "fits_single_node": { - "type": "boolean", - "description": "Whether the workloads fit a single recommended server. When `false`,\nthe rationale explains the multi-node option (temps worker nodes)." + "description": "Whether the workloads fit a single recommended server. When `false`,\nthe rationale explains the multi-node option (temps worker nodes).", + "type": "boolean" }, "memory_gb": { - "type": "integer", + "description": "Memory (GB) of the recommended server", "format": "int32", - "description": "Memory (GB) of the recommended server" + "type": "integer" }, "monthly_eur": { - "type": "number", + "description": "Estimated monthly price of the recommended server in EUR", "format": "double", - "description": "Estimated monthly price of the recommended server in EUR" + "type": "number" }, "monthly_savings_usd": { + "description": "Estimated monthly savings in USD (current cost minus target cost,\ntreating EUR≈USD for the rough comparison — disclaimed in `notes`).\n`None` when the current cost is unknown.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Estimated monthly savings in USD (current cost minus target cost,\ntreating EUR\u2248USD for the rough comparison \u2014 disclaimed in `notes`).\n`None` when the current cost is unknown." + ] }, "rationale": { - "type": "string", - "description": "Human-readable recommendation summary" + "description": "Human-readable recommendation summary", + "type": "string" }, "server_type": { - "type": "string", - "description": "Recommended Hetzner server type (e.g. \"cpx32\")" + "description": "Recommended Hetzner server type (e.g. \"cpx32\")", + "type": "string" }, "sizing_basis": { - "type": "string", - "description": "What the sizing was based on, e.g. \"2\u00d7 measured usage + temps\nplatform overhead\" or \"resource requests (no metrics available)\"" + "description": "What the sizing was based on, e.g. \"2× measured usage + temps\nplatform overhead\" or \"resource requests (no metrics available)\"", + "type": "string" }, "vcpus": { - "type": "integer", + "description": "vCPUs of the recommended server", "format": "int32", - "description": "vCPUs of the recommended server" + "type": "integer" }, "yearly_savings_usd": { + "description": "`monthly_savings_usd × 12`", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "`monthly_savings_usd \u00d7 12`" + ] } - } - }, - "TeamListResponse": { - "type": "object", + }, "required": [ - "teams", - "total", - "page", - "page_size" + "server_type", + "vcpus", + "memory_gb", + "monthly_eur", + "fits_single_node", + "sizing_basis", + "rationale" ], + "type": "object" + }, + "TeamListResponse": { "properties": { "page": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "page_size": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "teams": { - "type": "array", "items": { "$ref": "#/components/schemas/TeamResponse" - } + }, + "type": "array" }, "total": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "TeamMemberResponse": { - "type": "object", + }, "required": [ - "id", - "team_id", - "user_id", - "role", - "added_by", - "created_at", - "updated_at" + "teams", + "total", + "page", + "page_size" ], + "type": "object" + }, + "TeamMemberResponse": { "properties": { "added_by": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "role": { "$ref": "#/components/schemas/TeamRole", "description": "The source of this member's project-scoped permissions, intersected\nwith `project_team_access.role`." }, "team_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" }, "user_email": { + "description": "The member's email, joined from `users`.", "type": [ "string", "null" - ], - "description": "The member's email, joined from `users`." + ] }, "user_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "user_name": { + "description": "The member's display name, joined from `users`. `None` if the\nreferenced user no longer exists.", "type": [ "string", "null" - ], - "description": "The member's display name, joined from `users`. `None` if the\nreferenced user no longer exists." + ] } - } - }, - "TeamResponse": { - "type": "object", + }, "required": [ "id", - "name", - "slug", - "created_by", + "team_id", + "user_id", + "role", + "added_by", "created_at", "updated_at" ], + "type": "object" + }, + "TeamResponse": { "properties": { "created_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" }, "created_by": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "description": { "type": [ @@ -36841,8 +37306,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "name": { "type": "string" @@ -36851,229 +37316,232 @@ "type": "string" }, "updated_at": { - "type": "string", + "example": "2026-07-30T12:15:47.609192Z", "format": "date-time", - "example": "2026-07-30T12:15:47.609192Z" + "type": "string" } - } + }, + "required": [ + "id", + "name", + "slug", + "created_by", + "created_at", + "updated_at" + ], + "type": "object" }, "TeamRole": { - "type": "string", - "description": "Role a user holds within a team, or that a team holds on a project.\n\nNamed `TeamRole` rather than `Role` to keep it distinct from\n`temps_auth::permissions::Role`, which is the instance-wide role\n(Admin/User/\u2026) attached to a session. The two are orthogonal: the\ninstance-wide role decides whether you may touch a resource *kind* at\nall, `TeamRole` decides what you may do *within a project* you have\nteam access to. See `temps_teams::fixed_role_permissions` for the\nproject-scoped permission set each variant maps to.\n\nStored as a `varchar(32)` rather than a Postgres enum so the role set\ncan evolve in pure migration code without a schema-level enum\nalteration blocking a downgrade.", + "description": "Role a user holds within a team, or that a team holds on a project.\n\nNamed `TeamRole` rather than `Role` to keep it distinct from\n`temps_auth::permissions::Role`, which is the instance-wide role\n(Admin/User/…) attached to a session. The two are orthogonal: the\ninstance-wide role decides whether you may touch a resource *kind* at\nall, `TeamRole` decides what you may do *within a project* you have\nteam access to. See `temps_teams::fixed_role_permissions` for the\nproject-scoped permission set each variant maps to.\n\nStored as a `varchar(32)` rather than a Postgres enum so the role set\ncan evolve in pure migration code without a schema-level enum\nalteration blocking a downgrade.", "enum": [ "owner", "admin", "deployer", "viewer" - ] + ], + "type": "string" }, "TemplateResponse": { - "type": "object", "description": "Response type for a single template", - "required": [ - "slug", - "name", - "git", - "preset", - "tags", - "features", - "services", - "env_vars", - "is_featured" - ], "properties": { "description": { + "description": "Short description", "type": [ "string", "null" - ], - "description": "Short description" + ] }, "env_vars": { - "type": "array", + "description": "Environment variables template", "items": { "$ref": "#/components/schemas/EnvVarTemplateResponse" }, - "description": "Environment variables template" + "type": "array" }, "exposed_port": { + "description": "Container port the prebuilt image listens on (image deploys only).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Container port the prebuilt image listens on (image deploys only)." + ] }, "features": { - "type": "array", + "description": "Feature highlights", "items": { "type": "string" }, - "description": "Feature highlights" + "type": "array" }, "git": { "$ref": "#/components/schemas/GitRefResponse", "description": "Git repository reference" }, "health_check_path": { + "description": "HTTP health-check path probed after the container starts (image deploys).", "type": [ "string", "null" - ], - "description": "HTTP health-check path probed after the container starts (image deploys)." + ] }, "image": { + "description": "Prebuilt Docker image reference. When set, the one-click deploy pulls and\nruns this image directly (no build); when absent it builds from `git`.", "type": [ "string", "null" - ], - "description": "Prebuilt Docker image reference. When set, the one-click deploy pulls and\nruns this image directly (no build); when absent it builds from `git`." + ] }, "image_url": { + "description": "URL to template image/icon", "type": [ "string", "null" - ], - "description": "URL to template image/icon" + ] }, "is_featured": { - "type": "boolean", - "description": "Whether the template is featured/promoted" + "description": "Whether the template is featured/promoted", + "type": "boolean" }, "name": { - "type": "string", - "description": "Display name" + "description": "Display name", + "type": "string" }, "preset": { - "type": "string", - "description": "Framework/preset to use" + "description": "Framework/preset to use", + "type": "string" }, "screenshot_url": { + "description": "URL to a wide screenshot/banner preview of the deployed template.\nAbsent for templates that don't have one captured yet.", "type": [ "string", "null" - ], - "description": "URL to a wide screenshot/banner preview of the deployed template.\nAbsent for templates that don't have one captured yet." + ] }, "services": { - "type": "array", + "description": "Required external services", "items": { "type": "string" }, - "description": "Required external services" + "type": "array" }, "slug": { - "type": "string", - "description": "Unique identifier for the template (used in URLs)" + "description": "Unique identifier for the template (used in URLs)", + "type": "string" }, "tags": { - "type": "array", + "description": "Tags/categories for filtering", "items": { "type": "string" }, - "description": "Tags/categories for filtering" + "type": "array" } - } + }, + "required": [ + "slug", + "name", + "git", + "preset", + "tags", + "features", + "services", + "env_vars", + "is_featured" + ], + "type": "object" }, "TestEmailRequest": { - "type": "object", "description": "Request body for testing an email provider", - "required": [ - "from" - ], "properties": { "from": { - "type": "string", "description": "Sender email address (must be verified with the provider)", - "example": "test@example.com" + "example": "test@example.com", + "type": "string" }, "from_name": { + "description": "Sender display name", + "example": "My App", "type": [ "string", "null" - ], - "description": "Sender display name", - "example": "My App" + ] } - } + }, + "required": [ + "from" + ], + "type": "object" }, "TestEmailResponse": { - "type": "object", "description": "Response for test email endpoint", - "required": [ - "success", - "sent_to" - ], "properties": { "error": { + "description": "Error message if the test failed", "type": [ "string", "null" - ], - "description": "Error message if the test failed" + ] }, "provider_message_id": { + "description": "Provider message ID if successful", "type": [ "string", "null" - ], - "description": "Provider message ID if successful" + ] }, "sent_to": { - "type": "string", "description": "The email address the test was sent to", - "example": "user@example.com" + "example": "user@example.com", + "type": "string" }, "success": { - "type": "boolean", - "description": "Whether the test email was sent successfully" + "description": "Whether the test email was sent successfully", + "type": "boolean" } - } - }, - "TestProviderKeyRequest": { - "type": "object", + }, "required": [ - "provider", - "api_key" + "success", + "sent_to" ], + "type": "object" + }, + "TestProviderKeyRequest": { "properties": { "api_key": { - "type": "string", - "description": "The raw API key to test" + "description": "The raw API key to test", + "type": "string" }, "base_url": { + "description": "Optional custom base URL", "type": [ "string", "null" - ], - "description": "Optional custom base URL" + ] }, "provider": { - "type": "string", - "description": "Provider ID: \"openai\", \"anthropic\", \"xai\", \"gemini\"" + "description": "Provider ID: \"openai\", \"anthropic\", \"xai\", \"gemini\"", + "type": "string" } - } - }, - "TestProviderKeyResponse": { - "type": "object", + }, "required": [ - "success", "provider", - "latency_ms" + "api_key" ], + "type": "object" + }, + "TestProviderKeyResponse": { "properties": { "error": { + "description": "Error message if the test failed", "type": [ "string", "null" - ], - "description": "Error message if the test failed" + ] }, "latency_ms": { - "type": "integer", - "format": "int64", "description": "Response time in milliseconds", - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "provider": { "type": "string" @@ -37081,13 +37549,15 @@ "success": { "type": "boolean" } - } - }, - "TestProviderResponse": { - "type": "object", + }, "required": [ - "success" + "success", + "provider", + "latency_ms" ], + "type": "object" + }, + "TestProviderResponse": { "properties": { "message": { "type": [ @@ -37098,61 +37568,58 @@ "success": { "type": "boolean" } - } + }, + "required": [ + "success" + ], + "type": "object" }, "TimeBucketStats": { - "type": "object", "description": "Time bucket statistics response", - "required": [ - "bucket", - "request_count", - "avg_response_time_ms", - "error_count", - "total_request_bytes", - "total_response_bytes" - ], "properties": { "avg_response_time_ms": { - "type": "number", + "description": "Average response time in milliseconds", "format": "double", - "description": "Average response time in milliseconds" + "type": "number" }, "bucket": { - "type": "string", "description": "Bucket timestamp in RFC3339 format", - "example": "2025-10-23T12:00:00Z" + "example": "2025-10-23T12:00:00Z", + "type": "string" }, "error_count": { - "type": "integer", + "description": "Number of errors (status >= 400)", "format": "int64", - "description": "Number of errors (status >= 400)" + "type": "integer" }, "request_count": { - "type": "integer", + "description": "Total number of requests in this bucket", "format": "int64", - "description": "Total number of requests in this bucket" + "type": "integer" }, "total_request_bytes": { - "type": "integer", + "description": "Total request bytes", "format": "int64", - "description": "Total request bytes" + "type": "integer" }, "total_response_bytes": { - "type": "integer", + "description": "Total response bytes", "format": "int64", - "description": "Total response bytes" + "type": "integer" } - } + }, + "required": [ + "bucket", + "request_count", + "avg_response_time_ms", + "error_count", + "total_request_bytes", + "total_response_bytes" + ], + "type": "object" }, "TimeBucketStatsResponse": { - "type": "object", "description": "Response for time bucket stats", - "required": [ - "stats", - "start_time", - "end_time", - "bucket_interval" - ], "properties": { "bucket_interval": { "type": "string" @@ -37164,213 +37631,214 @@ "type": "string" }, "stats": { - "type": "array", "items": { "$ref": "#/components/schemas/TimeBucketStats" - } + }, + "type": "array" } - } - }, - "TimeseriesBucket": { - "type": "object", + }, "required": [ - "bucket", - "request_count", - "input_tokens", - "output_tokens", - "avg_latency_ms" + "stats", + "start_time", + "end_time", + "bucket_interval" ], + "type": "object" + }, + "TimeseriesBucket": { "properties": { "avg_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "bucket": { - "type": "string", - "description": "ISO 8601 timestamp" + "description": "ISO 8601 timestamp", + "type": "string" }, "input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "request_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "bucket", + "request_count", + "input_tokens", + "output_tokens", + "avg_latency_ms" + ], + "type": "object" }, "TimeseriesQueryParams": { - "type": "object", "properties": { "bucket": { + "description": "Bucket size: \"hour\", \"day\", \"week\" (defaults to \"day\")", "type": [ "string", "null" - ], - "description": "Bucket size: \"hour\", \"day\", \"week\" (defaults to \"day\")" + ] }, "conversation_id": { + "description": "Filter by conversation ID", "type": [ "string", "null" - ], - "description": "Filter by conversation ID" + ] }, "from": { + "description": "ISO 8601 start time (defaults to 24h ago)", "type": [ "string", "null" - ], - "description": "ISO 8601 start time (defaults to 24h ago)" + ] }, "model": { + "description": "Filter by model name", "type": [ "string", "null" - ], - "description": "Filter by model name" + ] }, "provider": { + "description": "Filter by provider name", "type": [ "string", "null" - ], - "description": "Filter by provider name" + ] }, "tags": { + "description": "Filter by tags (comma-separated, AND logic)", "type": [ "string", "null" - ], - "description": "Filter by tags (comma-separated, AND logic)" + ] }, "to": { + "description": "ISO 8601 end time (defaults to now)", "type": [ "string", "null" - ], - "description": "ISO 8601 end time (defaults to now)" + ] }, "user_id": { + "description": "Filter by user ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by user ID" + ] } - } + }, + "type": "object" }, "TlsMode": { - "type": "string", "enum": [ "None", "Starttls", "Tls" - ] + ], + "type": "string" }, "TodayStatsResponse": { - "type": "object", "description": "Today's stats response", - "required": [ - "total_requests", - "date" - ], "properties": { "date": { - "type": "string", "description": "Date for which stats are returned", - "example": "2025-10-23" + "example": "2025-10-23", + "type": "string" }, "total_requests": { - "type": "integer", + "description": "Total requests today", "format": "int64", - "description": "Total requests today" + "type": "integer" } - } - }, - "ToggleAiDataAccessRequest": { - "type": "object", + }, "required": [ - "enabled" + "total_requests", + "date" ], + "type": "object" + }, + "ToggleAiDataAccessRequest": { "properties": { "enabled": { - "type": "boolean", "description": "Whether the AI assistant may read row data from this service.", - "example": false + "example": false, + "type": "boolean" } - } - }, - "ToggleDeploymentMetricsRequest": { - "type": "object", - "description": "Request body to toggle OTLP metric ingestion for a deployment.", + }, "required": [ "enabled" ], + "type": "object" + }, + "ToggleDeploymentMetricsRequest": { + "description": "Request body to toggle OTLP metric ingestion for a deployment.", "properties": { "enabled": { - "type": "boolean", - "description": "Whether to enable (`true`) or disable (`false`) metric ingestion." + "description": "Whether to enable (`true`) or disable (`false`) metric ingestion.", + "type": "boolean" }, "path": { + "description": "Prometheus scrape path (optional, defaults to `/metrics`).", "type": [ "string", "null" - ], - "description": "Prometheus scrape path (optional, defaults to `/metrics`)." + ] }, "port": { + "description": "Prometheus scrape port (optional).", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Prometheus scrape port (optional).", - "minimum": 0 + ] } - } - }, - "ToggleServiceMetricsRequest": { - "type": "object", - "description": "Request body to toggle metric collection for an external service.", + }, "required": [ "enabled" ], + "type": "object" + }, + "ToggleServiceMetricsRequest": { + "description": "Request body to toggle metric collection for an external service.", "properties": { "enabled": { - "type": "boolean", - "description": "Whether to enable (`true`) or disable (`false`) metric collection." + "description": "Whether to enable (`true`) or disable (`false`) metric collection.", + "type": "boolean" } - } - }, - "TokenRenewalRequest": { - "type": "object", + }, "required": [ - "refresh_token" + "enabled" ], + "type": "object" + }, + "TokenRenewalRequest": { "properties": { "refresh_token": { "type": "string" } - } + }, + "required": [ + "refresh_token" + ], + "type": "object" }, "ToolCallEvent": { - "type": "object", "description": "Payload for the `tool_call` SSE event: the model is about to run a tool.\nSerialized as compact single-line JSON onto one `data:` line.", - "required": [ - "id", - "name", - "arguments" - ], "properties": { "arguments": { - "type": "string", - "description": "The raw JSON-args string the model emitted." + "description": "The raw JSON-args string the model emitted.", + "type": "string" }, "id": { "type": "string" @@ -37378,16 +37846,16 @@ "name": { "type": "string" } - } - }, - "ToolInfo": { - "type": "object", - "description": "One persisted tool invocation + its result, attached to an assistant message.", + }, "required": [ "id", "name", "arguments" ], + "type": "object" + }, + "ToolInfo": { + "description": "One persisted tool invocation + its result, attached to an assistant message.", "properties": { "arguments": { "type": "string" @@ -37404,16 +37872,16 @@ "null" ] } - } - }, - "ToolResultEvent": { - "type": "object", - "description": "Payload for the `tool_result` SSE event: a tool finished running. Serialized\nas compact single-line JSON; `content` is JSON-string-escaped so it stays on\none `data:` line even when long.", + }, "required": [ "id", "name", - "content" + "arguments" ], + "type": "object" + }, + "ToolResultEvent": { + "description": "Payload for the `tool_result` SSE event: a tool finished running. Serialized\nas compact single-line JSON; `content` is JSON-string-escaped so it stays on\none `data:` line even when long.", "properties": { "content": { "type": "string" @@ -37424,135 +37892,129 @@ "name": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "content" + ], + "type": "object" }, "TopModelsQueryParams": { - "type": "object", "properties": { "from": { + "description": "ISO 8601 start time (defaults to 24h ago)", "type": [ "string", "null" - ], - "description": "ISO 8601 start time (defaults to 24h ago)" + ] }, "limit": { + "description": "Max results (defaults to 10)", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Max results (defaults to 10)", - "minimum": 0 + ] }, "tags": { + "description": "Filter by tags (comma-separated, AND logic)", "type": [ "string", "null" - ], - "description": "Filter by tags (comma-separated, AND logic)" + ] }, "to": { + "description": "ISO 8601 end time (defaults to now)", "type": [ "string", "null" - ], - "description": "ISO 8601 end time (defaults to now)" + ] }, "user_id": { + "description": "Filter by user ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by user ID" + ] } - } + }, + "type": "object" }, "TraceProjectRef": { - "type": "object", "description": "All projects that contributed spans to a trace, including their sharing flag.\n\nReturned by `CrossProjectTraceService::find_trace_projects`.", - "required": [ - "project_id", - "project_name", - "project_slug", - "first_seen", - "sharing" - ], "properties": { "first_seen": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_name": { "type": "string" }, "project_slug": { - "type": "string", - "description": "URL slug used to link into the project's single-project trace view." + "description": "URL slug used to link into the project's single-project trace view.", + "type": "string" }, "sharing": { - "type": "boolean", - "description": "Whether this project has `cross_project_trace_sharing = true`." + "description": "Whether this project has `cross_project_trace_sharing = true`.", + "type": "boolean" } - } - }, - "TraceSummariesResponse": { - "type": "object", + }, "required": [ - "data" + "project_id", + "project_name", + "project_slug", + "first_seen", + "sharing" ], + "type": "object" + }, + "TraceSummariesResponse": { "properties": { "data": { - "type": "array", "items": { "$ref": "#/components/schemas/TraceSummary" - } + }, + "type": "array" }, "total": { + "description": "Total traces matching the filters, ignoring pagination. Omitted when\nthe request passed `include_total=false`, in which case the caller\nasked not to pay for the count — treat its absence as \"unknown\", not\nas zero.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total traces matching the filters, ignoring pagination. Omitted when\nthe request passed `include_total=false`, in which case the caller\nasked not to pay for the count \u2014 treat its absence as \"unknown\", not\nas zero.", - "minimum": 0 + ] } - } - }, - "TraceSummary": { - "type": "object", - "description": "A trace summary for the list view \u2014 one row per trace, aggregated from spans.", + }, "required": [ - "trace_id", - "root_span_name", - "service_name", - "kind", - "status_code", - "start_time", - "duration_ms", - "span_count", - "error_count" + "data" ], + "type": "object" + }, + "TraceSummary": { + "description": "A trace summary for the list view — one row per trace, aggregated from spans.", "properties": { "deployment_environment": { + "description": "The deployment environment from the root span's resource attributes (e.g. \"production\").", "type": [ "string", "null" - ], - "description": "The deployment environment from the root span's resource attributes (e.g. \"production\")." + ] }, "duration_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "error_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "kind": { "$ref": "#/components/schemas/SpanKind" @@ -37564,12 +38026,12 @@ "type": "string" }, "span_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "status_code": { "$ref": "#/components/schemas/SpanStatusCode" @@ -37577,58 +38039,63 @@ "trace_id": { "type": "string" } - } - }, - "TracesResponse": { - "type": "object", + }, "required": [ - "data", - "count" + "trace_id", + "root_span_name", + "service_name", + "kind", + "status_code", + "start_time", + "duration_ms", + "span_count", + "error_count" ], + "type": "object" + }, + "TracesResponse": { "properties": { "count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "data": { - "type": "array", "items": { "$ref": "#/components/schemas/SpanRecord" - } + }, + "type": "array" } - } + }, + "required": [ + "data", + "count" + ], + "type": "object" }, "TrackedLinkResponse": { - "type": "object", "description": "Tracked link with click count", - "required": [ - "link_index", - "original_url", - "click_count" - ], "properties": { "click_count": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "link_index": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "original_url": { "type": "string" } - } + }, + "required": [ + "link_index", + "original_url", + "click_count" + ], + "type": "object" }, "TrackingEventResponse": { - "type": "object", "description": "Email tracking event", - "required": [ - "id", - "email_id", - "event_type", - "created_at" - ], "properties": { "created_at": { "type": "string" @@ -37640,8 +38107,8 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "ip_address": { "type": [ @@ -37650,11 +38117,11 @@ ] }, "link_index": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "link_url": { "type": [ @@ -37668,17 +38135,23 @@ "null" ] } - } + }, + "required": [ + "id", + "email_id", + "event_type", + "created_at" + ], + "type": "object" }, "TriggerAgentRequest": { - "type": "object", "properties": { "trigger_source_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "trigger_source_type": { "type": [ @@ -37687,20 +38160,16 @@ ] }, "user_context": { + "description": "Optional context from the user (e.g. a research topic, bug description, or instructions).", "type": [ "string", "null" - ], - "description": "Optional context from the user (e.g. a research topic, bug description, or instructions)." + ] } - } + }, + "type": "object" }, "TriggerDigestResponse": { - "type": "object", - "required": [ - "success", - "message" - ], "properties": { "message": { "type": "string" @@ -37708,10 +38177,14 @@ "success": { "type": "boolean" } - } + }, + "required": [ + "success", + "message" + ], + "type": "object" }, "TriggerPipelinePayload": { - "type": "object", "properties": { "branch": { "type": [ @@ -37726,12 +38199,12 @@ ] }, "environment_id": { + "description": "Optional environment ID - if not provided, will use the project's preview environment", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment ID - if not provided, will use the project's preview environment" + ] }, "tag": { "type": [ @@ -37739,15 +38212,10 @@ "null" ] } - } + }, + "type": "object" }, "TriggerPipelineResponse": { - "type": "object", - "required": [ - "message", - "project_id", - "environment_id" - ], "properties": { "branch": { "type": [ @@ -37762,15 +38230,15 @@ ] }, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "tag": { "type": [ @@ -37778,86 +38246,87 @@ "null" ] } - } - }, - "TriggerScanRequest": { - "type": "object", + }, "required": [ + "message", + "project_id", "environment_id" ], + "type": "object" + }, + "TriggerScanRequest": { "properties": { "environment_id": { - "type": "integer", - "format": "int32", "description": "Environment ID to scan (uses the current deployment for this environment)", - "example": 1 + "example": 1, + "format": "int32", + "type": "integer" } - } - }, - "TriggerScanResponse": { - "type": "object", + }, "required": [ - "scan_id", - "status", - "message" + "environment_id" ], + "type": "object" + }, + "TriggerScanResponse": { "properties": { "message": { "type": "string" }, "scan_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { "type": "string" } - } + }, + "required": [ + "scan_id", + "status", + "message" + ], + "type": "object" }, "TtlRequest": { - "type": "object", "description": "Request to get TTL for a key", - "required": [ - "key" - ], "properties": { "key": { - "type": "string", "description": "The key to check TTL for", - "example": "session:abc" + "example": "session:abc", + "type": "string" }, "project_id": { + "description": "Project ID (required for API key/session auth, optional for deployment tokens)", + "example": 1, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Project ID (required for API key/session auth, optional for deployment tokens)", - "example": 1 + ] } - } + }, + "required": [ + "key" + ], + "type": "object" }, "TtlResponse": { - "type": "object", "description": "Response for TTL operation", - "required": [ - "ttl" - ], "properties": { "ttl": { - "type": "integer", - "format": "int64", "description": "TTL in seconds, -1 if no expiration, -2 if key doesn't exist", - "example": 3600 + "example": 3600, + "format": "int64", + "type": "integer" } - } - }, - "TxtRecord": { - "type": "object", + }, "required": [ - "name", - "value" + "ttl" ], + "type": "object" + }, + "TxtRecord": { "properties": { "name": { "type": "string" @@ -37865,66 +38334,64 @@ "value": { "type": "string" } - } + }, + "required": [ + "name", + "value" + ], + "type": "object" }, "UiManifest": { - "type": "object", "description": "Describes the plugin's embedded UI bundle.", - "required": [ - "entry_js" - ], "properties": { "css": { - "type": "array", + "description": "CSS files to load", "items": { "type": "string" }, - "description": "CSS files to load" + "type": "array" }, "entry_js": { - "type": "string", - "description": "JavaScript entry point filename relative to the bundle root" + "description": "JavaScript entry point filename relative to the bundle root", + "type": "string" }, "routes": { - "type": "array", + "description": "Client-side routes the plugin handles", "items": { "$ref": "#/components/schemas/UiRoute" }, - "description": "Client-side routes the plugin handles" + "type": "array" } - } + }, + "required": [ + "entry_js" + ], + "type": "object" }, "UiRoute": { - "type": "object", "description": "A client-side route provided by the plugin UI.", - "required": [ - "path", - "title" - ], "properties": { "path": { - "type": "string", - "description": "Route path pattern (e.g., \"/my-plugin\", \"/my-plugin/:id\")" + "description": "Route path pattern (e.g., \"/my-plugin\", \"/my-plugin/:id\")", + "type": "string" }, "title": { - "type": "string", - "description": "Page title for breadcrumbs" + "description": "Page title for breadcrumbs", + "type": "string" } - } + }, + "required": [ + "path", + "title" + ], + "type": "object" }, "UndrainNodeResponse": { - "type": "object", "description": "Response after undraining (reactivating) a node.", - "required": [ - "id", - "name", - "status", - "message" - ], "properties": { "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "message": { "type": "string" @@ -37935,225 +38402,228 @@ "status": { "type": "string" } - } + }, + "required": [ + "id", + "name", + "status", + "message" + ], + "type": "object" }, "UnifiedTrace": { - "type": "object", "description": "Merged cross-project trace result (Phase 2 unified waterfall).\n\nSpans are sorted by `start_time ASC`. At most 20 projects and 10,000\nspans total are included; `truncated` / `truncated_projects` signal when\nthe caps were hit.", - "required": [ - "trace_id", - "projects", - "spans", - "start_time", - "end_time", - "total_duration_ms", - "span_count", - "error_count", - "has_redacted_spans", - "truncated", - "truncated_projects" - ], "properties": { "end_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "error_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "has_redacted_spans": { - "type": "boolean", - "description": "`true` when at least one project has `cross_project_trace_sharing = false`\nand its spans were therefore excluded from the result set." + "description": "`true` when at least one project has `cross_project_trace_sharing = false`\nand its spans were therefore excluded from the result set.", + "type": "boolean" }, "projects": { - "type": "array", + "description": "Projects that contributed spans to this result set.", "items": { "$ref": "#/components/schemas/ProjectRef" }, - "description": "Projects that contributed spans to this result set." + "type": "array" }, "span_count": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "spans": { - "type": "array", + "description": "Annotated, merged span list sorted by `start_time ASC`.", "items": { "$ref": "#/components/schemas/AnnotatedSpan" }, - "description": "Annotated, merged span list sorted by `start_time ASC`." + "type": "array" }, "start_time": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "total_duration_ms": { - "type": "number", + "description": "Trace wall-clock duration in milliseconds (`end_time – start_time`).", "format": "double", - "description": "Trace wall-clock duration in milliseconds (`end_time \u2013 start_time`)." + "type": "number" }, "trace_id": { "type": "string" }, "truncated": { - "type": "boolean", - "description": "`true` when the 20-project or 10,000-span cap was hit." + "description": "`true` when the 20-project or 10,000-span cap was hit.", + "type": "boolean" }, "truncated_projects": { - "type": "array", + "description": "project_ids excluded due to truncation (most-recent first_seen dropped first).", "items": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, - "description": "project_ids excluded due to truncation (most-recent first_seen dropped first)." + "type": "array" } - } + }, + "required": [ + "trace_id", + "projects", + "spans", + "start_time", + "end_time", + "total_duration_ms", + "span_count", + "error_count", + "has_redacted_spans", + "truncated", + "truncated_projects" + ], + "type": "object" }, "UniqueCountsQuery": { - "type": "object", "description": "Query parameters for unique counts over time frame", - "required": [ - "start_date", - "end_date" - ], "properties": { "deployment_id": { + "description": "Optional deployment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional deployment filter" + ] }, "end_date": { - "type": "string", + "description": "End date for the query range", "format": "date-time", - "description": "End date for the query range" + "type": "string" }, "environment_id": { + "description": "Optional environment filter", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional environment filter" + ] }, "metric": { - "type": "string", - "description": "Metric to count: \"sessions\" (unique sessions), \"visitors\" (unique visitors),\n\"returning_visitors\" (visitors seen before the range), or \"page_views\"\n(total page views) (default: \"sessions\")" + "description": "Metric to count: \"sessions\" (unique sessions), \"visitors\" (unique visitors),\n\"returning_visitors\" (visitors seen before the range), or \"page_views\"\n(total page views) (default: \"sessions\")", + "type": "string" }, "start_date": { - "type": "string", + "description": "Start date for the query range", "format": "date-time", - "description": "Start date for the query range" + "type": "string" } - } - }, - "UniqueCountsResponse": { - "type": "object", + }, "required": [ - "count" + "start_date", + "end_date" ], + "type": "object" + }, + "UniqueCountsResponse": { "properties": { "count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "count" + ], + "type": "object" }, "UnsupportedFeature": { - "type": "object", "description": "A feature from the source platform that cannot be migrated", - "required": [ - "feature", - "reason" - ], "properties": { "alternative": { + "description": "Suggested alternative in Temps (if any)", "type": [ "string", "null" - ], - "description": "Suggested alternative in Temps (if any)" + ] }, "feature": { - "type": "string", - "description": "Feature name (e.g., \"Edge Middleware\", \"Serverless Functions\", \"Cron Jobs\")" + "description": "Feature name (e.g., \"Edge Middleware\", \"Serverless Functions\", \"Cron Jobs\")", + "type": "string" }, "reason": { - "type": "string", - "description": "Why it can't be migrated" + "description": "Why it can't be migrated", + "type": "string" } - } - }, - "UpdateAdminGateRequest": { - "type": "object", + }, "required": [ - "allowed_ips", - "allowed_hosts", - "trust_forwarded_for" + "feature", + "reason" ], + "type": "object" + }, + "UpdateAdminGateRequest": { "properties": { "allowed_hosts": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "allowed_ips": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "trust_forwarded_for": { "type": "boolean" } - } + }, + "required": [ + "allowed_ips", + "allowed_hosts", + "trust_forwarded_for" + ], + "type": "object" }, "UpdateAiProviderRequest": { - "type": "object", - "description": "Body for `PATCH /settings/ai-providers/{provider_id}` \u2014 updates\nprovider-scoped settings (just the default model for now) without\ntouching the credential. Keeping credentials out of this shape means\nthe UI can auto-save model changes on select, without forcing the user\nto re-paste their token or config file.\nName-spaced schema name avoids an OpenAPI collision with\n`temps-notifications::UpdateProviderRequest`, which has different fields.\nBoth are exposed as `utoipa::ToSchema`; without the override the merged\nOpenAPI doc would silently shadow one struct with the other and break\ngenerated CLI/web clients.", + "description": "Body for `PATCH /settings/ai-providers/{provider_id}` — updates\nprovider-scoped settings (just the default model for now) without\ntouching the credential. Keeping credentials out of this shape means\nthe UI can auto-save model changes on select, without forcing the user\nto re-paste their token or config file.\nName-spaced schema name avoids an OpenAPI collision with\n`temps-notifications::UpdateProviderRequest`, which has different fields.\nBoth are exposed as `utoipa::ToSchema`; without the override the merged\nOpenAPI doc would silently shadow one struct with the other and break\ngenerated CLI/web clients.", "properties": { "default_model": { + "description": "New default model id. `None` or an empty string clears the stored\nvalue so the CLI falls back to its own default.", "type": [ "string", "null" - ], - "description": "New default model id. `None` or an empty string clears the stored\nvalue so the CLI falls back to its own default." + ] }, "max_turns_analysis": { + "description": "Default max turns for the autofixer analysis phase (1–200). `0`\nclears the stored value (built-in default applies); omitted/`None`\nleaves the current value unchanged — so a PATCH that only updates\n`default_model` doesn't wipe the turn settings.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for the autofixer analysis phase (1\u2013200). `0`\nclears the stored value (built-in default applies); omitted/`None`\nleaves the current value unchanged \u2014 so a PATCH that only updates\n`default_model` doesn't wipe the turn settings." + ] }, "max_turns_feedback": { + "description": "Default max turns for autofixer feedback rounds (1–200). `0` clears;\nomitted leaves unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for autofixer feedback rounds (1\u2013200). `0` clears;\nomitted leaves unchanged." + ] }, "max_turns_fix": { + "description": "Default max turns for the autofixer fix phase (1–200). `0` clears;\nomitted leaves unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Default max turns for the autofixer fix phase (1\u2013200). `0` clears;\nomitted leaves unchanged." + ] } - } + }, + "type": "object" }, "UpdateAiProviderResponse": { - "type": "object", - "required": [ - "provider_id" - ], "properties": { "default_model": { "type": [ @@ -38162,40 +38632,43 @@ ] }, "max_turns_analysis": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "max_turns_feedback": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "max_turns_fix": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "provider_id": { "type": "string" } - } + }, + "required": [ + "provider_id" + ], + "type": "object" }, "UpdateAlertRuleRequest": { - "type": "object", "properties": { "cooldown_minutes": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "enabled": { "type": [ @@ -38204,11 +38677,11 @@ ] }, "environment_filter": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "error_level_filter": { "type": [ @@ -38235,18 +38708,18 @@ "null" ] } - } + }, + "type": "object" }, "UpdateApiKeyRequest": { - "type": "object", "properties": { "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "is_active": { "type": [ @@ -38261,149 +38734,247 @@ ] }, "permissions": { - "type": [ - "array", - "null" + "example": [ + "projects:read", + "deployments:read" ], "items": { "type": "string" }, - "example": [ - "projects:read", - "deployments:read" + "type": [ + "array", + "null" ] } - } + }, + "type": "object" }, "UpdateAutomaticDeployRequest": { - "type": "object", - "required": [ - "automatic_deploy" - ], "properties": { "automatic_deploy": { "type": "boolean" } - } + }, + "required": [ + "automatic_deploy" + ], + "type": "object" }, "UpdateBackupScheduleRequest": { - "type": "object", "description": "Request body for updating an existing backup schedule via `PATCH /api/backups/schedules/{id}`.\n\nAll fields are optional; only present fields are updated. Absent fields\nleave the corresponding column unchanged.", "properties": { "description": { + "description": "New human-readable description. Pass an empty string `\"\"` to clear.", "type": [ "string", "null" - ], - "description": "New human-readable description. Pass an empty string `\"\"` to clear." + ] }, "enabled": { + "description": "Enable or disable the schedule. Skipped when `None`.", "type": [ "boolean", "null" - ], - "description": "Enable or disable the schedule. Skipped when `None`." + ] }, "include_control_plane": { + "description": "Toggle whether the control-plane backup is produced on every run.", "type": [ "boolean", "null" - ], - "description": "Toggle whether the control-plane backup is produced on every run." + ] }, "max_runtime_secs": { + "description": "Per-schedule wall-clock timeout override (seconds).\n\n- `None` (field absent) — leave current value unchanged\n- `Some(None)` (field present, JSON `null`) — clear override; fall back to engine default\n- `Some(Some(n))` — set to `n` seconds (must be >= 60)", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Per-schedule wall-clock timeout override (seconds).\n\n- `None` (field absent) \u2014 leave current value unchanged\n- `Some(None)` (field present, JSON `null`) \u2014 clear override; fall back to engine default\n- `Some(Some(n))` \u2014 set to `n` seconds (must be >= 60)" + ] }, "name": { + "description": "New schedule name. Skipped when `None`. Must not be empty if provided.", "type": [ "string", "null" - ], - "description": "New schedule name. Skipped when `None`. Must not be empty if provided." + ] }, "retention_period": { + "description": "Days to retain backups produced by this schedule. Must be >= 1.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Days to retain backups produced by this schedule. Must be >= 1." + ] }, "schedule_expression": { + "description": "New cron expression. When changed, `next_run` is recomputed.", "type": [ "string", "null" - ], - "description": "New cron expression. When changed, `next_run` is recomputed." + ] }, "tags": { - "type": [ - "array", - "null" - ], + "description": "Replace the full tag list. Skipped when `None`.", "items": { "type": "string" }, - "description": "Replace the full tag list. Skipped when `None`." + "type": [ + "array", + "null" + ] }, "target_all_services": { + "description": "Toggle between \"back up every database\" (`true`) and \"back up only\nthe explicit list\" (`false`). When set to `true`, the server clears\nthe explicit membership rows for this schedule.", "type": [ "boolean", "null" - ], - "description": "Toggle between \"back up every database\" (`true`) and \"back up only\nthe explicit list\" (`false`). When set to `true`, the server clears\nthe explicit membership rows for this schedule." + ] } - } + }, + "type": "object" }, "UpdateBlobRequest": { - "type": "object", "description": "Request to update Blob service configuration", "properties": { "docker_image": { + "description": "Docker image to use (e.g., \"rustfs/rustfs:1.0.0-alpha.98\")", + "example": "rustfs/rustfs:1.0.0-alpha.98", "type": [ "string", "null" - ], - "description": "Docker image to use (e.g., \"rustfs/rustfs:1.0.0-alpha.98\")", - "example": "rustfs/rustfs:1.0.0-alpha.98" + ] } - } + }, + "type": "object" }, "UpdateBlobResponse": { - "type": "object", "description": "Response after updating Blob service", - "required": [ - "success", - "message", - "status" - ], "properties": { "message": { - "type": "string", "description": "Human-readable message", - "example": "Blob service updated successfully" + "example": "Blob service updated successfully", + "type": "string" }, "status": { "$ref": "#/components/schemas/BlobStatusResponse", "description": "Current status" }, "success": { - "type": "boolean", "description": "Whether the operation succeeded", - "example": true + "example": true, + "type": "boolean" } - } + }, + "required": [ + "success", + "message", + "status" + ], + "type": "object" }, - "UpdateCloudflareProviderRequest": { - "type": "object", + "UpdateCapabilityResponse": { + "description": "Whether this install can apply a release update on request, and how the last\nattempt went.\n\nDeliberately answerable even when the answer is \"no\": an operator who cannot\nuse the button still needs to know *why* and what to run instead, so this\nnever 404s or returns an empty body when the feature is unavailable.", + "properties": { + "allowed": { + "description": "Whether the *caller* holds `platform:update`. Distinct from `can_apply`,\nwhich describes the server: the console shows the action only when both\nare true, so a reader is never offered a button that would 403.", + "type": "boolean" + }, + "binary_path": { + "description": "Binary that would be replaced.", + "type": "string" + }, + "blocker": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/SelfUpdateBlocker", + "description": "Machine-readable reason `can_apply` is false (`disabled_by_flag`,\n`disabled_by_setting`, `container`, `no_supervisor`, `binary_not_writable`,\n`unsupported_platform`, `in_progress`)." + } + ] + }, + "can_apply": { + "description": "True only when a request would actually download, install and restart.", + "type": "boolean" + }, + "caveat": { + "description": "Non-blocking warning to show with the confirmation (split topology).", + "type": [ + "string", + "null" + ] + }, + "channel": { + "description": "Channel actually tracked, after applying the configured override or\nfalling back to inference from the running version tag.", + "type": "string" + }, + "channel_is_pinned": { + "description": "True when `channel` was set explicitly in settings rather than inferred.", + "type": "boolean" + }, + "current_version": { + "description": "Version tag of the running binary. Always present — the version page\nneeds it whether or not an update exists.", + "type": "string" + }, + "last_attempt": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/SelfUpdateAttempt", + "description": "Most recent attempt, including one resolved during this boot — this is\nhow the console reports the outcome of an update that restarted it." + } + ] + }, + "manual_command": { + "description": "The equivalent command to run by hand. Always present.", + "type": "string" + }, + "phase": { + "$ref": "#/components/schemas/SelfUpdatePhase", + "description": "Phase of an in-flight attempt: `idle` when none is running." + }, + "phase_error": { + "description": "Failure detail while `phase` is `failed`.", + "type": [ + "string", + "null" + ] + }, + "reason": { + "description": "Operator-facing explanation of `blocker`.", + "type": [ + "string", + "null" + ] + }, + "restart_mode": { + "$ref": "#/components/schemas/SelfUpdateRestartMode", + "description": "`automatic` when applying an update also restarts temps; `manual` when\nit only installs the binary and the operator restarts on their own\nschedule. Lets the console set expectations before the click." + }, + "supervisor": { + "$ref": "#/components/schemas/SupervisorKind", + "description": "What would restart the process: `systemd`, `launchd`, `container`, `none`." + } + }, "required": [ - "config" + "can_apply", + "allowed", + "manual_command", + "current_version", + "channel", + "channel_is_pinned", + "supervisor", + "restart_mode", + "binary_path", + "phase" ], + "type": "object" + }, + "UpdateCloudflareProviderRequest": { "properties": { "config": { "$ref": "#/components/schemas/CloudflareConfig" @@ -38420,10 +38991,13 @@ "null" ] } - } + }, + "required": [ + "config" + ], + "type": "object" }, "UpdateConfigBody": { - "type": "object", "properties": { "config": { "oneOf": [ @@ -38436,10 +39010,10 @@ } ] } - } + }, + "type": "object" }, "UpdateCustomDomainRequest": { - "type": "object", "properties": { "branch": { "type": [ @@ -38454,11 +39028,11 @@ ] }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "redirect_to": { "type": [ @@ -38467,23 +39041,23 @@ ] }, "service_name": { + "description": "Docker Compose service name this domain routes to (empty string clears it)", "type": [ "string", "null" - ], - "description": "Docker Compose service name this domain routes to (empty string clears it)" + ] }, "status_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "UpdateDashboardRequest": { - "type": "object", "properties": { "layout": { "oneOf": [ @@ -38501,10 +39075,10 @@ "null" ] } - } + }, + "type": "object" }, "UpdateDeploymentConfigRequest": { - "type": "object", "properties": { "automaticDeploy": { "type": [ @@ -38513,46 +39087,46 @@ ] }, "cpuLimit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "cpuRequest": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "crossArchitectureBuilds": { + "description": "Build one image per architecture the eligible nodes run. Off by\ndefault; environments inherit this and may override it. Cross-builds\nare emulated on the control plane and substantially slower, so they are\nopted into rather than triggered by cluster topology.", "type": [ "boolean", "null" - ], - "description": "Build one image per architecture the eligible nodes run. Off by\ndefault; environments inherit this and may override it. Cross-builds\nare emulated on the control plane and substantially slower, so they are\nopted into rather than triggered by cluster topology." + ] }, "exposedPort": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "memoryLimit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "memoryRequest": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "performanceMetricsEnabled": { "type": [ @@ -38561,11 +39135,11 @@ ] }, "replicas": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "security": { "oneOf": [ @@ -38583,18 +39157,18 @@ "null" ] } - } + }, + "type": "object" }, "UpdateDeploymentTokenRequest": { - "type": "object", "properties": { "expires_at": { + "example": "2024-12-31T23:59:59Z", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "example": "2024-12-31T23:59:59Z" + ] }, "is_active": { "type": [ @@ -38609,22 +39183,22 @@ ] }, "permissions": { - "type": [ - "array", - "null" + "example": [ + "visitors:enrich", + "emails:send" ], "items": { "type": "string" }, - "example": [ - "visitors:enrich", - "emails:send" + "type": [ + "array", + "null" ] } - } + }, + "type": "object" }, "UpdateDnsProviderRequest": { - "type": "object", "description": "Request to update a DNS provider", "properties": { "credentials": { @@ -38639,31 +39213,31 @@ ] }, "description": { + "description": "New description", "type": [ "string", "null" - ], - "description": "New description" + ] }, "is_active": { + "description": "Active status", "type": [ "boolean", "null" - ], - "description": "Active status" + ] }, "name": { + "description": "New name", "type": [ "string", "null" - ], - "description": "New name" + ] } - } + }, + "type": "object" }, "UpdateEmailProviderRequest": { - "type": "object", - "description": "Request body for `PATCH /email-providers/{id}`.\n\nAll fields are optional. Omit any field to leave it unchanged. The\n`provider_type` is immutable \u2014 to switch providers, delete the row and\ncreate a new one. For credentials, supplying any credential variant\nre-encrypts the stored blob; omitting them preserves the existing secret\n(so operators can rename without re-typing passwords).", + "description": "Request body for `PATCH /email-providers/{id}`.\n\nAll fields are optional. Omit any field to leave it unchanged. The\n`provider_type` is immutable — to switch providers, delete the row and\ncreate a new one. For credentials, supplying any credential variant\nre-encrypts the stored blob; omitting them preserves the existing secret\n(so operators can rename without re-typing passwords).", "properties": { "is_active": { "type": [ @@ -38672,18 +39246,18 @@ ] }, "name": { + "example": "My AWS SES", "type": [ "string", "null" - ], - "example": "My AWS SES" + ] }, "region": { + "example": "us-east-1", "type": [ "string", "null" - ], - "example": "us-east-1" + ] }, "scaleway_credentials": { "oneOf": [ @@ -38716,37 +39290,37 @@ ] }, "sns_topic_arn": { + "description": "Rotate or clear the exact SNS topic allowed for this SES provider.\nOmit to preserve it, send `null` to clear it, or send a string to set it.", "type": [ "string", "null" - ], - "description": "Rotate or clear the exact SNS topic allowed for this SES provider.\nOmit to preserve it, send `null` to clear it, or send a string to set it." + ] } - } + }, + "type": "object" }, "UpdateEnvironmentSettingsRequest": { - "type": "object", "properties": { "anti_affinity": { + "description": "Anti-affinity: spread replicas across different nodes.\nWhen enabled, the scheduler avoids placing two replicas of the same\nenvironment on the same node. Defaults to `true`.", "type": [ "boolean", "null" - ], - "description": "Anti-affinity: spread replicas across different nodes.\nWhen enabled, the scheduler avoids placing two replicas of the same\nenvironment on the same node. Defaults to `true`." + ] }, "attack_mode": { + "description": "Per-environment CAPTCHA attack-mode override (tri-state):\n- absent → leave the current override unchanged\n- JSON `null` → clear the override (inherit the project-level setting)\n- `true`/`false` → override the project setting for this environment", "type": [ "boolean", "null" - ], - "description": "Per-environment CAPTCHA attack-mode override (tri-state):\n- absent \u2192 leave the current override unchanged\n- JSON `null` \u2192 clear the override (inherit the project-level setting)\n- `true`/`false` \u2192 override the project setting for this environment" + ] }, "automatic_deploy": { + "description": "Enable/disable automatic deployments for this environment", "type": [ "boolean", "null" - ], - "description": "Enable/disable automatic deployments for this environment" + ] }, "branch": { "type": [ @@ -38755,102 +39329,102 @@ ] }, "cpu_limit": { + "description": "Maximum (limit) CPU in microcores. Send JSON `null` to clear → \"no limit\".\nAbsent leaves the current value unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum (limit) CPU in microcores. Send JSON `null` to clear \u2192 \"no limit\".\nAbsent leaves the current value unchanged." + ] }, "cpu_request": { + "description": "Minimum (request) CPU in microcores. Send JSON `null` to clear (no request).\nAbsent leaves the current value unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Minimum (request) CPU in microcores. Send JSON `null` to clear (no request).\nAbsent leaves the current value unchanged." + ] }, "cross_architecture_builds": { + "description": "Build one image per architecture the eligible nodes run (overrides the\nproject-level setting). Off by default: cross-architecture builds are\nemulated on the control plane and substantially slower, so they are\nopted into per environment rather than triggered by cluster topology.", "type": [ "boolean", "null" - ], - "description": "Build one image per architecture the eligible nodes run (overrides the\nproject-level setting). Off by default: cross-architecture builds are\nemulated on the control plane and substantially slower, so they are\nopted into per environment rather than triggered by cluster topology." + ] }, "exposed_port": { + "description": "Port exposed by the container (overrides project-level port for this environment)\n\nPriority order for port resolution:\n1. Image EXPOSE directive (auto-detected from built image)\n2. This environment-level exposed_port (overrides project setting)\n3. Project-level exposed_port (fallback)\n4. Default: 3000", + "example": 8080, + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Port exposed by the container (overrides project-level port for this environment)\n\nPriority order for port resolution:\n1. Image EXPOSE directive (auto-detected from built image)\n2. This environment-level exposed_port (overrides project setting)\n3. Project-level exposed_port (fallback)\n4. Default: 3000", - "example": 8080 + ] }, "force_https": { + "description": "Per-environment HTTP→HTTPS redirect override (tri-state):\n- absent → leave the current override unchanged\n- JSON `null` → clear the override (inherit the proxy default, which\n redirects only when the host has an active TLS certificate)\n- `true` → always redirect plain HTTP to HTTPS for this environment,\n even when no local certificate exists (TLS terminated upstream)\n- `false` → never redirect this environment, even when a certificate does\n exist\n\nRequests under `/.well-known/acme-challenge/` are never redirected\nregardless of this setting, so ACME HTTP-01 validation always completes.", "type": [ "boolean", "null" - ], - "description": "Per-environment HTTP\u2192HTTPS redirect override (tri-state):\n- absent \u2192 leave the current override unchanged\n- JSON `null` \u2192 clear the override (inherit the proxy default, which\n redirects only when the host has an active TLS certificate)\n- `true` \u2192 always redirect plain HTTP to HTTPS for this environment,\n even when no local certificate exists (TLS terminated upstream)\n- `false` \u2192 never redirect this environment, even when a certificate does\n exist\n\nRequests under `/.well-known/acme-challenge/` are never redirected\nregardless of this setting, so ACME HTTP-01 validation always completes." + ] }, "idle_timeout_seconds": { + "description": "Seconds of inactivity before stopping containers (60-86400). Default: 300.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Seconds of inactivity before stopping containers (60-86400). Default: 300." + ] }, "memory_limit": { + "description": "Maximum (limit) memory in MB. Send JSON `null` to clear → \"no limit\".\nAbsent leaves the current value unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum (limit) memory in MB. Send JSON `null` to clear \u2192 \"no limit\".\nAbsent leaves the current value unchanged." + ] }, "memory_request": { + "description": "Minimum (request) memory in MB. Send JSON `null` to clear (no request).\nAbsent leaves the current value unchanged.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Minimum (request) memory in MB. Send JSON `null` to clear (no request).\nAbsent leaves the current value unchanged." + ] }, "on_demand": { + "description": "Enable on-demand mode (scale-to-zero). Containers are stopped after\nidle_timeout_seconds of no traffic and started on the next request.", "type": [ "boolean", "null" - ], - "description": "Enable on-demand mode (scale-to-zero). Containers are stopped after\nidle_timeout_seconds of no traffic and started on the next request." + ] }, "password": { + "description": "Set a password to protect this environment. The proxy will show an HTML\npassword form before allowing access. The password is bcrypt-hashed\nserver-side and never stored in plaintext.\nSend an empty string to remove password protection.", "type": [ "string", "null" - ], - "description": "Set a password to protect this environment. The proxy will show an HTML\npassword form before allowing access. The password is bcrypt-hashed\nserver-side and never stored in plaintext.\nSend an empty string to remove password protection." + ] }, "performance_metrics_enabled": { + "description": "Enable/disable performance metrics collection", "type": [ "boolean", "null" - ], - "description": "Enable/disable performance metrics collection" + ] }, "protected": { + "description": "When true, git pushes do NOT auto-deploy to this environment.\nDeployments must be promoted from another environment.", "type": [ "boolean", "null" - ], - "description": "When true, git pushes do NOT auto-deploy to this environment.\nDeployments must be promoted from another environment." + ] }, "replicas": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "security": { "oneOf": [ @@ -38864,91 +39438,88 @@ ] }, "session_recording_enabled": { + "description": "Enable/disable session recording", "type": [ "boolean", "null" - ], - "description": "Enable/disable session recording" + ] }, "target_labels": { "description": "Label selector for node-based scheduling (overrides project-level setting).\nSame key with array value -> OR, different keys -> AND.\nExample: `{\"region\": [\"us\", \"asia\"], \"gpu\": \"true\"}`" }, "target_nodes": { + "description": "Optional list of node IDs to deploy to (overrides project-level setting)", + "items": { + "format": "int32", + "type": "integer" + }, "type": [ "array", "null" - ], - "items": { - "type": "integer", - "format": "int32" - }, - "description": "Optional list of node IDs to deploy to (overrides project-level setting)" + ] }, "wake_timeout_seconds": { + "description": "Max seconds to wait for containers to start on wake (5-120). Default: 30.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Max seconds to wait for containers to start on wake (5-120). Default: 30." + ] } - } + }, + "type": "object" }, "UpdateEnvironmentSubdomainRequest": { - "type": "object", - "description": "Request to rename an environment's auto-managed subdomain.\n\nThe subdomain is the host label inserted in front of the platform's\npreview domain (e.g. `myapp` in `myapp.preview.temps.sh`). Renaming\nreplaces the previous subdomain entirely \u2014 the old hostname stops\nresolving immediately after this request succeeds.", - "required": [ - "subdomain" - ], + "description": "Request to rename an environment's auto-managed subdomain.\n\nThe subdomain is the host label inserted in front of the platform's\npreview domain (e.g. `myapp` in `myapp.preview.temps.sh`). Renaming\nreplaces the previous subdomain entirely — the old hostname stops\nresolving immediately after this request succeeds.", "properties": { "subdomain": { - "type": "string", "description": "New subdomain label. Must be a DNS-safe slug (lowercase letters,\ndigits, and hyphens, 1-63 characters). The value is slugified\nserver-side, so casing and disallowed characters are normalized.", - "example": "myapp" + "example": "myapp", + "type": "string" } - } - }, - "UpdateEnvironmentVariableRequest": { - "type": "object", + }, "required": [ - "key", - "environment_ids" + "subdomain" ], + "type": "object" + }, + "UpdateEnvironmentVariableRequest": { "properties": { "environment_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" }, "include_in_preview": { "type": "boolean" }, "is_secret": { + "description": "Optional secret-flag transition.\n- `Some(true)` promotes a regular var to a secret.\n- `Some(false)` is rejected if the row is already secret (one-way flag).\n- `None` (omitted) leaves the flag unchanged.", "type": [ "boolean", "null" - ], - "description": "Optional secret-flag transition.\n- `Some(true)` promotes a regular var to a secret.\n- `Some(false)` is rejected if the row is already secret (one-way flag).\n- `None` (omitted) leaves the flag unchanged." + ] }, "key": { "type": "string" }, "value": { + "description": "New plaintext value. `None` (omitted) keeps the existing ciphertext,\nwhich is the only way to edit a secret env var without re-typing its\nvalue (e.g. changing which environments it applies to).", "type": [ "string", "null" - ], - "description": "New plaintext value. `None` (omitted) keeps the existing ciphertext,\nwhich is the only way to edit a secret env var without re-typing its\nvalue (e.g. changing which environments it applies to)." + ] } - } - }, - "UpdateErrorGroupRequest": { - "type": "object", + }, "required": [ - "status" + "key", + "environment_ids" ], + "type": "object" + }, + "UpdateErrorGroupRequest": { "properties": { "assigned_to": { "type": [ @@ -38959,32 +39530,35 @@ "status": { "type": "string" } - } - }, - "UpdateExternalServiceRequest": { - "type": "object", + }, "required": [ - "parameters" + "status" ], + "type": "object" + }, + "UpdateExternalServiceRequest": { "properties": { "docker_image": { + "description": "Docker image to use for the service (e.g., \"gotempsh/postgres-walg:18-bookworm\", \"timescale/timescaledb-ha:pg18\")\nWhen provided, the service will be recreated with the new image while preserving data", "type": [ "string", "null" - ], - "description": "Docker image to use for the service (e.g., \"gotempsh/postgres-walg:18-bookworm\", \"timescale/timescaledb-ha:pg18\")\nWhen provided, the service will be recreated with the new image while preserving data" + ] }, "parameters": { - "type": "object", "additionalProperties": {}, "propertyNames": { "type": "string" - } + }, + "type": "object" } - } + }, + "required": [ + "parameters" + ], + "type": "object" }, "UpdateFlagRequest": { - "type": "object", "properties": { "client_visible": { "type": [ @@ -38996,46 +39570,40 @@ "description": "Must match the flag's existing `value_type`." }, "description": { + "description": "Tri-state: absent leaves it, `null` clears it, a string sets it.", "type": [ "string", "null" - ], - "description": "Tri-state: absent leaves it, `null` clears it, a string sets it." + ] } - } + }, + "type": "object" }, "UpdateGitSettingsRequest": { - "type": "object", - "required": [ - "main_branch", - "repo_owner", - "repo_name", - "directory" - ], "properties": { "directory": { "type": "string" }, "git_provider_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "git_url": { + "description": "Git clone URL for public repositories", "type": [ "string", "null" - ], - "description": "Git clone URL for public repositories" + ] }, "is_public_repo": { + "description": "Whether this is a public repository (no git provider connection needed)", "type": [ "boolean", "null" - ], - "description": "Whether this is a public repository (no git provider connection needed)" + ] }, "main_branch": { "type": "string" @@ -39063,14 +39631,16 @@ "repo_owner": { "type": "string" } - } - }, - "UpdateIncidentStatusRequest": { - "type": "object", + }, "required": [ - "status", - "message" + "main_branch", + "repo_owner", + "repo_name", + "directory" ], + "type": "object" + }, + "UpdateIncidentStatusRequest": { "properties": { "message": { "type": "string" @@ -39078,105 +39648,106 @@ "status": { "type": "string" } - } + }, + "required": [ + "status", + "message" + ], + "type": "object" }, "UpdateIpAccessControlRequest": { - "type": "object", "description": "Request to update an IP access control rule", "properties": { "action": { + "description": "Optional new action", "type": [ "string", "null" - ], - "description": "Optional new action" + ] }, "ip_address": { + "description": "Optional new IP address", "type": [ "string", "null" - ], - "description": "Optional new IP address" + ] }, "reason": { + "description": "Optional new reason", "type": [ "string", "null" - ], - "description": "Optional new reason" + ] } - } + }, + "type": "object" }, "UpdateKvRequest": { - "type": "object", "description": "Request to update KV service configuration", "properties": { "docker_image": { + "description": "Docker image to use (e.g., \"gotempsh/redis-walg:8-bookworm\")", + "example": "gotempsh/redis-walg:8-bookworm", "type": [ "string", "null" - ], - "description": "Docker image to use (e.g., \"gotempsh/redis-walg:8-bookworm\")", - "example": "gotempsh/redis-walg:8-bookworm" + ] } - } + }, + "type": "object" }, "UpdateKvResponse": { - "type": "object", "description": "Response after updating KV service", - "required": [ - "success", - "message", - "status" - ], "properties": { "message": { - "type": "string", "description": "Status message", - "example": "KV service updated successfully" + "example": "KV service updated successfully", + "type": "string" }, "status": { "$ref": "#/components/schemas/KvStatusResponse", "description": "Current service status" }, "success": { - "type": "boolean", - "description": "Whether the operation succeeded" + "description": "Whether the operation succeeded", + "type": "boolean" } - } + }, + "required": [ + "success", + "message", + "status" + ], + "type": "object" }, "UpdateManagedDomainApiRequest": { - "type": "object", "description": "Request to update a managed domain's settings.", "properties": { "auto_manage": { + "description": "Toggle automatic DNS management for this domain.", "type": [ "boolean", "null" - ], - "description": "Toggle automatic DNS management for this domain." + ] }, "generated_hostname_mode": { + "description": "`\"standard\"` or `\"flat\"`. Persisted as-is; switching to `\"flat\"` does not\nrecompute existing hostnames — use the apply endpoint for that.", "type": [ "string", "null" - ], - "description": "`\"standard\"` or `\"flat\"`. Persisted as-is; switching to `\"flat\"` does not\nrecompute existing hostnames \u2014 use the apply endpoint for that." + ] }, "sync_generated_records": { + "description": "Toggle DNS record sync for this domain.", "type": [ "boolean", "null" - ], - "description": "Toggle DNS record sync for this domain." + ] } - } + }, + "type": "object" }, "UpdateMcpRequest": { - "type": "object", - "required": [ - "config" - ], "properties": { "config": { "type": "object" @@ -39193,22 +39764,25 @@ "null" ] } - } + }, + "required": [ + "config" + ], + "type": "object" }, "UpdateMemberRoleRequest": { - "type": "object", "description": "The new fixed role for an existing membership.", - "required": [ - "role" - ], "properties": { "role": { "$ref": "#/components/schemas/TeamRole" } - } + }, + "required": [ + "role" + ], + "type": "object" }, "UpdateMetricAlertRequest": { - "type": "object", "properties": { "aggregation": { "type": [ @@ -39228,11 +39802,11 @@ ] }, "dynamic_alerts": { + "description": "Toggles per-series (\"dynamic\") alerting (absent = leave unchanged).", "type": [ "boolean", "null" - ], - "description": "Toggles per-series (\"dynamic\") alerting (absent = leave unchanged)." + ] }, "enabled": { "type": [ @@ -39241,37 +39815,33 @@ ] }, "for_duration_secs": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "group_by": { - "type": [ - "array", - "null" - ], + "description": "Replaces the group_by keys wholesale when present (absent = leave unchanged).", "items": { "type": "string" }, - "description": "Replaces the group_by keys wholesale when present (absent = leave unchanged)." + "type": [ + "array", + "null" + ] }, "grouped_notification_threshold": { + "description": "Updates the notification-grouping threshold (absent = leave unchanged).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Updates the notification-grouping threshold (absent = leave unchanged)." + ] }, "label_filters": { - "type": [ - "array", - "null" - ], + "description": "Replaces the label filters wholesale when present (absent = leave unchanged).", "items": { - "type": "array", "items": false, "prefixItems": [ { @@ -39280,17 +39850,21 @@ { "type": "string" } - ] + ], + "type": "array" }, - "description": "Replaces the label filters wholesale when present (absent = leave unchanged)." + "type": [ + "array", + "null" + ] }, "max_series": { + "description": "Updates the dynamic-alerting cardinality cap (absent = leave unchanged).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Updates the dynamic-alerting cardinality cap (absent = leave unchanged)." + ] }, "metric_name": { "type": [ @@ -39311,19 +39885,16 @@ ] }, "window_secs": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "UpdateNotificationEmailProviderRequest": { - "type": "object", - "required": [ - "config" - ], "properties": { "config": { "$ref": "#/components/schemas/EmailConfig" @@ -39340,10 +39911,13 @@ "null" ] } - } + }, + "required": [ + "config" + ], + "type": "object" }, "UpdateOidcProviderRequest": { - "type": "object", "properties": { "client_id": { "type": [ @@ -39417,79 +39991,79 @@ "null" ] } - } + }, + "type": "object" }, "UpdatePreferencesRequest": { - "type": "object", - "required": [ - "preferences" - ], "properties": { "preferences": { "$ref": "#/components/schemas/NotificationPreferencesResponse" } - } + }, + "required": [ + "preferences" + ], + "type": "object" }, "UpdateProjectSecretRequest": { - "type": "object", - "description": "Request to update a project secret. The `value` field is optional \u2014 omit it\nto rotate only the environment scoping / preview flag without touching the\nciphertext.", + "description": "Request to update a project secret. The `value` field is optional — omit it\nto rotate only the environment scoping / preview flag without touching the\nciphertext.", "properties": { "environment_ids": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" }, "include_in_preview": { "type": "boolean" }, "value": { + "description": "New plaintext value, <= 1 MiB. Omit to keep the existing value.", "type": [ "string", "null" - ], - "description": "New plaintext value, <= 1 MiB. Omit to keep the existing value." + ] } - } + }, + "type": "object" }, "UpdateProjectSettingsRequest": { - "type": "object", "properties": { "ai_alert_summaries_enabled": { + "description": "Opt in to AI summarization of metric alert notifications (ADR-021).", "type": [ "boolean", "null" - ], - "description": "Opt in to AI summarization of metric alert notifications (ADR-021)." + ] }, "ai_debug_chat_enabled": { + "description": "Opt in to AI debugging chat, e.g. on deployment failures (ADR-023).", "type": [ "boolean", "null" - ], - "description": "Opt in to AI debugging chat, e.g. on deployment failures (ADR-023)." + ] }, "ai_write_actions_enabled": { + "description": "Opt in to AI propose-then-confirm write capability.", "type": [ "boolean", "null" - ], - "description": "Opt in to AI propose-then-confirm write capability." + ] }, "attack_mode": { + "description": "Enable/disable attack mode (CAPTCHA protection) for all project environments", "type": [ "boolean", "null" - ], - "description": "Enable/disable attack mode (CAPTCHA protection) for all project environments" + ] }, "cross_project_trace_sharing": { + "description": "ADR-027 Phase 3 opt-out: set to false to suppress this project's traces\nfrom appearing in cross-project discovery results. Default true (consistent\nwith the OSS global-observability model). Omit to leave unchanged.", "type": [ "boolean", "null" - ], - "description": "ADR-027 Phase 3 opt-out: set to false to suppress this project's traces\nfrom appearing in cross-project discovery results. Default true (consistent\nwith the OSS global-observability model). Omit to leave unchanged." + ] }, "directory": { "type": [ @@ -39498,32 +40072,32 @@ ] }, "enable_preview_environments": { + "description": "Enable automatic preview environment creation for each branch", "type": [ "boolean", "null" - ], - "description": "Enable automatic preview environment creation for each branch" + ] }, "error_source_context_enabled": { + "description": "Opt in to native error-tracking source context (source-file upload +\nsource code shown in stack traces).", "type": [ "boolean", "null" - ], - "description": "Opt in to native error-tracking source context (source-file upload +\nsource code shown in stack traces)." + ] }, "error_source_root": { + "description": "Set the auto-capture source root (relative to the checkout). Send an\nempty string to clear it back to the build-context default. Omit to\nleave unchanged.", "type": [ "string", "null" - ], - "description": "Set the auto-capture source root (relative to the checkout). Send an\nempty string to clear it back to the build-context default. Omit to\nleave unchanged." + ] }, "git_provider_connection_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "main_branch": { "type": [ @@ -39549,27 +40123,27 @@ ] }, "preview_envs_idle_timeout_seconds": { + "description": "Idle timeout (seconds, 60..=86400) for on-demand preview environments.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Idle timeout (seconds, 60..=86400) for on-demand preview environments." + ] }, "preview_envs_on_demand": { + "description": "When true, newly-created preview environments default to on-demand mode.", "type": [ "boolean", "null" - ], - "description": "When true, newly-created preview environments default to on-demand mode." + ] }, "preview_envs_wake_timeout_seconds": { + "description": "Wake timeout (seconds, 5..=120) for on-demand preview environments.", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Wake timeout (seconds, 5..=120) for on-demand preview environments." + ] }, "repo_name": { "type": [ @@ -39589,72 +40163,72 @@ "null" ] } - } + }, + "type": "object" }, "UpdateProviderCredentialsRequest": { - "type": "object", "description": "Partial-update payload for provider credentials. Every field is optional;\nonly the fields the user re-enters are applied. The server validates that\nthe fields supplied make sense for the provider's current auth_method\n(e.g. `app_id` + `private_key` only apply to GitHub Apps).", "properties": { "app_id": { + "description": "Application ID (GitHub App integer as string; GitLab App string).", "type": [ "string", "null" - ], - "description": "Application ID (GitHub App integer as string; GitLab App string)." + ] }, "app_secret": { + "description": "GitLab App secret (not used by GitHub App — use `client_secret`).", "type": [ "string", "null" - ], - "description": "GitLab App secret (not used by GitHub App \u2014 use `client_secret`)." + ] }, "client_id": { + "description": "OAuth client ID (GitLab OAuth, GitHub App).", "type": [ "string", "null" - ], - "description": "OAuth client ID (GitLab OAuth, GitHub App)." + ] }, "client_secret": { + "description": "OAuth client secret (GitLab OAuth, GitHub App).", "type": [ "string", "null" - ], - "description": "OAuth client secret (GitLab OAuth, GitHub App)." + ] }, "private_key": { + "description": "GitHub App private key (PEM).", "type": [ "string", "null" - ], - "description": "GitHub App private key (PEM)." + ] }, "redirect_uri": { + "description": "OAuth redirect URI (GitLab OAuth / GitLab App).", "type": [ "string", "null" - ], - "description": "OAuth redirect URI (GitLab OAuth / GitLab App)." + ] }, "token": { + "description": "PAT for PAT-type providers.", "type": [ "string", "null" - ], - "description": "PAT for PAT-type providers." + ] }, "webhook_secret": { + "description": "GitHub App webhook secret.", "type": [ "string", "null" - ], - "description": "GitHub App webhook secret." + ] } - } + }, + "type": "object" }, "UpdateProviderKeyRequest": { - "type": "object", "properties": { "api_key": { "type": [ @@ -39663,18 +40237,18 @@ ] }, "base_url": { + "description": "Double-Option: absent = leave unchanged, present-null = clear (revert to\nthe provider's default endpoint), present-value = set.", "type": [ "string", "null" - ], - "description": "Double-Option: absent = leave unchanged, present-null = clear (revert to\nthe provider's default endpoint), present-value = set." + ] }, "default_model": { + "description": "Double-Option: absent = leave unchanged, present-null = clear the pinned\nmodel (revert to the per-provider default), present-value = set.", "type": [ "string", "null" - ], - "description": "Double-Option: absent = leave unchanged, present-null = clear the pinned\nmodel (revert to the per-provider default), present-value = set." + ] }, "display_name": { "type": [ @@ -39688,10 +40262,10 @@ "null" ] } - } + }, + "type": "object" }, "UpdateProviderRequest": { - "type": "object", "properties": { "config": {}, "enabled": { @@ -39706,15 +40280,10 @@ "null" ] } - } + }, + "type": "object" }, "UpdateRouteRequest": { - "type": "object", - "required": [ - "host", - "port", - "enabled" - ], "properties": { "enabled": { "type": "boolean" @@ -39723,138 +40292,143 @@ "type": "string" }, "port": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "route_type": { + "description": "Route type: \"http\" (default) matches on HTTP Host header,\n\"tls\" matches on TLS SNI hostname for TCP passthrough", "type": [ "string", "null" - ], - "description": "Route type: \"http\" (default) matches on HTTP Host header,\n\"tls\" matches on TLS SNI hostname for TCP passthrough" + ] } - } + }, + "required": [ + "host", + "port", + "enabled" + ], + "type": "object" }, "UpdateS3SourceRequest": { - "type": "object", "properties": { "access_key_id": { + "description": "Optional new access key ID", + "example": "AKIAXXXXXXXXXXXXXXXX", "type": [ "string", "null" - ], - "description": "Optional new access key ID", - "example": "AKIAXXXXXXXXXXXXXXXX" + ] }, "bucket_name": { + "description": "Optional new bucket name", "type": [ "string", "null" - ], - "description": "Optional new bucket name" + ] }, "bucket_path": { + "description": "Optional new bucket path", "type": [ "string", "null" - ], - "description": "Optional new bucket path" + ] }, "endpoint": { + "description": "Optional new endpoint URL for S3-compatible services", + "example": "http://minio.example.com:9000", "type": [ "string", "null" - ], - "description": "Optional new endpoint URL for S3-compatible services", - "example": "http://minio.example.com:9000" + ] }, "force_path_style": { + "description": "Optional new path-style addressing setting", + "example": true, "type": [ "boolean", "null" - ], - "description": "Optional new path-style addressing setting", - "example": true + ] }, "name": { + "description": "Optional new name for the source", "type": [ "string", "null" - ], - "description": "Optional new name for the source" + ] }, "region": { + "description": "Optional new region", "type": [ "string", "null" - ], - "description": "Optional new region" + ] }, "secret_key": { + "description": "Optional new secret key", "type": [ "string", "null" - ], - "description": "Optional new secret key" + ] } - } + }, + "type": "object" }, "UpdateSecretBody": { - "type": "object", - "required": [ - "signing_secret" - ], "properties": { "signing_secret": { - "type": "string", - "description": "New signing secret from the provider's dashboard. Encrypted at\nrest; never returned in any API response." + "description": "New signing secret from the provider's dashboard. Encrypted at\nrest; never returned in any API response.", + "type": "string" } - } + }, + "required": [ + "signing_secret" + ], + "type": "object" }, "UpdateSelfRequest": { - "type": "object", "properties": { "email": { + "example": "john.doe@example.com", "type": [ "string", "null" - ], - "example": "john.doe@example.com" + ] }, "name": { + "example": "John Doe", "type": [ "string", "null" - ], - "example": "John Doe" + ] } - } + }, + "type": "object" }, "UpdateSessionDurationRequest": { - "type": "object", - "required": [ - "duration" - ], "properties": { "duration": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "UpdateSessionDurationResponse": { - "type": "object", + }, "required": [ - "message" + "duration" ], + "type": "object" + }, + "UpdateSessionDurationResponse": { "properties": { "message": { "type": "string" } - } + }, + "required": [ + "message" + ], + "type": "object" }, "UpdateSkillRequest": { - "type": "object", "properties": { "content": { "type": [ @@ -39874,13 +40448,10 @@ "null" ] } - } + }, + "type": "object" }, "UpdateSlackProviderRequest": { - "type": "object", - "required": [ - "config" - ], "properties": { "config": { "$ref": "#/components/schemas/SlackConfig" @@ -39897,85 +40468,88 @@ "null" ] } - } + }, + "required": [ + "config" + ], + "type": "object" }, "UpdateSpeedMetricsPayload": { - "type": "object", "description": "Update speed metrics payload for late-loading metrics", "properties": { "cls": { + "description": "Cumulative Layout Shift (score)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Cumulative Layout Shift (score)" + ] }, "inp": { + "description": "Interaction to Next Paint (milliseconds)", + "format": "float", "type": [ "number", "null" - ], - "format": "float", - "description": "Interaction to Next Paint (milliseconds)" + ] } - } + }, + "type": "object" }, "UpdateStatusResponse": { - "type": "object", "description": "Result of the background release-update check, driving the web console's\nupgrade banner. All optional fields are set together iff\n`update_available` is true.", - "required": [ - "update_available", - "docs_url" - ], "properties": { "channel": { + "description": "Channel the install tracks: `stable` or `beta`.", "type": [ "string", "null" - ], - "description": "Channel the install tracks: `stable` or `beta`." + ] }, "checked_at": { + "description": "When the check that found the update ran (ISO 8601, UTC).", "type": [ "string", "null" - ], - "description": "When the check that found the update ran (ISO 8601, UTC)." + ] }, "current_version": { + "description": "Version tag of the running binary, e.g. `v0.1.0-beta.45`.", "type": [ "string", "null" - ], - "description": "Version tag of the running binary, e.g. `v0.1.0-beta.45`." + ] }, "docs_url": { - "type": "string", - "description": "Docs page with upgrade instructions. Always present so the UI links\nthe same page regardless of update state." + "description": "Docs page with upgrade instructions. Always present so the UI links\nthe same page regardless of update state.", + "type": "string" }, "latest_version": { + "description": "Newest published tag on this install's channel.", "type": [ "string", "null" - ], - "description": "Newest published tag on this install's channel." + ] }, "release_url": { + "description": "Release-notes page (GitHub release) for the newer version.", "type": [ "string", "null" - ], - "description": "Release-notes page (GitHub release) for the newer version." + ] }, "update_available": { - "type": "boolean", - "description": "True when a newer release than the running binary has been published\non this install's channel." + "description": "True when a newer release than the running binary has been published\non this install's channel.", + "type": "boolean" } - } + }, + "required": [ + "update_available", + "docs_url" + ], + "type": "object" }, "UpdateTeamRequest": { - "type": "object", "properties": { "description": { "type": [ @@ -39989,13 +40563,10 @@ "null" ] } - } + }, + "type": "object" }, "UpdateTokenRequest": { - "type": "object", - "required": [ - "access_token" - ], "properties": { "access_token": { "type": "string" @@ -40006,19 +40577,17 @@ "null" ] } - } - }, - "UpdateTokenResponse": { - "type": "object", + }, "required": [ - "connection_id", - "message", - "is_active" + "access_token" ], + "type": "object" + }, + "UpdateTokenResponse": { "properties": { "connection_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_active": { "type": "boolean" @@ -40026,32 +40595,34 @@ "message": { "type": "string" } - } + }, + "required": [ + "connection_id", + "message", + "is_active" + ], + "type": "object" }, "UpdateUserRequest": { - "type": "object", "properties": { "email": { + "example": "john.doe@example.com", "type": [ "string", "null" - ], - "example": "john.doe@example.com" + ] }, "name": { + "example": "John Doe", "type": [ "string", "null" - ], - "example": "John Doe" + ] } - } + }, + "type": "object" }, "UpdateWebhookProviderRequest": { - "type": "object", - "required": [ - "config" - ], "properties": { "config": { "$ref": "#/components/schemas/WebhookConfig" @@ -40068,78 +40639,81 @@ "null" ] } - } + }, + "required": [ + "config" + ], + "type": "object" }, "UpdateWebhookRequestBody": { - "type": "object", "properties": { "enabled": { + "description": "Whether the webhook is enabled", "type": [ "boolean", "null" - ], - "description": "Whether the webhook is enabled" + ] }, "events": { - "type": [ - "array", - "null" - ], + "description": "Event types to subscribe to", "items": { "type": "string" }, - "description": "Event types to subscribe to" + "type": [ + "array", + "null" + ] }, "secret": { + "description": "Secret for HMAC signature verification", "type": [ "string", "null" - ], - "description": "Secret for HMAC signature verification" + ] }, "url": { + "description": "Target URL for webhook delivery", "type": [ "string", "null" - ], - "description": "Target URL for webhook delivery" + ] } - } + }, + "type": "object" }, "UpgradeExternalServiceRequest": { - "type": "object", - "required": [ - "docker_image" - ], "properties": { "docker_image": { - "type": "string", "description": "Docker image to upgrade to (e.g., \"gotempsh/postgres-walg:18-bookworm\")\nThis will trigger pg_upgrade for PostgreSQL or equivalent upgrade procedures for other services", - "example": "gotempsh/postgres-walg:18-bookworm" + "example": "gotempsh/postgres-walg:18-bookworm", + "type": "string" } - } - }, - "UpgradeRequest": { - "type": "object", + }, "required": [ - "image" + "docker_image" ], + "type": "object" + }, + "UpgradeRequest": { "properties": { "image": { - "type": "string", - "description": "Image reference to pull and run (e.g.\n`ghcr.io/gotempsh/temps-preview-gateway:latest`). Empty resets to default." + "description": "Image reference to pull and run (e.g.\n`ghcr.io/gotempsh/temps-preview-gateway:latest`). Empty resets to default.", + "type": "string" } - } + }, + "required": [ + "image" + ], + "type": "object" }, "UpsertAgentRequest": { - "type": "object", "properties": { "ai_model": { + "description": "Preferred model identifier for the CLI. `Some(\"\")` clears the stored value.", "type": [ "string", "null" - ], - "description": "Preferred model identifier for the CLI. `Some(\"\")` clears the stored value." + ] }, "ai_provider": { "type": [ @@ -40148,18 +40722,18 @@ ] }, "ai_provider_key_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "api_key": { + "description": "Plain-text API key — will be encrypted before storage", "type": [ "string", "null" - ], - "description": "Plain-text API key \u2014 will be encrypted before storage" + ] }, "branch_prefix": { "type": [ @@ -40168,32 +40742,32 @@ ] }, "config_repo_branch": { + "description": "Branch of the config repo to use (default: \"main\").", "type": [ "string", "null" - ], - "description": "Branch of the config repo to use (default: \"main\")." + ] }, "config_repo_url": { + "description": "Private config repo containing .claude/ directory (skills, MCP, plugins).", "type": [ "string", "null" - ], - "description": "Private config repo containing .claude/ directory (skills, MCP, plugins)." + ] }, "cooldown_minutes": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "daily_budget_cents": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "deliverable": { "type": [ @@ -40214,11 +40788,11 @@ ] }, "max_turns": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "mcp_servers_config": { "description": "MCP servers config (Claude Code settings.json mcpServers format).\nCredential-bearing legacy inline objects are write-only: normal reads\nmask them, and updates must omit this field to preserve existing values." @@ -40251,11 +40825,11 @@ ] }, "timeout_seconds": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "tools_config": { "description": "Tools config as JSON array. Custom-tool webhook URLs and headers are\nwrite-only; omit this field on update to preserve them." @@ -40263,14 +40837,10 @@ "trigger_config": { "description": "Trigger configuration JSON: { \"error\": { \"new_issue\": true, \"regression\": true }, \"manual\": true }" } - } + }, + "type": "object" }, "UpsertSecretRequest": { - "type": "object", - "required": [ - "name", - "value" - ], "properties": { "description": { "type": [ @@ -40279,30 +40849,30 @@ ] }, "mount_path": { + "description": "Required for \"file\" type secrets — absolute path inside the sandbox", "type": [ "string", "null" - ], - "description": "Required for \"file\" type secrets \u2014 absolute path inside the sandbox" + ] }, "name": { "type": "string" }, "secret_type": { - "type": "string", - "description": "\"env\" (environment variable) or \"file\" (written to mount_path)" + "description": "\"env\" (environment variable) or \"file\" (written to mount_path)", + "type": "string" }, "value": { "type": "string" } - } - }, - "UptimeDataPoint": { - "type": "object", + }, "required": [ - "timestamp", - "status" + "name", + "value" ], + "type": "object" + }, + "UptimeDataPoint": { "properties": { "error_message": { "type": [ @@ -40311,42 +40881,46 @@ ] }, "response_time_ms": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "status": { "type": "string" }, "timestamp": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "UptimeHistoryResponse": { - "type": "object", + }, "required": [ - "monitor_id", - "uptime_data" + "timestamp", + "status" ], + "type": "object" + }, + "UptimeHistoryResponse": { "properties": { "monitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "uptime_data": { - "type": "array", "items": { "$ref": "#/components/schemas/UptimeDataPoint" - } + }, + "type": "array" } - } + }, + "required": [ + "monitor_id", + "uptime_data" + ], + "type": "object" }, "UsageFilter": { - "type": "object", "description": "Filters for querying AI usage data.\n\nCost bounds are expressed in microcents (the unit stored in\n`estimated_cost_microcents`). At most one of `gte`/`gt` and one of\n`lte`/`lt` is meaningful per query; if both are set the stricter wins\nnaturally because they are ANDead together.", "properties": { "conversation_id": { @@ -40356,36 +40930,36 @@ ] }, "cost_gt": { + "description": "Cost strictly greater-than, in microcents.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost strictly greater-than, in microcents." + ] }, "cost_gte": { + "description": "Cost greater-than-or-equal, in microcents.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost greater-than-or-equal, in microcents." + ] }, "cost_lt": { + "description": "Cost strictly less-than, in microcents.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost strictly less-than, in microcents." + ] }, "cost_lte": { + "description": "Cost less-than-or-equal, in microcents.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Cost less-than-or-equal, in microcents." + ] }, "model": { "type": [ @@ -40400,99 +40974,85 @@ ] }, "status": { + "description": "Filter by HTTP status code (exact match).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by HTTP status code (exact match)." + ] }, "tags": { + "description": "Comma-separated tags to filter by (AND logic).", "type": [ "string", "null" - ], - "description": "Comma-separated tags to filter by (AND logic)." + ] }, "tokens_gt": { + "description": "Total tokens (input + output) strictly greater-than.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) strictly greater-than." + ] }, "tokens_gte": { + "description": "Total tokens (input + output) greater-than-or-equal.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) greater-than-or-equal." + ] }, "tokens_lt": { + "description": "Total tokens (input + output) strictly less-than.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) strictly less-than." + ] }, "tokens_lte": { + "description": "Total tokens (input + output) less-than-or-equal.", + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64", - "description": "Total tokens (input + output) less-than-or-equal." + ] }, "user_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } - } + }, + "type": "object" }, "UsageInfo": { - "type": "object", - "required": [ - "prompt_tokens", - "completion_tokens", - "total_tokens" - ], "properties": { "completion_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "prompt_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "UsageLogEntry": { - "type": "object", + }, "required": [ - "id", - "timestamp", - "provider", - "model", - "input_tokens", - "output_tokens", - "latency_ms", - "estimated_cost_microcents", - "status", - "is_streaming", - "is_byok", - "tags" + "prompt_tokens", + "completion_tokens", + "total_tokens" ], + "type": "object" + }, + "UsageLogEntry": { "properties": { "conversation_id": { "type": [ @@ -40501,16 +41061,16 @@ ] }, "estimated_cost_microcents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "id": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "is_byok": { "type": "boolean" @@ -40519,15 +41079,15 @@ "type": "boolean" }, "latency_ms": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "model": { "type": "string" }, "output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "provider": { "type": "string" @@ -40539,14 +41099,14 @@ ] }, "status": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "tags": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "timestamp": { "type": "string" @@ -40557,156 +41117,162 @@ "null" ] } - } + }, + "required": [ + "id", + "timestamp", + "provider", + "model", + "input_tokens", + "output_tokens", + "latency_ms", + "estimated_cost_microcents", + "status", + "is_streaming", + "is_byok", + "tags" + ], + "type": "object" }, "UsageLogPage": { - "type": "object", "description": "A page of recent usage log entries plus the total count for pagination.", - "required": [ - "entries", - "total" - ], "properties": { "entries": { - "type": "array", + "description": "The usage log entries for the requested page.", "items": { "$ref": "#/components/schemas/UsageLogEntry" }, - "description": "The usage log entries for the requested page." + "type": "array" }, "total": { - "type": "integer", + "description": "Total number of entries matching the filter (across all pages).", "format": "int64", - "description": "Total number of entries matching the filter (across all pages)." + "type": "integer" } - } + }, + "required": [ + "entries", + "total" + ], + "type": "object" }, "UsageQueryParams": { - "type": "object", "properties": { "conversation_id": { + "description": "Filter by conversation ID", "type": [ "string", "null" - ], - "description": "Filter by conversation ID" + ] }, "from": { + "description": "ISO 8601 start time (defaults to 24h ago)", "type": [ "string", "null" - ], - "description": "ISO 8601 start time (defaults to 24h ago)" + ] }, "model": { + "description": "Filter by model name", "type": [ "string", "null" - ], - "description": "Filter by model name" + ] }, "provider": { + "description": "Filter by provider name", "type": [ "string", "null" - ], - "description": "Filter by provider name" + ] }, "tags": { + "description": "Filter by tags (comma-separated, AND logic)", "type": [ "string", "null" - ], - "description": "Filter by tags (comma-separated, AND logic)" + ] }, "to": { + "description": "ISO 8601 end time (defaults to now)", "type": [ "string", "null" - ], - "description": "ISO 8601 end time (defaults to now)" + ] }, "user_id": { + "description": "Filter by user ID", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Filter by user ID" + ] } - } + }, + "type": "object" }, "UsageSource": { - "type": "string", "description": "How the \"actual usage\" numbers were obtained", "enum": [ "metrics-api", "requests-only", "unavailable" - ] + ], + "type": "string" }, "UsageSummary": { - "type": "object", - "required": [ - "total_requests", - "total_input_tokens", - "total_output_tokens", - "total_tokens", - "avg_latency_ms", - "total_cost_microcents", - "error_count", - "streaming_count", - "byok_count" - ], "properties": { "avg_latency_ms": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "byok_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "error_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "streaming_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_cost_microcents": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_input_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_output_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_requests": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_tokens": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "UserResponse": { - "type": "object", + }, "required": [ - "id", - "username", - "name", - "avatar_url", - "mfa_enabled", - "role" + "total_requests", + "total_input_tokens", + "total_output_tokens", + "total_tokens", + "avg_latency_ms", + "total_cost_microcents", + "error_count", + "streaming_count", + "byok_count" ], + "type": "object" + }, + "UserResponse": { "properties": { "avatar_url": { "type": "string" @@ -40718,8 +41284,8 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "mfa_enabled": { "type": "boolean" @@ -40728,45 +41294,45 @@ "type": "string" }, "role": { - "type": "string", - "description": "User's role (e.g., \"admin\", \"user\", \"demo\")" + "description": "User's role (e.g., \"admin\", \"user\", \"demo\")", + "type": "string" }, "username": { "type": "string" } - } + }, + "required": [ + "id", + "username", + "name", + "avatar_url", + "mfa_enabled", + "role" + ], + "type": "object" }, "ValidateEmailRequest": { - "type": "object", + "additionalProperties": false, "description": "Request body for validating an email address", - "required": [ - "email" - ], "properties": { "email": { - "type": "string", "description": "Email address to validate", - "example": "someone@gmail.com" + "example": "someone@gmail.com", + "type": "string" } }, - "additionalProperties": false + "required": [ + "email" + ], + "type": "object" }, "ValidateEmailResponse": { - "type": "object", "description": "Complete email validation response", - "required": [ - "email", - "is_reachable", - "syntax", - "mx", - "misc", - "smtp" - ], "properties": { "email": { - "type": "string", "description": "The email address that was validated", - "example": "someone@gmail.com" + "example": "someone@gmail.com", + "type": "string" }, "is_reachable": { "$ref": "#/components/schemas/ReachabilityStatus", @@ -40788,55 +41354,58 @@ "$ref": "#/components/schemas/SyntaxResult", "description": "Syntax validation result" } - } + }, + "required": [ + "email", + "is_reachable", + "syntax", + "mx", + "misc", + "smtp" + ], + "type": "object" }, "ValidationLevel": { - "type": "string", "description": "Validation severity level", "enum": [ "info", "warning", "error", "critical" - ] + ], + "type": "string" }, "ValidationReport": { - "type": "object", "description": "Complete validation report", - "required": [ - "results", - "overall_status", - "summary" - ], "properties": { "overall_status": { "$ref": "#/components/schemas/ValidationStatus", "description": "Overall status" }, "results": { - "type": "array", + "description": "All validation results", "items": { "$ref": "#/components/schemas/ValidationResult" }, - "description": "All validation results" + "type": "array" }, "summary": { "$ref": "#/components/schemas/ValidationSummary", "description": "Summary statistics" } - } - }, - "ValidationResponse": { - "type": "object", + }, "required": [ - "connection_id", - "is_valid", - "message" + "results", + "overall_status", + "summary" ], + "type": "object" + }, + "ValidationResponse": { "properties": { "connection_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "is_valid": { "type": "boolean" @@ -40844,254 +41413,250 @@ "message": { "type": "string" } - } + }, + "required": [ + "connection_id", + "is_valid", + "message" + ], + "type": "object" }, "ValidationResult": { - "type": "object", "description": "Result of a validation check", - "required": [ - "rule_id", - "rule_name", - "level", - "passed", - "message", - "affected_resources" - ], "properties": { "affected_resources": { - "type": "array", + "description": "Affected resources/fields", "items": { "type": "string" }, - "description": "Affected resources/fields" + "type": "array" }, "level": { "$ref": "#/components/schemas/ValidationLevel", "description": "Validation level" }, "message": { - "type": "string", - "description": "Message describing the result" + "description": "Message describing the result", + "type": "string" }, "passed": { - "type": "boolean", - "description": "Whether the validation passed" + "description": "Whether the validation passed", + "type": "boolean" }, "remediation": { + "description": "Suggested remediation (if failed)", "type": [ "string", "null" - ], - "description": "Suggested remediation (if failed)" + ] }, "rule_id": { - "type": "string", - "description": "Rule that was checked" + "description": "Rule that was checked", + "type": "string" }, "rule_name": { - "type": "string", - "description": "Human-readable rule name" + "description": "Human-readable rule name", + "type": "string" } - } + }, + "required": [ + "rule_id", + "rule_name", + "level", + "passed", + "message", + "affected_resources" + ], + "type": "object" }, "ValidationStatus": { - "type": "string", "description": "Overall validation status", "enum": [ "passed", "passed-with-warnings", "failed-with-warnings", "failed" - ] + ], + "type": "string" }, "ValidationSummary": { - "type": "object", "description": "Validation summary statistics", - "required": [ - "total_count", - "passed_count", - "failed_count", - "info_count", - "warning_count", - "error_count", - "critical_count" - ], "properties": { "critical_count": { - "type": "integer", "description": "Critical-level results", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "error_count": { - "type": "integer", "description": "Error-level results", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "failed_count": { - "type": "integer", "description": "Validations that failed", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "info_count": { - "type": "integer", "description": "Info-level results", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "passed_count": { - "type": "integer", "description": "Validations that passed", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "total_count": { - "type": "integer", "description": "Total validations run", - "minimum": 0 + "minimum": 0, + "type": "integer" }, "warning_count": { - "type": "integer", "description": "Warning-level results", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "VerifyMfaRequest": { - "type": "object", + }, "required": [ - "code" + "total_count", + "passed_count", + "failed_count", + "info_count", + "warning_count", + "error_count", + "critical_count" ], + "type": "object" + }, + "VerifyMfaRequest": { "properties": { "code": { "type": "string" } - } - }, - "VerifyStepUpRequest": { - "type": "object", + }, "required": [ "code" ], + "type": "object" + }, + "VerifyStepUpRequest": { "properties": { "code": { - "type": "string", - "description": "Current TOTP value or an unused recovery code." + "description": "Current TOTP value or an unused recovery code.", + "type": "string" } - } - }, - "ViewItem": { - "type": "object", + }, "required": [ - "label", - "value" + "code" ], + "type": "object" + }, + "ViewItem": { "properties": { "label": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "value": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - "ViewsOverTime": { - "type": "object", + }, "required": [ - "items", - "metric", - "present_index" + "label", + "value" ], + "type": "object" + }, + "ViewsOverTime": { "properties": { "comparison_labels": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "comparison_plot": { + "items": { + "format": "int64", + "type": "integer" + }, "type": [ "array", "null" - ], - "items": { - "type": "integer", - "format": "int64" - } + ] }, "full_intervals": { + "items": { + "type": "string" + }, "type": [ "array", "null" - ], - "items": { - "type": "string" - } + ] }, "items": { - "type": "array", "items": { "$ref": "#/components/schemas/ViewItem" - } + }, + "type": "array" }, "metric": { "type": "string" }, "present_index": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } - }, - "ViewsOverTimeQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "items", + "metric", + "present_index" ], + "type": "object" + }, + "ViewsOverTimeQuery": { "properties": { "deployment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "VisitorDetails": { - "type": "object", + }, "required": [ - "id", - "visitor_id", - "project_id", - "environment_id", - "first_seen", - "last_seen", - "is_crawler" + "start_date", + "end_date", + "project_id" ], + "type": "object" + }, + "VisitorDetails": { "properties": { "city": { "type": [ @@ -41119,38 +41684,38 @@ }, "custom_data": {}, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "first_channel": { + "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")", "type": [ "string", "null" - ], - "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")" + ] }, "first_referrer": { + "description": "Full referrer URL from the visitor's first session", "type": [ "string", "null" - ], - "description": "Full referrer URL from the visitor's first session" + ] }, "first_referrer_hostname": { + "description": "Hostname extracted from first_referrer", "type": [ "string", "null" - ], - "description": "Hostname extracted from first_referrer" + ] }, "first_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_address": { "type": [ @@ -41159,11 +41724,11 @@ ] }, "ip_address_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "is_crawler": { "type": "boolean" @@ -41175,27 +41740,27 @@ ] }, "last_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "latitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "longitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "region": { "type": [ @@ -41218,76 +41783,86 @@ "visitor_id": { "type": "string" } - } - }, - "VisitorFacetValue": { - "type": "object", - "description": "A single facet value with its visitor count. Used to populate filter\ndropdowns on the visitors page (e.g. \"Germany \u2014 1,234 visitors\").", + }, "required": [ - "value", - "count" + "id", + "visitor_id", + "project_id", + "environment_id", + "first_seen", + "last_seen", + "is_crawler" ], + "type": "object" + }, + "VisitorFacetValue": { + "description": "A single facet value with its visitor count. Used to populate filter\ndropdowns on the visitors page (e.g. \"Germany — 1,234 visitors\").", "properties": { "code": { + "description": "Optional secondary code for the value. Currently only populated for\nthe `country` facet, where it carries the 2-letter ISO country code\nso the UI can render a flag without re-mapping.", "type": [ "string", "null" - ], - "description": "Optional secondary code for the value. Currently only populated for\nthe `country` facet, where it carries the 2-letter ISO country code\nso the UI can render a flag without re-mapping." + ] }, "count": { - "type": "integer", + "description": "Distinct visitor count matching this value in the current segment.", "format": "int64", - "description": "Distinct visitor count matching this value in the current segment." + "type": "integer" }, "value": { - "type": "string", - "description": "The dimension value (e.g. \"United States\", \"Chrome\", \"google.com\").\n`None` is encoded as the literal string \"Direct\" for referrer and as\nthe empty string for the rest." + "description": "The dimension value (e.g. \"United States\", \"Chrome\", \"google.com\").\n`None` is encoded as the literal string \"Direct\" for referrer and as\nthe empty string for the rest.", + "type": "string" } - } + }, + "required": [ + "value", + "count" + ], + "type": "object" }, "VisitorFacets": { - "type": "object", "description": "All filter dropdown contents in one response. Each list is the top N\nvalues for that dimension within the current date range and segment\n(excluding the dimension being queried so the dropdown still shows\nalternatives when a value is already selected).", - "required": [ - "country", - "region", - "city", - "channel", - "referrer" - ], "properties": { "channel": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorFacetValue" - } + }, + "type": "array" }, "city": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorFacetValue" - } + }, + "type": "array" }, "country": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorFacetValue" - } + }, + "type": "array" }, "referrer": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorFacetValue" - } + }, + "type": "array" }, "region": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorFacetValue" - } + }, + "type": "array" } - } + }, + "required": [ + "country", + "region", + "city", + "channel", + "referrer" + ], + "type": "object" }, "VisitorFacetsQuery": { "allOf": [ @@ -41295,23 +41870,17 @@ "$ref": "#/components/schemas/VisitorSegmentFilters" }, { - "type": "object", - "required": [ - "start_date", - "end_date", - "project_id" - ], "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "has_activity_only": { "type": [ @@ -41326,37 +41895,33 @@ ] }, "per_facet_limit": { + "description": "Maximum number of values returned per dimension (default: 50, max: 200).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Maximum number of values returned per dimension (default: 50, max: 200)." + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" } ], - "description": "Query parameters for the visitor-facets endpoint. Mirrors the shape of\n`VisitorsListQuery` so the same segment filters apply \u2014 facet counts are\nalways computed against the *currently filtered* visitor pool, minus the\ndimension being aggregated." + "description": "Query parameters for the visitor-facets endpoint. Mirrors the shape of\n`VisitorsListQuery` so the same segment filters apply — facet counts are\nalways computed against the *currently filtered* visitor pool, minus the\ndimension being aggregated." }, "VisitorInfo": { - "type": "object", - "required": [ - "id", - "visitor_id", - "project_id", - "environment_id", - "first_seen", - "last_seen", - "is_crawler" - ], "properties": { "city": { "type": [ @@ -41383,46 +41948,46 @@ ] }, "current_page": { + "description": "Most recent page path visited by this visitor", "type": [ "string", "null" - ], - "description": "Most recent page path visited by this visitor" + ] }, "custom_data": {}, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "first_channel": { + "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")", "type": [ "string", "null" - ], - "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")" + ] }, "first_referrer": { + "description": "Full referrer URL from the visitor's first session", "type": [ "string", "null" - ], - "description": "Full referrer URL from the visitor's first session" + ] }, "first_referrer_hostname": { + "description": "Hostname extracted from first_referrer", "type": [ "string", "null" - ], - "description": "Hostname extracted from first_referrer" + ] }, "first_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_address": { "type": [ @@ -41431,11 +41996,11 @@ ] }, "ip_address_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "is_crawler": { "type": "boolean" @@ -41447,27 +42012,27 @@ ] }, "last_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "latitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "longitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "region": { "type": [ @@ -41490,79 +42055,83 @@ "visitor_id": { "type": "string" } - } - }, - "VisitorJourneyQuery": { - "type": "object", + }, "required": [ - "project_id" + "id", + "visitor_id", + "project_id", + "environment_id", + "first_seen", + "last_seen", + "is_crawler" ], + "type": "object" + }, + "VisitorJourneyQuery": { "properties": { "limit_sessions": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } + }, + "required": [ + "project_id" + ], + "type": "object" }, "VisitorJourneyResponse": { - "type": "object", "description": "Complete visitor journey response", - "required": [ - "visitor_id", - "total_sessions", - "total_events", - "sessions" - ], "properties": { "sessions": { - "type": "array", + "description": "Sessions with their events, ordered newest first", "items": { "$ref": "#/components/schemas/JourneySession" }, - "description": "Sessions with their events, ordered newest first" + "type": "array" }, "total_events": { - "type": "integer", + "description": "Total number of events across all sessions", "format": "int64", - "description": "Total number of events across all sessions" + "type": "integer" }, "total_sessions": { - "type": "integer", + "description": "Total number of sessions", "format": "int64", - "description": "Total number of sessions" + "type": "integer" }, "visitor_id": { - "type": "integer", + "description": "Visitor internal ID", "format": "int32", - "description": "Visitor internal ID" + "type": "integer" } - } - }, - "VisitorLocationsQuery": { - "type": "object", + }, "required": [ - "start_date", - "end_date", - "project_id" + "visitor_id", + "total_sessions", + "total_events", + "sessions" ], + "type": "object" + }, + "VisitorLocationsQuery": { "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "granularity": { "oneOf": [ @@ -41575,233 +42144,229 @@ ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } - }, - "VisitorRecord": { - "type": "object", + }, "required": [ - "id", - "visitor_id", - "project_id", - "created_at" + "start_date", + "end_date", + "project_id" ], + "type": "object" + }, + "VisitorRecord": { "properties": { "created_at": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "custom_data": {}, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "visitor_id": { "type": "string" } - } + }, + "required": [ + "id", + "visitor_id", + "project_id", + "created_at" + ], + "type": "object" }, "VisitorSegmentFilters": { - "type": "object", - "description": "Optional segment filters for [`VisitorsListQuery`]. Each filter narrows the\nresult set to visitors who match the given dimension value within the date\nrange. All filters resolve against `visitor` / `ip_geolocations` \u2014 by\ndesign we never touch the events hypertable here so filtering stays fast\nregardless of event volume.", + "description": "Optional segment filters for [`VisitorsListQuery`]. Each filter narrows the\nresult set to visitors who match the given dimension value within the date\nrange. All filters resolve against `visitor` / `ip_geolocations` — by\ndesign we never touch the events hypertable here so filtering stays fast\nregardless of event volume.", "properties": { "filter_channel": { + "description": "First-touch marketing channel (matches `visitor.first_channel`)", "type": [ "string", "null" - ], - "description": "First-touch marketing channel (matches `visitor.first_channel`)" + ] }, "filter_city": { + "description": "Geolocation city (matches `ip_geolocations.city`)", "type": [ "string", "null" - ], - "description": "Geolocation city (matches `ip_geolocations.city`)" + ] }, "filter_country": { + "description": "Geolocation country (matches `ip_geolocations.country`)", "type": [ "string", "null" - ], - "description": "Geolocation country (matches `ip_geolocations.country`)" + ] }, "filter_referrer": { + "description": "First-touch referrer hostname (matches `visitor.first_referrer_hostname`)", "type": [ "string", "null" - ], - "description": "First-touch referrer hostname (matches `visitor.first_referrer_hostname`)" + ] }, "filter_region": { + "description": "Geolocation region (matches `ip_geolocations.region`)", "type": [ "string", "null" - ], - "description": "Geolocation region (matches `ip_geolocations.region`)" + ] } - } + }, + "type": "object" }, "VisitorSessionsQuery": { - "type": "object", - "required": [ - "project_id" - ], "properties": { "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "VisitorSessionsResponse": { - "type": "object", + }, "required": [ - "visitor_id", - "sessions", - "total_sessions" + "project_id" ], + "type": "object" + }, + "VisitorSessionsResponse": { "properties": { "sessions": { - "type": "array", "items": { "$ref": "#/components/schemas/SessionSummary" - } + }, + "type": "array" }, "total_sessions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "visitor_id": { "type": "string" } - } - }, - "VisitorStats": { - "type": "object", + }, "required": [ "visitor_id", - "first_seen", - "last_seen", - "total_sessions", - "total_page_views", - "total_events", - "average_session_duration", - "bounce_rate", - "engagement_rate", - "top_pages", - "top_referrers", - "devices_used", - "locations" + "sessions", + "total_sessions" ], + "type": "object" + }, + "VisitorStats": { "properties": { "average_session_duration": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "bounce_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "devices_used": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "engagement_rate": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "first_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "last_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "locations": { - "type": "array", "items": { "$ref": "#/components/schemas/LocationInfo" - } + }, + "type": "array" }, "top_pages": { - "type": "array", "items": { "$ref": "#/components/schemas/PageVisit" - } + }, + "type": "array" }, "top_referrers": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "total_events": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_page_views": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_sessions": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "visitor_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "VisitorWithGeolocation": { - "type": "object", + }, "required": [ - "id", "visitor_id", - "project_id", - "environment_id", "first_seen", "last_seen", - "is_crawler" + "total_sessions", + "total_page_views", + "total_events", + "average_session_duration", + "bounce_rate", + "engagement_rate", + "top_pages", + "top_referrers", + "devices_used", + "locations" ], + "type": "object" + }, + "VisitorWithGeolocation": { "properties": { "city": { "type": [ @@ -41829,38 +42394,38 @@ }, "custom_data": {}, "environment_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "first_channel": { + "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")", "type": [ "string", "null" - ], - "description": "Marketing channel from the first visit (e.g. \"Organic Search\", \"Direct\")" + ] }, "first_referrer": { + "description": "Full referrer URL from the visitor's first session", "type": [ "string", "null" - ], - "description": "Full referrer URL from the visitor's first session" + ] }, "first_referrer_hostname": { + "description": "Hostname extracted from first_referrer", "type": [ "string", "null" - ], - "description": "Hostname extracted from first_referrer" + ] }, "first_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "ip_address": { "type": [ @@ -41878,27 +42443,27 @@ ] }, "last_seen": { - "type": "string", + "example": "2024-01-01T00:00:00", "format": "date-time", - "example": "2024-01-01T00:00:00" + "type": "string" }, "latitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "longitude": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "region": { "type": [ @@ -41921,7 +42486,17 @@ "visitor_id": { "type": "string" } - } + }, + "required": [ + "id", + "visitor_id", + "project_id", + "environment_id", + "first_seen", + "last_seen", + "is_crawler" + ], + "type": "object" }, "VisitorsListQuery": { "allOf": [ @@ -41929,30 +42504,24 @@ "$ref": "#/components/schemas/VisitorSegmentFilters" }, { - "type": "object", - "required": [ - "start_date", - "end_date", - "project_id" - ], "properties": { "end_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" }, "environment_id": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "has_activity_only": { + "description": "Filter to only include visitors with recorded activity (events/sessions).\nWhen true, excludes \"ghost\" visitors that have no events.", "type": [ "boolean", "null" - ], - "description": "Filter to only include visitors with recorded activity (events/sessions).\nWhen true, excludes \"ghost\" visitors that have no events." + ] }, "include_crawlers": { "type": [ @@ -41961,122 +42530,117 @@ ] }, "limit": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "offset": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "start_date": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } - } + }, + "required": [ + "start_date", + "end_date", + "project_id" + ], + "type": "object" } ] }, "VisitorsResponse": { - "type": "object", - "required": [ - "visitors", - "total_count", - "filtered_count" - ], "properties": { "filtered_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "total_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "visitors": { - "type": "array", "items": { "$ref": "#/components/schemas/VisitorInfo" - } + }, + "type": "array" } - } + }, + "required": [ + "visitors", + "total_count", + "filtered_count" + ], + "type": "object" }, "VolumeMount": { - "type": "object", "description": "Volume mount in deployment", - "required": [ - "source", - "destination", - "read_only", - "type" - ], "properties": { "destination": { - "type": "string", - "description": "Destination path in container" + "description": "Destination path in container", + "type": "string" }, "read_only": { - "type": "boolean", - "description": "Read-only flag" + "description": "Read-only flag", + "type": "boolean" }, "source": { - "type": "string", - "description": "Source (volume name or path)" + "description": "Source (volume name or path)", + "type": "string" }, "type": { "$ref": "#/components/schemas/VolumeType", "description": "Volume type" } - } + }, + "required": [ + "source", + "destination", + "read_only", + "type" + ], + "type": "object" }, "VolumeType": { - "type": "string", "description": "Volume type", "enum": [ "bind", "volume", "tmpfs" - ] + ], + "type": "string" }, "VulnerabilityResponse": { - "type": "object", - "required": [ - "id", - "scan_id", - "vulnerability_id", - "package_name", - "installed_version", - "severity", - "title", - "created_at" - ], "properties": { "class": { + "example": "os-pkgs", "type": [ "string", "null" - ], - "example": "os-pkgs" + ] }, "created_at": { - "type": "string", - "example": "2025-12-08T12:15:47.609192Z" + "example": "2025-12-08T12:15:47.609192Z", + "type": "string" }, "cvss_score": { + "format": "float", "type": [ "number", "null" - ], - "format": "float" + ] }, "description": { "type": [ @@ -42091,18 +42655,18 @@ ] }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "installed_version": { "type": "string" }, "last_modified_date": { + "example": "2025-12-08T12:15:47.609192Z", "type": [ "string", "null" - ], - "example": "2025-12-08T12:15:47.609192Z" + ] }, "package_name": { "type": "string" @@ -42114,235 +42678,235 @@ ] }, "published_date": { + "example": "2025-12-08T12:15:47.609192Z", "type": [ "string", "null" - ], - "example": "2025-12-08T12:15:47.609192Z" + ] }, "references": {}, "scan_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "severity": { "type": "string" }, "target": { + "example": "alpine:3.18 (alpine 3.18.0)", "type": [ "string", "null" - ], - "example": "alpine:3.18 (alpine 3.18.0)" + ] }, "title": { "type": "string" }, "type": { + "example": "alpine", "type": [ "string", "null" - ], - "example": "alpine" + ] }, "vulnerability_id": { "type": "string" } - } + }, + "required": [ + "id", + "scan_id", + "vulnerability_id", + "package_name", + "installed_version", + "severity", + "title", + "created_at" + ], + "type": "object" }, "WalWarning": { + "description": "One actionable warning surfaced to the UI.\n\nEach variant carries the data needed to render a remediation hint without\nthe frontend re-querying anything.", "oneOf": [ { - "type": "object", "description": "`pg_wal` is significantly larger than `max_wal_size`.", - "required": [ - "pg_wal_bytes", - "max_wal_size_bytes", - "ratio", - "kind" - ], "properties": { "kind": { - "type": "string", "enum": [ "wal_bloat" - ] + ], + "type": "string" }, "max_wal_size_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "pg_wal_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "ratio": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } - } - }, - { - "type": "object", - "description": "A replication slot is holding WAL it's not consuming.", + }, "required": [ - "slot_name", - "retained_bytes", - "active", + "pg_wal_bytes", + "max_wal_size_bytes", + "ratio", "kind" ], + "type": "object" + }, + { + "description": "A replication slot is holding WAL it's not consuming.", "properties": { "active": { "type": "boolean" }, "kind": { - "type": "string", "enum": [ "stale_slot" - ] + ], + "type": "string" }, "retained_bytes": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" }, "slot_name": { "type": "string" } - } - }, - { - "type": "object", - "description": "`archive_status/*.ready` count exceeds threshold \u2014 `archive_command`\nis either failing or running slower than WAL generation.", + }, "required": [ - "ready_count", + "slot_name", + "retained_bytes", + "active", "kind" ], + "type": "object" + }, + { + "description": "`archive_status/*.ready` count exceeds threshold — `archive_command`\nis either failing or running slower than WAL generation.", "properties": { "kind": { - "type": "string", "enum": [ "archive_backlog" - ] + ], + "type": "string" }, "ready_count": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } - }, - { - "type": "object", - "description": "`archive_mode = on` but `archive_command` is empty / `/bin/true`.\nWAL accumulates forever waiting for a destination that never accepts.", + }, "required": [ + "ready_count", "kind" ], + "type": "object" + }, + { + "description": "`archive_mode = on` but `archive_command` is empty / `/bin/true`.\nWAL accumulates forever waiting for a destination that never accepts.", "properties": { "kind": { - "type": "string", "enum": [ "archive_mode_without_command" - ] + ], + "type": "string" } - } - }, - { - "type": "object", - "description": "Oldest WAL segment is older than `WAL_NOT_RECYCLED_AGE_SECS`.\nIndependent signal: something is blocking recycling even if total\nsize hasn't exploded yet.", + }, "required": [ - "oldest_age_secs", "kind" ], + "type": "object" + }, + { + "description": "Oldest WAL segment is older than `WAL_NOT_RECYCLED_AGE_SECS`.\nIndependent signal: something is blocking recycling even if total\nsize hasn't exploded yet.", "properties": { "kind": { - "type": "string", "enum": [ "wal_not_recycled" - ] + ], + "type": "string" }, "oldest_age_secs": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "oldest_age_secs", + "kind" + ], + "type": "object" } - ], - "description": "One actionable warning surfaced to the UI.\n\nEach variant carries the data needed to render a remediation hint without\nthe frontend re-querying anything." + ] }, "WalWarningSeverity": { - "type": "string", "enum": [ "warning", "critical" - ] + ], + "type": "string" }, "WebhookConfig": { - "type": "object", "description": "Configuration for a generic webhook notification provider", - "required": [ - "url" - ], "properties": { "headers": { - "type": "object", - "description": "Custom headers to include in the request (e.g., for authentication tokens)", "additionalProperties": { "type": "string" }, - "propertyNames": { - "type": "string" - }, + "description": "Custom headers to include in the request (e.g., for authentication tokens)", "example": { "Authorization": "Bearer your-token", "X-Custom-Header": "custom-value" - } + }, + "propertyNames": { + "type": "string" + }, + "type": "object" }, "method": { - "type": "string", "description": "HTTP method to use (POST, PUT, PATCH). Defaults to POST.", - "example": "POST" + "example": "POST", + "type": "string" }, "timeout_secs": { - "type": "integer", - "format": "int64", "description": "Request timeout in seconds. Defaults to 30.", "example": 30, - "minimum": 0 + "format": "int64", + "minimum": 0, + "type": "integer" }, "url": { - "type": "string", "description": "The URL to send webhook requests to", - "example": "https://api.example.com/notifications" + "example": "https://api.example.com/notifications", + "type": "string" } - } - }, - "WebhookDeliveryResponse": { - "type": "object", + }, "required": [ - "id", - "webhook_id", - "event_type", - "event_id", - "payload", - "success", - "attempt_number", - "created_at" + "url" ], + "type": "object" + }, + "WebhookDeliveryResponse": { "properties": { "attempt_number": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "created_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "delivered_at": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] }, "error_message": { "type": [ @@ -42357,82 +42921,93 @@ "type": "string" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "payload": { - "type": "string", "description": "JSON payload that was sent to the webhook endpoint", "example": { - "event_type": "deployment.succeeded", "data": { "deployment_id": 123 - } - } + }, + "event_type": "deployment.succeeded" + }, + "type": "string" }, "status_code": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] }, "success": { "type": "boolean" }, "webhook_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } - } - }, - "WebhookResponse": { - "type": "object", + }, "required": [ "id", - "project_id", - "url", - "events", - "enabled", - "has_secret", - "created_at", - "updated_at" + "webhook_id", + "event_type", + "event_id", + "payload", + "success", + "attempt_number", + "created_at" ], + "type": "object" + }, + "WebhookResponse": { "properties": { "created_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "enabled": { "type": "boolean" }, "events": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "has_secret": { "type": "boolean" }, "id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "project_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "updated_at": { - "type": "string", + "example": "2025-10-12T12:15:47.609192Z", "format": "date-time", - "example": "2025-10-12T12:15:47.609192Z" + "type": "string" }, "url": { "type": "string" } - } + }, + "required": [ + "id", + "project_id", + "url", + "events", + "enabled", + "has_secret", + "created_at", + "updated_at" + ], + "type": "object" }, "WebhookTriggerRequest": { "allOf": [ @@ -42442,110 +43017,103 @@ ] }, "WebhookTriggerResponse": { - "type": "object", - "required": [ - "run_id", - "status" - ], "properties": { "run_id": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" }, "status": { "type": "string" } - } - }, - "WorkflowDryRunRequest": { - "type": "object", + }, "required": [ - "yaml" + "run_id", + "status" ], + "type": "object" + }, + "WorkflowDryRunRequest": { "properties": { "cpu_limit": { + "description": "Optional CPU override applied after parsing YAML (clamped server-side).\nWhen `Some`, this takes precedence over `cpu_limit` inside the YAML —\nlets the CLI pass `--cpu` without rewriting the YAML text.", + "format": "double", "type": [ "number", "null" - ], - "format": "double", - "description": "Optional CPU override applied after parsing YAML (clamped server-side).\nWhen `Some`, this takes precedence over `cpu_limit` inside the YAML \u2014\nlets the CLI pass `--cpu` without rewriting the YAML text." + ] }, "error_group_id": { + "description": "Optional error group to link this dry-run to. When set, the executor's\n`load_error_context` path injects `{{error_type}}` / `{{error_message}}`\n/ `{{stack_trace}}` into the prompt — same behaviour as a committed\nworkflow triggered with `trigger_source_type = \"error_group\"`. Must\nbelong to `project_id` (handler enforces).", + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32", - "description": "Optional error group to link this dry-run to. When set, the executor's\n`load_error_context` path injects `{{error_type}}` / `{{error_message}}`\n/ `{{stack_trace}}` into the prompt \u2014 same behaviour as a committed\nworkflow triggered with `trigger_source_type = \"error_group\"`. Must\nbelong to `project_id` (handler enforces)." + ] }, "memory_limit_mb": { + "description": "Optional memory override in MB (clamped server-side). Same precedence\nrule as `cpu_limit`.", + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "description": "Optional memory override in MB (clamped server-side). Same precedence\nrule as `cpu_limit`.", - "minimum": 0 + ] }, "user_context": { + "description": "Optional context appended to the prompt (e.g. \"test against staging\nonly\"). Mirrors `TriggerAgentRequest.user_context`.", "type": [ "string", "null" - ], - "description": "Optional context appended to the prompt (e.g. \"test against staging\nonly\"). Mirrors `TriggerAgentRequest.user_context`." + ] }, "yaml": { - "type": "string", - "description": "Full WorkflowYamlConfig as YAML text. Server validates and re-serializes\nbefore storing on the run row." + "description": "Full WorkflowYamlConfig as YAML text. Server validates and re-serializes\nbefore storing on the run row.", + "type": "string" } - } + }, + "required": [ + "yaml" + ], + "type": "object" }, "WorkloadDescriptor": { - "type": "object", "description": "Brief descriptor for discovered workloads (used in listing)", - "required": [ - "id", - "workload_type", - "status", - "labels" - ], "properties": { "created_at": { + "description": "Creation timestamp", + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time", - "description": "Creation timestamp" + ] }, "id": { "$ref": "#/components/schemas/WorkloadId", "description": "Unique ID in source system" }, "image": { + "description": "Image/build reference (for containers)", "type": [ "string", "null" - ], - "description": "Image/build reference (for containers)" + ] }, "labels": { - "type": "object", - "description": "Labels/tags from source system", "additionalProperties": { "type": "string" }, + "description": "Labels/tags from source system", "propertyNames": { "type": "string" - } + }, + "type": "object" }, "name": { + "description": "Workload name (if any)", "type": [ "string", "null" - ], - "description": "Workload name (if any)" + ] }, "status": { "$ref": "#/components/schemas/WorkloadStatus", @@ -42555,14 +43123,20 @@ "$ref": "#/components/schemas/WorkloadType", "description": "Workload type (container, function, static-site, etc.)" } - } + }, + "required": [ + "id", + "workload_type", + "status", + "labels" + ], + "type": "object" }, "WorkloadId": { - "type": "string", - "description": "Unique identifier for a workload in the source system" + "description": "Unique identifier for a workload in the source system", + "type": "string" }, "WorkloadStatus": { - "type": "string", "description": "Workload status in source system", "enum": [ "running", @@ -42573,10 +43147,10 @@ "deployed", "building", "unknown" - ] + ], + "type": "string" }, "WorkloadType": { - "type": "string", "description": "Workload type", "enum": [ "container", @@ -42589,253 +43163,113 @@ "cache", "cron-job", "other" - ] + ], + "type": "string" }, "WriteFileBody": { - "type": "object", - "required": [ - "path", - "contents_b64" - ], + "additionalProperties": false, "properties": { "contents_b64": { - "type": "string", - "description": "File contents, base64-encoded. Required \u2014 lets callers ship binary\ndata over JSON without charset games." + "description": "File contents, base64-encoded. Required — lets callers ship binary\ndata over JSON without charset games.", + "type": "string" }, "mode": { + "description": "Unix permission mask (e.g. 0o644). Defaults to 0o644 when absent.", + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "description": "Unix permission mask (e.g. 0o644). Defaults to 0o644 when absent.", - "minimum": 0 + ] }, "path": { - "type": "string", - "description": "Absolute path inside the sandbox. Must start with `/`." + "description": "Absolute path inside the sandbox. Must start with `/`.", + "type": "string" } }, - "additionalProperties": false - }, - "WriteFilesBody": { - "type": "object", "required": [ - "files" + "path", + "contents_b64" ], + "type": "object" + }, + "WriteFilesBody": { + "additionalProperties": false, "properties": { "files": { - "type": "array", + "description": "List of files to write. Each entry must include an absolute\n`path` and base64-encoded `contents_b64`. Empty list is a no-op.", "items": { "$ref": "#/components/schemas/WriteFileBody" }, - "description": "List of files to write. Each entry must include an absolute\n`path` and base64-encoded `contents_b64`. Empty list is a no-op." + "type": "array" } }, - "additionalProperties": false - }, - "WriteFilesResponse": { - "type": "object", "required": [ - "written" + "files" ], + "type": "object" + }, + "WriteFilesResponse": { "properties": { "written": { - "type": "integer", "description": "Number of files successfully written before the first failure\n(if any). On full success this equals `files.len()`.", - "minimum": 0 + "minimum": 0, + "type": "integer" } - } + }, + "required": [ + "written" + ], + "type": "object" }, "ZoneListResponse": { - "type": "object", "description": "Zone list response", - "required": [ - "zones" - ], "properties": { "zones": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsZone" - } - } - } - }, - "SpanStats": { - "type": "object", - "description": "Latency and error statistics for one operation, i.e. one\n`(project, service, span name)` triple over the queried window.", - "required": [ - "project_id", - "service_name", - "span_name", - "kind", - "count", - "error_count", - "error_rate", - "total_duration_ms", - "min_duration_ms", - "max_duration_ms", - "avg_duration_ms", - "stddev_duration_ms", - "p50_duration_ms", - "p95_duration_ms", - "p99_duration_ms", - "coefficient_of_variation", - "tail_ratio", - "last_seen" - ], - "properties": { - "avg_duration_ms": { - "type": "number", - "format": "double" - }, - "coefficient_of_variation": { - "type": "number", - "format": "double", - "description": "`stddev / avg`, or `0` when `avg` is zero." - }, - "count": { - "type": "integer", - "format": "int64", - "description": "Number of spans aggregated." - }, - "error_count": { - "type": "integer", - "format": "int64" - }, - "error_rate": { - "type": "number", - "format": "double", - "description": "`error_count / count`, in `[0, 1]`." - }, - "kind": { - "$ref": "#/components/schemas/SpanKind", - "description": "The most common span kind for this operation." - }, - "last_seen": { - "type": "string", - "format": "date-time", - "description": "Start time of the most recent span in this group." - }, - "max_duration_ms": { - "type": "number", - "format": "double" - }, - "min_duration_ms": { - "type": "number", - "format": "double" - }, - "p50_duration_ms": { - "type": "number", - "format": "double" - }, - "p95_duration_ms": { - "type": "number", - "format": "double" - }, - "p99_duration_ms": { - "type": "number", - "format": "double" - }, - "project_id": { - "type": "integer", - "format": "int32" - }, - "service_name": { - "type": "string" - }, - "span_name": { - "type": "string", - "description": "The span name, which is the operation identity: `GET /api/checkout`,\n`SELECT carts`, `payments.charge`." - }, - "stddev_duration_ms": { - "type": "number", - "format": "double", - "description": "Sample standard deviation. `0` when the operation has a single sample." - }, - "tail_ratio": { - "type": "number", - "format": "double", - "description": "`p99 / p50`, or `0` when `p50` is zero." - }, - "total_duration_ms": { - "type": "number", - "format": "double", - "description": "`SUM(duration_ms)` \u2014 total wall-clock attributable to this operation." + }, + "type": "array" } - } - }, - "SpanStatsResponse": { - "type": "object", - "description": "Response for `GET /otel/span-stats`.", + }, "required": [ - "data", - "total", - "start_time", - "end_time" + "zones" ], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SpanStats" - } - }, - "end_time": { - "type": "string", - "format": "date-time" - }, - "start_time": { - "type": "string", - "format": "date-time", - "description": "The window actually aggregated, echoed back because it is defaulted\nserver-side when the caller omits it." - }, - "total": { - "type": "integer", - "format": "int64", - "description": "Total number of distinct operations matching the filters, for pagination.", - "minimum": 0 - } - } + "type": "object" } }, "securitySchemes": { "bearer_auth": { - "type": "http", + "description": "Bearer token authentication. Use format: `Bearer `. Supports API keys (starting with `tk_`), CLI tokens, and session tokens.", "scheme": "bearer", - "description": "Bearer token authentication. Use format: `Bearer `. Supports API keys (starting with `tk_`), CLI tokens, and session tokens." + "type": "http" } } }, "info": { - "title": "Temps", - "description": "An API for managing projects, deployments, and infrastructure resources", "contact": { "name": "Temps Support", "url": "https://temps.sh" }, + "description": "An API for managing projects, deployments, and infrastructure resources", + "title": "Temps", "version": "1.0.0" }, "openapi": "3.1.0", "paths": { "/.well-known/temps.json": { "get": { - "tags": [ - "Platform" - ], - "summary": "Get platform information", "operationId": "get_platform_info", "responses": { "200": { - "description": "Successfully retrieved platform information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PlatformInfo" } } - } + }, + "description": "Successfully retrieved platform information" }, "401": { "description": "Unauthorized" @@ -42848,22 +43282,22 @@ { "bearer_auth": [] } + ], + "summary": "Get platform information", + "tags": [ + "Platform" ] } }, "/0/organizations/{org_slug}/chunk-upload/": { "get": { - "tags": [ - "sentry-compat" - ], - "summary": "Chunk upload options (stub for sentry-cli compatibility).", "description": "sentry-cli checks this endpoint to determine if chunk-based upload is supported.\nWe return a response indicating that chunk upload is NOT supported, which forces\nsentry-cli to fall back to the standard file-by-file upload.", "operationId": "chunk_upload_options", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" @@ -42872,31 +43306,31 @@ ], "responses": { "200": { - "description": "Chunk upload options", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryChunkUploadResponse" } } - } + }, + "description": "Chunk upload options" } - } + }, + "summary": "Chunk upload options (stub for sentry-cli compatibility).", + "tags": [ + "sentry-compat" + ] } }, "/0/organizations/{org_slug}/releases/": { "post": { - "tags": [ - "sentry-compat" - ], - "summary": "Create a release (stub for sentry-cli compatibility).", "description": "sentry-cli calls this before uploading files. Since Temps implicitly creates\nreleases when source maps are uploaded, this is a no-op that returns the\nexpected response format.", "operationId": "create_release", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored in single-tenant mode)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" @@ -42915,43 +43349,43 @@ }, "responses": { "201": { - "description": "Release created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryReleaseResponse" } } - } + }, + "description": "Release created" }, "401": { "description": "Unauthorized" } - } + }, + "summary": "Create a release (stub for sentry-cli compatibility).", + "tags": [ + "sentry-compat" + ] } }, "/0/projects/{org_slug}/{project_slug}/releases/": { "post": { - "tags": [ - "sentry-compat" - ], - "summary": "Create a release for a specific project (stub for sentry-cli compatibility).", "description": "sentry-cli calls this endpoint (instead of /organizations/.../releases/) when\nboth SENTRY_ORG and SENTRY_PROJECT env vars are set. Behaves identically to\nthe organizations endpoint but validates the project slug.", "operationId": "create_project_release", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored in single-tenant mode)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" } }, { - "name": "project_slug", - "in": "path", "description": "Project slug or numeric ID", + "in": "path", + "name": "project_slug", "required": true, "schema": { "type": "string" @@ -42970,14 +43404,14 @@ }, "responses": { "201": { - "description": "Release created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryReleaseResponse" } } - } + }, + "description": "Release created" }, "401": { "description": "Unauthorized" @@ -42985,40 +43419,40 @@ "404": { "description": "Project not found" } - } + }, + "summary": "Create a release for a specific project (stub for sentry-cli compatibility).", + "tags": [ + "sentry-compat" + ] } }, "/0/projects/{org_slug}/{project_slug}/releases/{version}/": { "put": { - "tags": [ - "sentry-compat" - ], - "summary": "Finalize a release (stub for sentry-cli compatibility).", "description": "sentry-cli calls `releases finalize` after uploading source maps. This sets\nthe dateReleased on the release. Since Temps stores source maps independently\nof releases, this is a no-op that returns the expected response.", "operationId": "finalize_project_release", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" } }, { - "name": "project_slug", - "in": "path", "description": "Project slug or numeric ID", + "in": "path", + "name": "project_slug", "required": true, "schema": { "type": "string" } }, { - "name": "version", - "in": "path", "description": "Release version to finalize", + "in": "path", + "name": "version", "required": true, "schema": { "type": "string" @@ -43027,14 +43461,14 @@ ], "responses": { "200": { - "description": "Release finalized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryReleaseResponse" } } - } + }, + "description": "Release finalized" }, "401": { "description": "Unauthorized" @@ -43042,40 +43476,40 @@ "404": { "description": "Project not found" } - } + }, + "summary": "Finalize a release (stub for sentry-cli compatibility).", + "tags": [ + "sentry-compat" + ] } }, "/0/projects/{org_slug}/{project_slug}/releases/{version}/files/": { "get": { - "tags": [ - "sentry-compat" - ], - "summary": "List files for a release.", "description": "Returns all source maps stored for a specific release in sentry-cli compatible format.", "operationId": "list_release_files", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" } }, { - "name": "project_slug", - "in": "path", "description": "Project slug or numeric ID", + "in": "path", + "name": "project_slug", "required": true, "schema": { "type": "string" } }, { - "name": "version", - "in": "path", "description": "Release version", + "in": "path", + "name": "version", "required": true, "schema": { "type": "string" @@ -43084,17 +43518,17 @@ ], "responses": { "200": { - "description": "List of release files", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/SentryReleaseFileResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of release files" }, "401": { "description": "Unauthorized" @@ -43102,38 +43536,38 @@ "404": { "description": "Project not found" } - } - }, - "post": { + }, + "summary": "List files for a release.", "tags": [ "sentry-compat" - ], - "summary": "Upload a source map file for a release.", + ] + }, + "post": { "description": "Accepts the same multipart format as the Sentry release files API.\nThe `name` field should be the URL path of the file (e.g., `~/dist/bundle.js.map`).\n\nThe route has a 50 MiB body limit applied at the router level (Fix #4).\nA per-field size check provides an additional defense-in-depth layer.", "operationId": "upload_release_file", "parameters": [ { - "name": "org_slug", - "in": "path", "description": "Organization slug (ignored)", + "in": "path", + "name": "org_slug", "required": true, "schema": { "type": "string" } }, { - "name": "project_slug", - "in": "path", "description": "Project slug or numeric ID", + "in": "path", + "name": "project_slug", "required": true, "schema": { "type": "string" } }, { - "name": "version", - "in": "path", "description": "Release version", + "in": "path", + "name": "version", "required": true, "schema": { "type": "string" @@ -43142,14 +43576,14 @@ ], "responses": { "201": { - "description": "File uploaded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryReleaseFileResponse" } } - } + }, + "description": "File uploaded" }, "400": { "description": "Bad request" @@ -43163,15 +43597,15 @@ "413": { "description": "Source map file exceeds the 50 MiB per-field limit" } - } + }, + "summary": "Upload a source map file for a release.", + "tags": [ + "sentry-compat" + ] } }, "/_temps/event": { "post": { - "tags": [ - "Metrics" - ], - "summary": "Record analytics event", "operationId": "record_event_metrics", "requestBody": { "content": { @@ -43193,15 +43627,15 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Record analytics event", + "tags": [ + "Metrics" + ] } }, "/_temps/session-replay/events": { "post": { - "tags": [ - "Analytics" - ], - "summary": "Add events to existing session replay", "operationId": "add_session_replay_events", "requestBody": { "content": { @@ -43215,54 +43649,54 @@ }, "responses": { "200": { - "description": "Events added successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddEventsResponse" } } - } + }, + "description": "Events added successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } - } + }, + "summary": "Add events to existing session replay", + "tags": [ + "Analytics" + ] } }, "/_temps/session-replay/init": { "post": { - "tags": [ - "Analytics" - ], - "summary": "Initialize session replay with metadata", "operationId": "init_session_replay", "requestBody": { "content": { @@ -43276,44 +43710,44 @@ }, "responses": { "201": { - "description": "Session initialized successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SessionReplayInitResponse" } } - } + }, + "description": "Session initialized successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } - } + }, + "summary": "Initialize session replay with metadata", + "tags": [ + "Analytics" + ] } }, "/_temps/speed": { "post": { - "tags": [ - "Performance" - ], - "summary": "Record performance metrics from client", "operationId": "record_speed_metrics", "requestBody": { "content": { @@ -43330,44 +43764,44 @@ "description": "Metrics recorded successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "404": { - "description": "Host not found in route table", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Host not found in route table" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } - } + }, + "summary": "Record performance metrics from client", + "tags": [ + "Performance" + ] } }, "/_temps/speed/update": { "post": { - "tags": [ - "Performance" - ], - "summary": "Update late performance metrics", "operationId": "update_speed_metrics", "requestBody": { "content": { @@ -43384,54 +43818,55 @@ "description": "Metrics updated successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "404": { - "description": "Host not found or metrics not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Host not found or metrics not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } - } + }, + "summary": "Update late performance metrics", + "tags": [ + "Performance" + ] } }, "/admin/gate-settings": { "get": { - "tags": [ - "AdminGate" - ], "operationId": "get_admin_gate", "responses": { "200": { - "description": "Current admin gate config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminGateResponse" } } - } + }, + "description": "Current admin gate config" }, "401": { "description": "Unauthorized" @@ -43444,12 +43879,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "AdminGate" ] }, "patch": { - "tags": [ - "AdminGate" - ], "operationId": "patch_admin_gate", "requestBody": { "content": { @@ -43463,14 +43898,14 @@ }, "responses": { "200": { - "description": "Updated admin gate config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminGateResponse" } } - } + }, + "description": "Updated admin gate config" }, "400": { "description": "Invalid IP/CIDR/host" @@ -43489,40 +43924,40 @@ { "bearer_auth": [] } + ], + "tags": [ + "AdminGate" ] } }, "/admin/oidc/providers": { "get": { - "tags": [ - "Authentication" - ], "operationId": "list_oidc_providers", "responses": { "200": { - "description": "OIDC providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/OidcProviderResponse" - } + }, + "type": "array" } } - } + }, + "description": "OIDC providers" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] }, "post": { - "tags": [ - "Authentication" - ], "operationId": "create_oidc_provider", "requestBody": { "content": { @@ -43536,14 +43971,14 @@ }, "responses": { "201": { - "description": "OIDC provider created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OidcProviderResponse" } } - } + }, + "description": "OIDC provider created" }, "409": { "description": "Another OIDC provider already uses that name" @@ -43553,23 +43988,23 @@ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/admin/oidc/providers/{provider_id}": { "delete": { - "tags": [ - "Authentication" - ], "operationId": "delete_oidc_provider", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -43582,21 +44017,21 @@ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] }, "patch": { - "tags": [ - "Authentication" - ], "operationId": "update_oidc_provider", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -43612,74 +44047,74 @@ }, "responses": { "200": { - "description": "OIDC provider updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OidcProviderResponse" } } - } + }, + "description": "OIDC provider updated" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/admin/oidc/providers/{provider_id}/role-mappings": { "get": { - "tags": [ - "Authentication" - ], "operationId": "list_oidc_role_mappings", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "OIDC role mappings", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/OidcRoleMappingResponse" - } + }, + "type": "array" } } - } + }, + "description": "OIDC role mappings" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] }, "post": { - "tags": [ - "Authentication" - ], "operationId": "create_oidc_role_mapping", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -43695,90 +44130,90 @@ }, "responses": { "201": { - "description": "Role mapping created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OidcRoleMappingResponse" } } - } + }, + "description": "Role mapping created" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/admin/oidc/providers/{provider_id}/test": { "post": { - "tags": [ - "Authentication" - ], "operationId": "test_oidc_provider", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Connection test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OidcTestConnectionResponse" } } - } + }, + "description": "Connection test result" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/admin/oidc/providers/{provider_id}/users": { "get": { - "tags": [ - "Authentication" - ], "operationId": "list_oidc_provider_users", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "OIDC provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Users authenticated via this OIDC provider", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/OidcProviderUserResponse" - } + }, + "type": "array" } } - } + }, + "description": "Users authenticated via this OIDC provider" }, "404": { "description": "Provider not found" @@ -43788,23 +44223,23 @@ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/admin/oidc/role-mappings/{mapping_id}": { "delete": { - "tags": [ - "Authentication" - ], "operationId": "delete_oidc_role_mapping", "parameters": [ { - "name": "mapping_id", "in": "path", + "name": "mapping_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -43817,22 +44252,21 @@ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/agents/webhook/{webhook_id}": { "post": { - "tags": [ - "Agents" - ], - "summary": "Public webhook endpoint. Authenticated via `X-Webhook-Token` header.", "description": "`POST /api/agents/webhook/{webhook_id}`\nHeader: `X-Webhook-Token: `\n\nThe `webhook_id` in the URL is a short non-secret identifier (safe to log).\nThe actual credential is the secret token in the header.\n\nAccepts any JSON body, which is passed as `user_context` to the agent run.", "operationId": "webhook_trigger", "parameters": [ { - "name": "webhook_id", - "in": "path", "description": "Webhook ID (non-secret)", + "in": "path", + "name": "webhook_id", "required": true, "schema": { "type": "string" @@ -43851,14 +44285,14 @@ }, "responses": { "202": { - "description": "Agent run created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookTriggerResponse" } } - } + }, + "description": "Agent run created" }, "401": { "description": "Missing or invalid X-Webhook-Token header" @@ -43869,29 +44303,29 @@ "422": { "description": "Agent disabled" } - } + }, + "summary": "Public webhook endpoint. Authenticated via `X-Webhook-Token` header.", + "tags": [ + "Agents" + ] } }, "/ai/conversations": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "List every active conversation across all projects, most-recently-active\nfirst, annotated with project name/slug. Powers the unified \"all chats\"\nswitcher in the AI assistant dock.", "operationId": "list_all_conversations", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/GlobalConversationResponse" - } + }, + "type": "array" } } - } + }, + "description": "" }, "401": { "description": "" @@ -43904,105 +44338,106 @@ { "bearer_auth": [] } + ], + "summary": "List every active conversation across all projects, most-recently-active\nfirst, annotated with project name/slug. Powers the unified \"all chats\"\nswitcher in the AI assistant dock.", + "tags": [ + "AI Chat" ] } }, "/ai/pricing": { "get": { - "tags": [ - "AI Gateway Pricing" - ], "operationId": "get_pricing", "responses": { "200": { - "description": "Model pricing information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PricingResponse" } } - } + }, + "description": "Model pricing information" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Pricing" ] } }, "/ai/providers": { "get": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "list_provider_keys", "responses": { "200": { - "description": "List of provider keys", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderKeyResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of provider keys" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] }, "post": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "create_provider_key", "requestBody": { "content": { @@ -44016,58 +44451,58 @@ }, "responses": { "201": { - "description": "Provider key created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderKeyResponse" } } - } + }, + "description": "Provider key created" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] } }, "/ai/providers/test": { "post": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "test_provider_key_inline", "requestBody": { "content": { @@ -44081,67 +44516,67 @@ }, "responses": { "200": { - "description": "Test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestProviderKeyResponse" } } - } + }, + "description": "Test result" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] } }, "/ai/providers/{id}": { "delete": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "delete_provider_key", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -44150,55 +44585,55 @@ "description": "Provider key deleted" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] }, "patch": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "update_provider_key", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -44214,149 +44649,149 @@ }, "responses": { "200": { - "description": "Provider key updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderKeyResponse" } } - } + }, + "description": "Provider key updated" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] } }, "/ai/providers/{id}/test": { "post": { - "tags": [ - "AI Gateway Admin" - ], "operationId": "test_provider_key_by_id", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestProviderKeyResponse" } } - } + }, + "description": "Test result" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Provider key not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Provider key not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Admin" ] } }, "/ai/usage/by-provider": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_usage_by_provider", "parameters": [ { - "name": "from", - "in": "query", "description": "ISO 8601 start time (defaults to 24h ago)", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "ISO 8601 end time (defaults to now)", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" @@ -44365,115 +44800,115 @@ ], "responses": { "200": { - "description": "Usage broken down by provider", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderUsage" - } + }, + "type": "array" } } - } + }, + "description": "Usage broken down by provider" }, "400": { - "description": "Invalid query parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid query parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/conversations": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_conversations", "parameters": [ { - "name": "from", - "in": "query", "description": "ISO 8601 start time (defaults to 24h ago)", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "ISO 8601 end time (defaults to now)", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max results (defaults to 50, max 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "user_id", - "in": "query", "description": "Filter by user ID", + "in": "query", + "name": "user_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "tags", - "in": "query", "description": "Filter by tags (comma-separated)", + "in": "query", + "name": "tags", "required": false, "schema": { "type": "string" } }, { - "name": "model", - "in": "query", "description": "Filter by model name", + "in": "query", + "name": "model", "required": false, "schema": { "type": "string" @@ -44482,323 +44917,323 @@ ], "responses": { "200": { - "description": "Conversation summaries", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ConversationSummary" - } + }, + "type": "array" } } - } + }, + "description": "Conversation summaries" }, "400": { - "description": "Invalid query parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid query parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/conversations/{conversation_id}": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_conversation_detail", "parameters": [ { - "name": "conversation_id", - "in": "path", "description": "Conversation ID", + "in": "path", + "name": "conversation_id", "required": true, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max results (defaults to 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Invocations within a conversation", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/UsageLogEntry" - } + }, + "type": "array" } } - } + }, + "description": "Invocations within a conversation" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/recent": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_usage_recent", "parameters": [ { - "name": "limit", - "in": "query", "description": "Page size (defaults to 20, max 50)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Number of results to skip for pagination (defaults to 0)", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "provider", - "in": "query", "description": "Filter by provider name", + "in": "query", + "name": "provider", "required": false, "schema": { "type": "string" } }, { - "name": "model", - "in": "query", "description": "Filter by model name", + "in": "query", + "name": "model", "required": false, "schema": { "type": "string" } }, { - "name": "status", - "in": "query", "description": "Filter by HTTP status code (exact match)", + "in": "query", + "name": "status", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "cost_gte", - "in": "query", "description": "Cost greater-than-or-equal, in microcents", + "in": "query", + "name": "cost_gte", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "cost_gt", - "in": "query", "description": "Cost strictly greater-than, in microcents", + "in": "query", + "name": "cost_gt", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "cost_lte", - "in": "query", "description": "Cost less-than-or-equal, in microcents", + "in": "query", + "name": "cost_lte", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "cost_lt", - "in": "query", "description": "Cost strictly less-than, in microcents", + "in": "query", + "name": "cost_lt", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tokens_gte", - "in": "query", "description": "Total tokens greater-than-or-equal", + "in": "query", + "name": "tokens_gte", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tokens_gt", - "in": "query", "description": "Total tokens strictly greater-than", + "in": "query", + "name": "tokens_gt", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tokens_lte", - "in": "query", "description": "Total tokens less-than-or-equal", + "in": "query", + "name": "tokens_lte", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tokens_lt", - "in": "query", "description": "Total tokens strictly less-than", + "in": "query", + "name": "tokens_lt", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Page of recent usage log entries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UsageLogPage" } } - } + }, + "description": "Page of recent usage log entries" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/summary": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_usage_summary", "parameters": [ { - "name": "from", - "in": "query", "description": "ISO 8601 start time (defaults to 24h ago)", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "ISO 8601 end time (defaults to now)", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" @@ -44807,82 +45242,82 @@ ], "responses": { "200": { - "description": "Usage summary for the time range", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UsageSummary" } } - } + }, + "description": "Usage summary for the time range" }, "400": { - "description": "Invalid query parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid query parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/timeseries": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_usage_timeseries", "parameters": [ { - "name": "from", - "in": "query", "description": "ISO 8601 start time (defaults to 24h ago)", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "ISO 8601 end time (defaults to now)", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" } }, { - "name": "bucket", - "in": "query", "description": "Bucket size: hour, day, week (defaults to day)", + "in": "query", + "name": "bucket", "required": false, "schema": { "type": "string" @@ -44891,150 +45326,150 @@ ], "responses": { "200": { - "description": "Time-series usage data", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/TimeseriesBucket" - } + }, + "type": "array" } } - } + }, + "description": "Time-series usage data" }, "400": { - "description": "Invalid query parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid query parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/usage/top-models": { "get": { - "tags": [ - "AI Gateway Usage" - ], "operationId": "get_usage_top_models", "parameters": [ { - "name": "from", - "in": "query", "description": "ISO 8601 start time (defaults to 24h ago)", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "ISO 8601 end time (defaults to now)", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max results (defaults to 10)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Top models by request count", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ModelUsage" - } + }, + "type": "array" } } - } + }, + "description": "Top models by request count" }, "400": { - "description": "Invalid query parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid query parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway Usage" ] } }, "/ai/v1/chat/completions": { "post": { - "tags": [ - "AI Gateway" - ], "operationId": "chat_completions", "requestBody": { "content": { @@ -45048,68 +45483,68 @@ }, "responses": { "200": { - "description": "Chat completion response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatCompletionResponse" } } - } + }, + "description": "Chat completion response" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Model not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Model not found" }, "500": { - "description": "Internal error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Internal error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway" ] } }, "/ai/v1/embeddings": { "post": { - "tags": [ - "AI Gateway" - ], "operationId": "embeddings", "requestBody": { "content": { @@ -45123,147 +45558,146 @@ }, "responses": { "200": { - "description": "Embedding response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmbeddingResponse" } } - } + }, + "description": "Embedding response" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Model not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Model not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway" ] } }, "/ai/v1/models": { "get": { - "tags": [ - "AI Gateway" - ], "operationId": "list_models", "responses": { "200": { - "description": "List of available models", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ModelListResponse" } } - } + }, + "description": "List of available models" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OpenAiErrorResponse" } } - } + }, + "description": "Unauthorized" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "AI Gateway" ] } }, "/analytics/active-visitors": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get detailed active visitors", "operationId": "get_analytics_active_visitors", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Deployment ID (optional)", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "window_minutes", - "in": "query", "description": "Time window in minutes for active visitors (default: 5)", + "in": "query", + "name": "window_minutes", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved active visitors", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActiveVisitorsResponse" } } - } + }, + "description": "Successfully retrieved active visitors" }, "400": { "description": "Invalid parameters or project not found" @@ -45276,68 +45710,68 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed active visitors", + "tags": [ + "Analytics" ] } }, "/analytics/event-detail": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get detailed analytics for a specific event", "operationId": "get_event_detail", "parameters": [ { - "name": "event_name", - "in": "query", "description": "Event name to get details for", + "in": "query", + "name": "event_name", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date (ISO 8601)", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date (ISO 8601)", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "bucket_interval", - "in": "query", "description": "Bucket interval: hour, day, week, month (default: auto)", + "in": "query", + "name": "bucket_interval", "required": false, "schema": { "type": "string" @@ -45346,14 +45780,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved event details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EventDetailResponse" } } - } + }, + "description": "Successfully retrieved event details" }, "400": { "description": "Invalid parameters" @@ -45366,97 +45800,97 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed analytics for a specific event", + "tags": [ + "Analytics" ] } }, "/analytics/event-entries": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get paginated list of raw occurrences of a specific event, including custom JSON properties", "operationId": "get_event_entries", "parameters": [ { - "name": "event_name", - "in": "query", "description": "Event name to list occurrences for", + "in": "query", + "name": "event_name", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date (ISO 8601)", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date (ISO 8601)", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based, default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page (default: 20, max: 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved event entries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EventEntriesResponse" } } - } + }, + "description": "Successfully retrieved event entries" }, "400": { "description": "Invalid parameters" @@ -45469,97 +45903,97 @@ { "bearer_auth": [] } + ], + "summary": "Get paginated list of raw occurrences of a specific event, including custom JSON properties", + "tags": [ + "Analytics" ] } }, "/analytics/event-visitors": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get paginated list of visitors who triggered a specific event", "operationId": "get_event_visitors", "parameters": [ { - "name": "event_name", - "in": "query", "description": "Event name to list visitors for", + "in": "query", + "name": "event_name", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date (ISO 8601)", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date (ISO 8601)", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based, default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page (default: 20, max: 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved event visitors", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EventVisitorsResponse" } } - } + }, + "description": "Successfully retrieved event visitors" }, "400": { "description": "Invalid parameters" @@ -45572,77 +46006,78 @@ { "bearer_auth": [] } + ], + "summary": "Get paginated list of visitors who triggered a specific event", + "tags": [ + "Analytics" ] } }, "/analytics/events": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_analytics_events_count", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of results to return", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "custom_events_only", - "in": "query", "description": "Only return custom events, excluding system events like page_view, page_leave, heartbeat (default: true)", + "in": "query", + "name": "custom_events_only", "required": false, "schema": { "type": "boolean" } }, { - "name": "breakdown", - "in": "query", "description": "Breakdown by geography: 'country', 'region', or 'city' (optional)", + "in": "query", + "name": "breakdown", "required": false, "schema": { "type": "string" @@ -45651,17 +46086,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved event counts", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventCount" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved event counts" }, "400": { "description": "Invalid date format, missing required parameters, or project not found" @@ -45674,62 +46109,61 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/general-stats": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get general statistics across all projects for a time frame", "operationId": "get_general_stats", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_ids", - "in": "query", "description": "Optional: Filter by specific project IDs (comma-separated)", + "in": "query", + "name": "project_ids", "required": false, "schema": { - "type": "array", "items": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "array" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "include_project_breakdown", - "in": "query", "description": "Whether to include per-project breakdown (default: false)", + "in": "query", + "name": "include_project_breakdown", "required": false, "schema": { "type": "boolean" @@ -45738,14 +46172,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved general statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GeneralStatsResponse" } } - } + }, + "description": "Successfully retrieved general statistics" }, "400": { "description": "Invalid date format or parameters" @@ -45758,47 +46192,48 @@ { "bearer_auth": [] } + ], + "summary": "Get general statistics across all projects for a time frame", + "tags": [ + "Analytics" ] } }, "/analytics/has-events": { "get": { - "tags": [ - "Analytics" - ], "operationId": "check_analytics_has_events", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Analytics events existence check", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HasAnalyticsEventsResponse" } } - } + }, + "description": "Analytics events existence check" }, "400": { "description": "Bad request" @@ -45817,58 +46252,57 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/live-visitors": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get list of currently live visitors from visitor table", "operationId": "get_live_visitors_list", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "window_minutes", - "in": "query", "description": "Time window in minutes for live visitors (default: 5)", + "in": "query", + "name": "window_minutes", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved live visitors list", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LiveVisitorsListResponse" } } - } + }, + "description": "Successfully retrieved live visitors list" }, "400": { "description": "Invalid parameters or project not found" @@ -45881,96 +46315,96 @@ { "bearer_auth": [] } + ], + "summary": "Get list of currently live visitors from visitor table", + "tags": [ + "Analytics" ] } }, "/analytics/page-flow": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get page flow analytics: entry pages, exit pages, drop-off points, and page transitions", "operationId": "get_page_flow", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in ISO 8601 format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in ISO 8601 format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max entry/exit pages to return (default: 20, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "transitions_limit", - "in": "query", "description": "Max page transitions to return (default: 50, max: 200)", + "in": "query", + "name": "transitions_limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "min_views_for_dropoff", - "in": "query", "description": "Minimum views for drop-off analysis (default: 5)", + "in": "query", + "name": "min_views_for_dropoff", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved page flow analytics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PageFlowResponse" } } - } + }, + "description": "Successfully retrieved page flow analytics" }, "400": { "description": "Invalid parameters" @@ -45983,67 +46417,68 @@ { "bearer_auth": [] } + ], + "summary": "Get page flow analytics: entry pages, exit pages, drop-off points, and page transitions", + "tags": [ + "Analytics" ] } }, "/analytics/page-hourly-sessions": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_page_hourly_sessions", "parameters": [ { - "name": "page_path", - "in": "query", "description": "The page path to get sessions for", + "in": "query", + "name": "page_path", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", - "in": "query", "description": "Start time in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_time", "required": true, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_time", "required": true, "schema": { "type": "string" } }, { - "name": "bucket_interval", - "in": "query", "description": "Bucket interval: 'hour', 'day', 'week', or 'month' (default: auto-determined based on range)", + "in": "query", + "name": "bucket_interval", "required": false, "schema": { "type": "string" @@ -46052,14 +46487,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved page sessions with time buckets", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PageHourlySessionsResponse" } } - } + }, + "description": "Successfully retrieved page sessions with time buckets" }, "400": { "description": "Invalid parameters or project not found" @@ -46072,68 +46507,67 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/page-path-detail": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get detailed analytics for a specific page path\nReturns visitors, page views, activity over time, geographic distribution, and referrers", "operationId": "get_page_path_detail", "parameters": [ { - "name": "page_path", - "in": "query", "description": "The page path to get details for (URL-encoded)", + "in": "query", + "name": "page_path", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in ISO 8601 format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in ISO 8601 format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "bucket_interval", - "in": "query", "description": "Bucket interval for time series: 'hour', 'day', 'week', 'month' (default: auto based on date range)", + "in": "query", + "name": "bucket_interval", "required": false, "schema": { "type": "string" @@ -46142,14 +46576,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved page path detail analytics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PagePathDetailResponse" } } - } + }, + "description": "Successfully retrieved page path detail analytics" }, "400": { "description": "Invalid parameters or project not found" @@ -46162,97 +46596,97 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed analytics for a specific page path\nReturns visitors, page views, activity over time, geographic distribution, and referrers", + "tags": [ + "Analytics" ] } }, "/analytics/page-path-visitors": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get individual visitor sessions for a specific page path", "operationId": "get_page_path_visitors", "parameters": [ { - "name": "page_path", - "in": "query", "description": "The page path to get visitors for (URL-encoded)", + "in": "query", + "name": "page_path", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in ISO 8601 format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in ISO 8601 format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based, default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page (default: 50, max: 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved page path visitors", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PagePathVisitorsResponse" } } - } + }, + "description": "Successfully retrieved page path visitors" }, "400": { "description": "Invalid parameters" @@ -46265,75 +46699,76 @@ { "bearer_auth": [] } + ], + "summary": "Get individual visitor sessions for a specific page path", + "tags": [ + "Analytics" ] } }, "/analytics/page-paths": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_page_paths", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS (optional)", + "in": "query", + "name": "start_date", "required": false, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS (optional)", + "in": "query", + "name": "end_date", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of page paths to return (default: 100, max: 1000)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved page paths", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PagePathsResponse" } } - } + }, + "description": "Successfully retrieved page paths" }, "400": { "description": "Invalid parameters or project not found" @@ -46346,58 +46781,58 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/page-paths-sparklines": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_page_paths_sparklines", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", - "in": "query", "description": "Start time in ISO 8601 format", + "in": "query", + "name": "start_time", "required": true, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time in ISO 8601 format", + "in": "query", + "name": "end_time", "required": true, "schema": { "type": "string" } }, { - "name": "page_paths", - "in": "query", "description": "Comma-separated list of page paths", + "in": "query", + "name": "page_paths", "required": true, "schema": { "type": "string" @@ -46406,14 +46841,14 @@ ], "responses": { "200": { - "description": "Sparkline data for all requested page paths", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PagePathsSparklineResponse" } } - } + }, + "description": "Sparkline data for all requested page paths" }, "400": { "description": "Invalid parameters" @@ -46426,68 +46861,67 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/recent-activity": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get recent activity events for real-time activity feed", "operationId": "get_recent_activity", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "since_id", - "in": "query", "description": "Return events with ID greater than this (cursor-based polling)", + "in": "query", + "name": "since_id", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Max events to return (default: 50, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved recent activity events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecentActivityResponse" } } - } + }, + "description": "Successfully retrieved recent activity events" }, "400": { "description": "Invalid parameters" @@ -46500,58 +46934,58 @@ { "bearer_auth": [] } + ], + "summary": "Get recent activity events for real-time activity feed", + "tags": [ + "Analytics" ] } }, "/analytics/sessions/{session_id}": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get detailed information about a specific session including events and request logs", "operationId": "get_session_details", "parameters": [ { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved session details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SessionDetails" } } - } + }, + "description": "Successfully retrieved session details" }, "400": { "description": "Invalid parameters or project not found" @@ -46567,95 +47001,96 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed information about a specific session including events and request logs", + "tags": [ + "Analytics" ] } }, "/analytics/sessions/{session_id}/events": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_analytics_session_events", "parameters": [ { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": false, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Number of results to return (default: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Number of results to skip (default: 0)", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved session events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SessionEventsResponse" } } - } + }, + "description": "Successfully retrieved session events" }, "400": { "description": "Invalid parameters or project not found" @@ -46671,95 +47106,95 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/sessions/{session_id}/logs": { "get": { - "tags": [ - "Analytics" - ], "operationId": "get_session_logs", "parameters": [ { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": false, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Number of results to return (default: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Number of results to skip (default: 0)", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved session logs", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SessionLogsResponse" } } - } + }, + "description": "Successfully retrieved session logs" }, "400": { "description": "Invalid parameters or project not found" @@ -46775,123 +47210,122 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/visitor-facets": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get filter dropdown contents for the visitors page. Returns the top\nvalues per dimension with distinct visitor counts so the UI can render\n\"Country \u2014 1,234 visitors\" rows. Each dimension is computed against the\nsegment minus its own filter, so a selected value never collapses its\nown dropdown.", "operationId": "get_visitor_facets", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "include_crawlers", - "in": "query", "description": "Include crawlers (default: false)", + "in": "query", + "name": "include_crawlers", "required": false, "schema": { "type": "boolean" } }, { - "name": "has_activity_only", - "in": "query", "description": "Hide ghost visitors (default: true)", + "in": "query", + "name": "has_activity_only", "required": false, "schema": { "type": "boolean" } }, { - "name": "per_facet_limit", - "in": "query", "description": "Top N values per dimension (default: 50, max: 200)", + "in": "query", + "name": "per_facet_limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "filter_country", - "in": "query", "description": "Geolocation country", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Geolocation region", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_city", - "in": "query", "description": "Geolocation city", + "in": "query", + "name": "filter_city", "required": false, "schema": { "type": "string" } }, { - "name": "filter_channel", - "in": "query", "description": "First-touch channel", + "in": "query", + "name": "filter_channel", "required": false, "schema": { "type": "string" } }, { - "name": "filter_referrer", - "in": "query", "description": "First-touch referrer hostname (use 'Direct' for null)", + "in": "query", + "name": "filter_referrer", "required": false, "schema": { "type": "string" @@ -46900,14 +47334,14 @@ ], "responses": { "200": { - "description": "Top values per dimension", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorFacets" } } - } + }, + "description": "Top values per dimension" }, "400": { "description": "Invalid date format or project not found" @@ -46920,133 +47354,133 @@ { "bearer_auth": [] } + ], + "summary": "Get filter dropdown contents for the visitors page. Returns the top\nvalues per dimension with distinct visitor counts so the UI can render\n\"Country — 1,234 visitors\" rows. Each dimension is computed against the\nsegment minus its own filter, so a selected value never collapses its\nown dropdown.", + "tags": [ + "Analytics" ] } }, "/analytics/visitors": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get list of visitors with summary information", "operationId": "get_visitors", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "include_crawlers", - "in": "query", "description": "Include crawlers (default: false)", + "in": "query", + "name": "include_crawlers", "required": false, "schema": { "type": "boolean" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of visitors to return (default: 50)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Number of visitors to skip (default: 0)", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "has_activity_only", - "in": "query", "description": "Filter to only include visitors with recorded activity (events/sessions). When true, excludes ghost visitors (default: true)", + "in": "query", + "name": "has_activity_only", "required": false, "schema": { "type": "boolean" } }, { - "name": "filter_country", - "in": "query", "description": "Geolocation country", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Geolocation region", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_city", - "in": "query", "description": "Geolocation city", + "in": "query", + "name": "filter_city", "required": false, "schema": { "type": "string" } }, { - "name": "filter_channel", - "in": "query", "description": "First-touch channel", + "in": "query", + "name": "filter_channel", "required": false, "schema": { "type": "string" } }, { - "name": "filter_referrer", - "in": "query", "description": "First-touch referrer hostname (use 'Direct' for null)", + "in": "query", + "name": "filter_referrer", "required": false, "schema": { "type": "string" @@ -47055,14 +47489,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved visitors", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorsResponse" } } - } + }, + "description": "Successfully retrieved visitors" }, "400": { "description": "Invalid date format, missing required parameters, or project not found" @@ -47075,57 +47509,57 @@ { "bearer_auth": [] } + ], + "summary": "Get list of visitors with summary information", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/guid/{visitor_id}": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get visitor by GUID with geolocation data", "operationId": "get_visitor_by_guid", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor GUID (supports enc_ prefix for encrypted IDs)", + "in": "path", + "name": "visitor_id", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor with geolocation", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorWithGeolocation" } } - } + }, + "description": "Successfully retrieved visitor with geolocation" }, "400": { "description": "Invalid parameters or project not found" @@ -47141,58 +47575,58 @@ { "bearer_auth": [] } + ], + "summary": "Get visitor by GUID with geolocation data", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/id/{id}": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get visitor by numeric ID with geolocation data", "operationId": "get_visitor_by_id", "parameters": [ { - "name": "id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor with geolocation", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorWithGeolocation" } } - } + }, + "description": "Successfully retrieved visitor with geolocation" }, "400": { "description": "Invalid parameters or project not found" @@ -47208,58 +47642,58 @@ { "bearer_auth": [] } + ], + "summary": "Get visitor by numeric ID with geolocation data", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get detailed information about a specific visitor by numeric ID", "operationId": "get_visitor_details", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorDetails" } } - } + }, + "description": "Successfully retrieved visitor details" }, "400": { "description": "Invalid parameters or project not found" @@ -47275,33 +47709,34 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed information about a specific visitor by numeric ID", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}/enrich": { "put": { - "tags": [ - "Analytics" - ], "operationId": "enrich_visitor", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID - can be numeric ID, GUID, or encrypted GUID (enc_xxx)", + "in": "path", + "name": "visitor_id", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -47317,14 +47752,14 @@ }, "responses": { "200": { - "description": "Successfully enriched visitor data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnrichVisitorResponse" } } - } + }, + "description": "Successfully enriched visitor data" }, "400": { "description": "Invalid parameters or project not found" @@ -47340,48 +47775,47 @@ { "bearer_auth": [] } + ], + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}/info": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get visitor record from database", "operationId": "get_visitor_info", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor info", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorRecord" } } - } + }, + "description": "Successfully retrieved visitor info" }, "400": { "description": "Invalid parameters or project not found" @@ -47397,58 +47831,58 @@ { "bearer_auth": [] } + ], + "summary": "Get visitor record from database", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}/journey": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get the complete visitor journey: all events across all sessions, grouped by session", "operationId": "get_visitor_journey", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit_sessions", - "in": "query", "description": "Maximum number of sessions to return (default: 50)", + "in": "query", + "name": "limit_sessions", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor journey", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorJourneyResponse" } } - } + }, + "description": "Successfully retrieved visitor journey" }, "400": { "description": "Invalid parameters" @@ -47464,68 +47898,68 @@ { "bearer_auth": [] } + ], + "summary": "Get the complete visitor journey: all events across all sessions, grouped by session", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}/sessions": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get all sessions for a specific visitor by numeric ID", "operationId": "get_analytics_visitor_sessions", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of sessions to return (default: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor sessions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorSessionsResponse" } } - } + }, + "description": "Successfully retrieved visitor sessions" }, "400": { "description": "Invalid parameters or project not found" @@ -47541,48 +47975,48 @@ { "bearer_auth": [] } + ], + "summary": "Get all sessions for a specific visitor by numeric ID", + "tags": [ + "Analytics" ] } }, "/analytics/visitors/{visitor_id}/stats": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get visitor statistics", "operationId": "get_visitor_stats", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor numeric ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved visitor statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VisitorStats" } } - } + }, + "description": "Successfully retrieved visitor statistics" }, "400": { "description": "Invalid parameters or project not found" @@ -47598,49 +48032,50 @@ { "bearer_auth": [] } + ], + "summary": "Get visitor statistics", + "tags": [ + "Analytics" ] } }, "/api-keys": { "get": { - "tags": [ - "API Keys" - ], "operationId": "list_api_keys", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default: 20)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "API keys retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyListResponse" } } - } + }, + "description": "API keys retrieved successfully" }, "401": { "description": "Unauthorized" @@ -47656,12 +48091,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] }, "post": { - "tags": [ - "API Keys" - ], "operationId": "create_api_key", "requestBody": { "content": { @@ -47675,14 +48110,14 @@ }, "responses": { "201": { - "description": "API key created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateApiKeyResponse" } } - } + }, + "description": "API key created successfully" }, "400": { "description": "Bad request" @@ -47707,25 +48142,25 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] } }, "/api-keys/permissions": { "get": { - "tags": [ - "API Keys" - ], "operationId": "get_api_key_permissions", "responses": { "200": { - "description": "Available permissions and roles retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AvailablePermissions" } } - } + }, + "description": "Available permissions and roles retrieved successfully" }, "401": { "description": "Unauthorized" @@ -47738,37 +48173,77 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] } }, "/api-keys/{id}": { - "get": { + "delete": { + "operationId": "delete_api_key", + "parameters": [ + { + "description": "API key ID", + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "API key deleted successfully" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not found" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "API Keys" - ], + ] + }, + "get": { "operationId": "get_api_key", "parameters": [ { - "name": "id", - "in": "path", "description": "API key ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "API key retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } - } + }, + "description": "API key retrieved successfully" }, "401": { "description": "Unauthorized" @@ -47787,22 +48262,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] }, "put": { - "tags": [ - "API Keys" - ], "operationId": "update_api_key", "parameters": [ { - "name": "id", - "in": "path", "description": "API key ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -47818,14 +48293,14 @@ }, "responses": { "200": { - "description": "API key updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } - } + }, + "description": "API key updated successfully" }, "400": { "description": "Bad request" @@ -47850,77 +48325,37 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "API Keys" - ], - "operationId": "delete_api_key", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "API key ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "API key deleted successfully" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not found" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/api-keys/{id}/activate": { "post": { - "tags": [ - "API Keys" - ], "operationId": "activate_api_key", "parameters": [ { - "name": "id", - "in": "path", "description": "API key ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "API key activated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } - } + }, + "description": "API key activated successfully" }, "401": { "description": "Unauthorized" @@ -47939,37 +48374,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] } }, "/api-keys/{id}/deactivate": { "post": { - "tags": [ - "API Keys" - ], "operationId": "deactivate_api_key", "parameters": [ { - "name": "id", - "in": "path", "description": "API key ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "API key deactivated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiKeyResponse" } } - } + }, + "description": "API key deactivated successfully" }, "401": { "description": "Unauthorized" @@ -47988,37 +48423,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] } }, "/api-keys/{id}/rotate": { "post": { - "tags": [ - "API Keys" - ], "operationId": "rotate_api_key", "parameters": [ { - "name": "id", - "in": "path", "description": "API key ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "API key rotated successfully; the response contains the new plaintext secret, shown only once", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateApiKeyResponse" } } - } + }, + "description": "API key rotated successfully; the response contains the new plaintext secret, shown only once" }, "401": { "description": "Unauthorized" @@ -48040,14 +48475,14 @@ { "bearer_auth": [] } + ], + "tags": [ + "API Keys" ] } }, "/auth/cli/device/approve": { "post": { - "tags": [ - "Authentication" - ], "operationId": "cli_device_approve", "requestBody": { "content": { @@ -48061,14 +48496,14 @@ }, "responses": { "200": { - "description": "Session approved; CLI can now claim the API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CliDeviceApproveResponse" } } - } + }, + "description": "Session approved; CLI can now claim the API key" }, "401": { "description": "Unauthorized" @@ -48096,14 +48531,14 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/auth/cli/device/deny": { "post": { - "tags": [ - "Authentication" - ], "operationId": "cli_device_deny", "requestBody": { "content": { @@ -48117,14 +48552,14 @@ }, "responses": { "200": { - "description": "Session denied", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CliDeviceApproveResponse" } } - } + }, + "description": "Session denied" }, "401": { "description": "Unauthorized" @@ -48146,20 +48581,20 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/auth/cli/device/lookup": { "get": { - "tags": [ - "Authentication" - ], "operationId": "cli_device_lookup", "parameters": [ { - "name": "user_code", - "in": "query", "description": "`user_code` as displayed in the CLI / pasted into the URL.", + "in": "query", + "name": "user_code", "required": true, "schema": { "type": "string" @@ -48168,14 +48603,14 @@ ], "responses": { "200": { - "description": "Device session metadata", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CliDeviceLookupResponse" } } - } + }, + "description": "Device session metadata" }, "401": { "description": "Unauthorized" @@ -48194,14 +48629,14 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/auth/cli/device/poll": { "post": { - "tags": [ - "Authentication" - ], "operationId": "cli_device_poll", "requestBody": { "content": { @@ -48215,14 +48650,14 @@ }, "responses": { "200": { - "description": "Poll result; check `status` field", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CliDevicePollResponse" } } - } + }, + "description": "Poll result; check `status` field" }, "404": { "description": "Unknown device_code" @@ -48230,14 +48665,14 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/cli/device/start": { "post": { - "tags": [ - "Authentication" - ], "operationId": "cli_device_start", "requestBody": { "content": { @@ -48251,26 +48686,26 @@ }, "responses": { "200": { - "description": "Device session created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CliDeviceStartResponse" } } - } + }, + "description": "Device session created" }, "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/cli/logout": { "post": { - "tags": [ - "Authentication" - ], "operationId": "cli_logout", "responses": { "204": { @@ -48290,37 +48725,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "Authentication" ] } }, "/auth/email-status": { "get": { - "tags": [ - "Authentication" - ], "operationId": "email_status", "responses": { "200": { - "description": "Email configuration status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailStatusResponse" } } - } + }, + "description": "Email configuration status" }, "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/login": { "post": { - "tags": [ - "Authentication" - ], "operationId": "login", "requestBody": { "content": { @@ -48334,14 +48769,14 @@ }, "responses": { "200": { - "description": "Login successful, session cookie set", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } - } + }, + "description": "Login successful, session cookie set" }, "401": { "description": "Invalid credentials, or the account's role requires MFA enrollment that has not been completed" @@ -48349,19 +48784,19 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/oidc/callback": { "get": { - "tags": [ - "Authentication" - ], "operationId": "oidc_callback", "parameters": [ { - "name": "code", "in": "query", + "name": "code", "required": false, "schema": { "type": [ @@ -48371,8 +48806,8 @@ } }, { - "name": "state", "in": "query", + "name": "state", "required": false, "schema": { "type": [ @@ -48382,8 +48817,8 @@ } }, { - "name": "error", "in": "query", + "name": "error", "required": false, "schema": { "type": [ @@ -48393,8 +48828,8 @@ } }, { - "name": "error_description", "in": "query", + "name": "error_description", "required": false, "schema": { "type": [ @@ -48408,28 +48843,28 @@ "302": { "description": "Redirect to app with session cookie or login error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/oidc/login/{slug}": { "get": { - "tags": [ - "Authentication" - ], "operationId": "start_oidc_login_by_slug", "parameters": [ { - "name": "slug", - "in": "path", "description": "OIDC provider slug (from /email-status or /auth/oidc/providers)", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } }, { - "name": "return_to", "in": "query", + "name": "return_to", "required": false, "schema": { "type": [ @@ -48449,34 +48884,73 @@ "503": { "description": "OIDC provider unreachable" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/oidc/providers": { "get": { - "tags": [ - "Authentication" - ], "operationId": "list_public_providers", "responses": { "200": { - "description": "Enabled OIDC providers for login page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OidcProvidersListResponse" } } - } + }, + "description": "Enabled OIDC providers for login page" } - } + }, + "tags": [ + "Authentication" + ] } }, - "/auth/password-reset/request": { + "/auth/password-change-required": { "post": { + "operationId": "change_required_password", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequiredPasswordChangeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequiredPasswordChangeResponse" + } + } + }, + "description": "Required password change completed" + }, + "400": { + "description": "Password does not meet requirements" + }, + "401": { + "description": "Password-change session is missing or expired" + }, + "500": { + "description": "Internal server error" + } + }, "tags": [ "Authentication" - ], + ] + } + }, + "/auth/password-reset/request": { + "post": { "operationId": "request_password_reset", "requestBody": { "content": { @@ -48490,26 +48964,26 @@ }, "responses": { "200": { - "description": "Reset email sent if account exists", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } - } + }, + "description": "Reset email sent if account exists" }, "503": { "description": "Email service not configured" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/password-reset/verify": { "post": { - "tags": [ - "Authentication" - ], "operationId": "reset_password", "requestBody": { "content": { @@ -48523,14 +48997,14 @@ }, "responses": { "200": { - "description": "Password reset successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } - } + }, + "description": "Password reset successful" }, "400": { "description": "Invalid or expired token" @@ -48538,14 +49012,14 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/step-up": { "post": { - "tags": [ - "Authentication" - ], "operationId": "verify_step_up", "requestBody": { "content": { @@ -48559,14 +49033,14 @@ }, "responses": { "200": { - "description": "Session elevated for sensitive actions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StepUpResponse" } } - } + }, + "description": "Session elevated for sensitive actions" }, "400": { "description": "Verification code is empty" @@ -48591,20 +49065,20 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/auth/verify-email": { "get": { - "tags": [ - "Authentication" - ], "operationId": "verify_email", "parameters": [ { - "name": "token", - "in": "query", "description": "Email verification token", + "in": "query", + "name": "token", "required": true, "schema": { "type": "string" @@ -48613,14 +49087,14 @@ ], "responses": { "200": { - "description": "Email verified successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } - } + }, + "description": "Email verified successfully" }, "400": { "description": "Invalid or expired token" @@ -48628,14 +49102,14 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/auth/verify-mfa": { "post": { - "tags": [ - "Authentication" - ], "operationId": "verify_mfa_challenge", "requestBody": { "content": { @@ -48660,84 +49134,83 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Authentication" + ] } }, "/backups/alerts": { "get": { - "tags": [ - "Backups" - ], - "summary": "List open backup alerts.", - "description": "Returns all alerts that have not yet been resolved, ordered by `opened_at`\ndescending (newest first). The UI renders these as a banner above the\nBackups page content. Alerts are auto-opened by the watcher and\nauto-resolved when the triggering condition clears.\n\n**Schedule overdue** \u2014 the backup scheduler did not enqueue a job within\nthe expected window (1 hour past `next_run`). Usually means the scheduler\ntask is dead or wedged.\n\n**Job stalled** \u2014 a `backup_jobs` row has been in `state='pending'` for\nmore than 1 hour. The runner never claimed the job. Usually means the\nrunner task is dead or the runner concurrency cap is too low.", + "description": "Returns all alerts that have not yet been resolved, ordered by `opened_at`\ndescending (newest first). The UI renders these as a banner above the\nBackups page content. Alerts are auto-opened by the watcher and\nauto-resolved when the triggering condition clears.\n\n**Schedule overdue** — the backup scheduler did not enqueue a job within\nthe expected window (1 hour past `next_run`). Usually means the scheduler\ntask is dead or wedged.\n\n**Job stalled** — a `backup_jobs` row has been in `state='pending'` for\nmore than 1 hour. The runner never claimed the job. Usually means the\nrunner task is dead or the runner concurrency cap is too low.", "operationId": "list_backup_alerts", "responses": { "200": { - "description": "List of open backup alerts", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupAlertListResponse" } } - } + }, + "description": "List of open backup alerts" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List open backup alerts.", + "tags": [ + "Backups" ] } }, "/backups/cleanup": { "post": { - "tags": [ - "Backups" - ], - "summary": "Preview or run retention using each selected schedule's configured retention days.", "operationId": "cleanup_expired_backups", "parameters": [ { - "name": "dry_run", - "in": "query", "description": "Return the backups selected by retention without deleting anything.", + "in": "query", + "name": "dry_run", "required": false, "schema": { "type": "boolean" } }, { - "name": "schedule_id", - "in": "query", "description": "Limit cleanup to one backup schedule.", + "in": "query", + "name": "schedule_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } } ], @@ -48753,99 +49226,99 @@ }, "responses": { "200": { - "description": "Retention cleanup completed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RetentionCleanupReport" } } - } + }, + "description": "Retention cleanup completed" }, "400": { - "description": "Missing or invalid preview candidate list", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid preview candidate list" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule or backup not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule or backup not found" }, "409": { - "description": "Cleanup preview is stale", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Cleanup preview is stale" }, "500": { - "description": "Cleanup could not be started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Cleanup could not be started" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Preview or run retention using each selected schedule's configured retention days.", + "tags": [ + "Backups" ] } }, "/backups/external-services/{id}/run": { "post": { - "tags": [ - "Backups" - ], - "summary": "Run a backup for an external service manually.", - "description": "Enqueues the backup for asynchronous execution via the `BackupRunner`\n(ADR-014). Returns `202 Accepted` immediately: pending parent and child\nrows are inserted, and a `backup_jobs` row is enqueued for the resolved\nengine. Poll `GET /backups/{id}` to observe `pending \u2192 running \u2192 completed`.", + "description": "Enqueues the backup for asynchronous execution via the `BackupRunner`\n(ADR-014). Returns `202 Accepted` immediately: pending parent and child\nrows are inserted, and a `backup_jobs` row is enqueued for the resolved\nengine. Poll `GET /backups/{id}` to observe `pending → running → completed`.", "operationId": "run_external_service_backup", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -48861,266 +49334,266 @@ }, "responses": { "202": { - "description": "Backup enqueued for async execution", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceBackupResponse" } } - } + }, + "description": "Backup enqueued for async execution" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "404": { - "description": "External service or S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "External service or S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Run a backup for an external service manually.", + "tags": [ + "Backups" ] } }, "/backups/external-services/{service_id}/backups": { "get": { - "tags": [ - "Backups" - ], - "summary": "List all backups for a specific external service (DB-only, no S3 scan).", "description": "Returns a paginated list of backups that belong to this service.\nCompletes in <100 ms regardless of S3 endpoint latency because it\nnever touches S3.", "operationId": "list_external_service_backups", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based). Defaults to 1.", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page. Defaults to 20, max 100.", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Paginated list of backups for this service", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceBackupListResponse" } } - } + }, + "description": "Paginated list of backups for this service" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List all backups for a specific external service (DB-only, no S3 scan).", + "tags": [ + "Backups" ] } }, "/backups/external-services/{service_id}/schedules": { "get": { - "tags": [ - "Backups" - ], - "summary": "List the schedules that target a specific external service. Useful for\nthe service detail page (\"which schedules back this DB up?\").", "operationId": "list_service_schedules", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Schedules backing up this service", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/BackupScheduleResponse" - } + }, + "type": "array" } } - } + }, + "description": "Schedules backing up this service" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Service not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Service not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the schedules that target a specific external service. Useful for\nthe service detail page (\"which schedules back this DB up?\").", + "tags": [ + "Backups" ] } }, "/backups/s3-sources": { "get": { - "tags": [ - "Backups" - ], - "summary": "List all S3 sources", "operationId": "list_s3_sources", "responses": { "200": { - "description": "List of S3 sources", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/S3SourceResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of S3 sources" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List all S3 sources", + "tags": [ + "Backups" ] }, "post": { - "tags": [ - "Backups" - ], - "summary": "Create a new S3 source", "operationId": "create_s3_source", "requestBody": { "content": { @@ -49134,59 +49607,59 @@ }, "responses": { "201": { - "description": "S3 source created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3SourceResponse" } } - } + }, + "description": "S3 source created" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Create a new S3 source", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/test": { "post": { - "tags": [ - "Backups" - ], - "summary": "Test S3 connectivity against a prospective source configuration (before creating it).\nThe credentials are NOT persisted. Useful for validating the form in the UI.", "operationId": "test_s3_connection_preview", "requestBody": { "content": { @@ -49200,171 +49673,171 @@ }, "responses": { "200": { - "description": "Connection test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3ConnectionTestResponse" } } - } + }, + "description": "Connection test result" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Test S3 connectivity against a prospective source configuration (before creating it).\nThe credentials are NOT persisted. Useful for validating the form in the UI.", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/{id}": { - "get": { - "tags": [ - "Backups" - ], - "summary": "Get an S3 source by ID", - "operationId": "get_s3_source", + "delete": { + "operationId": "delete_s3_source", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "S3 source details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/S3SourceResponse" - } - } - } + "204": { + "description": "S3 source deleted" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Backups" ], "summary": "Delete an S3 source", - "operationId": "delete_s3_source", + "tags": [ + "Backups" + ] + }, + "get": { + "operationId": "get_s3_source", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "S3 source deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/S3SourceResponse" + } + } + }, + "description": "S3 source details" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get an S3 source by ID", + "tags": [ + "Backups" ] }, "patch": { - "tags": [ - "Backups" - ], - "summary": "Update an S3 source", "operationId": "update_s3_source", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -49380,90 +49853,90 @@ }, "responses": { "200": { - "description": "S3 source updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3SourceResponse" } } - } + }, + "description": "S3 source updated" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update an S3 source", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/{id}/backups": { "get": { - "tags": [ - "Backups" - ], - "summary": "List all backups in an S3 source", "operationId": "list_source_backups", "parameters": [ { - "name": "include_s3_scan", + "description": "When `true`, scan the S3 bucket for backups not tracked in the\nlocal database (useful after disaster-recovery from another Temps\ninstance). Defaults to `false` — the fast DB-only path.", "in": "query", - "description": "When `true`, scan the S3 bucket for backups not tracked in the\nlocal database (useful after disaster-recovery from another Temps\ninstance). Defaults to `false` \u2014 the fast DB-only path.", + "name": "include_s3_scan", "required": false, "schema": { "type": "boolean" } }, { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of all backups in the source", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SourceBackupIndexResponse" } } - } + }, + "description": "List of all backups in the source" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { "description": "S3 source not found" @@ -49476,25 +49949,25 @@ { "bearer_auth": [] } + ], + "summary": "List all backups in an S3 source", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/{id}/run": { "post": { - "tags": [ - "Backups" - ], - "summary": "Run a backup immediately for an S3 source.", - "description": "Enqueues the backup for asynchronous execution via the `BackupRunner`\n(ADR-014). Returns `202 Accepted` immediately: a `backups` row is inserted\nwith `state='pending'` and a `backup_jobs` row is enqueued for the\n`ControlPlaneEngine`. Poll `GET /backups/{id}` to observe\n`pending \u2192 running \u2192 completed`.", + "description": "Enqueues the backup for asynchronous execution via the `BackupRunner`\n(ADR-014). Returns `202 Accepted` immediately: a `backups` row is inserted\nwith `state='pending'` and a `backup_jobs` row is enqueued for the\n`ControlPlaneEngine`. Poll `GET /backups/{id}` to observe\n`pending → running → completed`.", "operationId": "run_backup_for_source", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -49510,389 +49983,389 @@ }, "responses": { "202": { - "description": "Backup enqueued for async execution", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupResponse" } } - } + }, + "description": "Backup enqueued for async execution" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Run a backup immediately for an S3 source.", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/{id}/set-default": { "post": { - "tags": [ - "Backups" - ], - "summary": "Mark an S3 source as the default. All new backups/schedules/services that do not\nexplicitly reference a source will use the default. Returns the updated source.", "operationId": "set_default_s3_source", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "S3 source marked as default", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3SourceResponse" } } - } + }, + "description": "S3 source marked as default" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Mark an S3 source as the default. All new backups/schedules/services that do not\nexplicitly reference a source will use the default. Returns the updated source.", + "tags": [ + "Backups" ] } }, "/backups/s3-sources/{id}/test": { "post": { - "tags": [ - "Backups" - ], - "summary": "Test connectivity to an existing S3 source using its stored credentials.", "operationId": "test_s3_source_connection", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Connection test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3ConnectionTestResponse" } } - } + }, + "description": "Connection test result" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "S3 source not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "S3 source not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Test connectivity to an existing S3 source using its stored credentials.", + "tags": [ + "Backups" ] } }, "/backups/schedule-runs/{id}/cancel": { "post": { - "tags": [ - "Backups" - ], - "summary": "Cancel every non-terminal child backup belonging to a schedule run.", "description": "Loops over `state IN ('pending','running')` children and flips each via\nthe same path as the per-backup cancel endpoint. The parent\n`schedule_runs.finished_at` is stamped automatically once no live\nchildren remain. Idempotent: cancelling a run with no live children is\na 200 with `cancelled = 0`.", "operationId": "cancel_schedule_run", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Cancel processed (idempotent)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CancelBackupResponse" } } - } + }, + "description": "Cancel processed (idempotent)" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule run not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule run not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Cancel every non-terminal child backup belonging to a schedule run.", + "tags": [ + "Backups" ] } }, "/backups/schedule-runs/{id}/jobs": { "get": { - "tags": [ - "Backups" - ], - "summary": "List the individual backup jobs for a single scheduler run.", "description": "Returns each child `backups` row joined with its external service name and\nthe most-recent `backup_jobs` engine key. Used by the schedule detail\naccordion to show per-job detail on row expand.\n\n`page_size` defaults to 50 and is capped at 200.", "operationId": "list_schedule_run_jobs", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Jobs for this scheduler run", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ScheduleRunJobEntry" - } + }, + "type": "array" } } - } + }, + "description": "Jobs for this scheduler run" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the individual backup jobs for a single scheduler run.", + "tags": [ + "Backups" ] } }, "/backups/schedules": { "get": { - "tags": [ - "Backups" - ], - "summary": "List all backup schedules", "operationId": "list_backup_schedules", "responses": { "200": { - "description": "List of backup schedules", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/BackupScheduleResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of backup schedules" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List all backup schedules", + "tags": [ + "Backups" ] }, "post": { - "tags": [ - "Backups" - ], - "summary": "Create a new backup schedule", "operationId": "create_backup_schedule", "requestBody": { "content": { @@ -49906,76 +50379,83 @@ }, "responses": { "201": { - "description": "Backup schedule created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupScheduleResponse" } } - } + }, + "description": "Backup schedule created" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Create a new backup schedule", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}": { - "get": { - "tags": [ - "Backups" - ], - "summary": "Get a backup schedule by ID", - "operationId": "get_backup_schedule", + "delete": { + "operationId": "delete_backup_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Backup schedule details", + "204": { + "description": "Backup schedule deleted" + }, + "404": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/BackupScheduleResponse" + "$ref": "#/components/schemas/ProblemDetails" } } - } - }, - "404": { + }, "description": "Backup schedule not found" }, "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, "description": "Internal server error" } }, @@ -49983,71 +50463,64 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Backups" ], "summary": "Delete a backup schedule", - "operationId": "delete_backup_schedule", + "tags": [ + "Backups" + ] + }, + "get": { + "operationId": "get_backup_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Backup schedule deleted" - }, - "404": { - "description": "Backup schedule not found", + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProblemDetails" + "$ref": "#/components/schemas/BackupScheduleResponse" } } - } + }, + "description": "Backup schedule details" + }, + "404": { + "description": "Backup schedule not found" }, "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get a backup schedule by ID", + "tags": [ + "Backups" ] }, "patch": { - "tags": [ - "Backups" - ], - "summary": "Update a backup schedule (partial update).", "description": "All request fields are optional; only fields that are present in the\nJSON body are updated. Absent fields leave the corresponding column\nunchanged. If `schedule_expression` is changed, `next_run` is\nrecomputed automatically.", "operationId": "update_backup_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -50063,94 +50536,94 @@ }, "responses": { "200": { - "description": "Schedule updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupScheduleResponse" } } - } + }, + "description": "Schedule updated" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Schedule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update a backup schedule (partial update).", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/backups": { "get": { - "tags": [ - "Backups" - ], - "summary": "List backups for a schedule", "operationId": "list_backups_for_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of backups for the schedule", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/BackupResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of backups for the schedule" }, "404": { "description": "Backup schedule not found" @@ -50163,37 +50636,37 @@ { "bearer_auth": [] } + ], + "summary": "List backups for a schedule", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/disable": { "patch": { - "tags": [ - "Backups" - ], - "summary": "Disable a backup schedule", "operationId": "disable_backup_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Backup schedule disabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupScheduleResponse" } } - } + }, + "description": "Backup schedule disabled" }, "404": { "description": "Backup schedule not found" @@ -50206,37 +50679,37 @@ { "bearer_auth": [] } + ], + "summary": "Disable a backup schedule", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/enable": { "patch": { - "tags": [ - "Backups" - ], - "summary": "Enable a backup schedule", "operationId": "enable_backup_schedule", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Backup schedule enabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BackupScheduleResponse" } } - } + }, + "description": "Backup schedule enabled" }, "404": { "description": "Backup schedule not found" @@ -50249,290 +50722,290 @@ { "bearer_auth": [] } + ], + "summary": "Enable a backup schedule", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/run": { "post": { - "tags": [ - "Backups" - ], - "summary": "Immediately fan-out a run for the given schedule (Run Now).", - "description": "Creates one `schedule_runs` row, one control-plane backup job, and one\nbackup job per supported external service \u2014 all in a single transaction.\nReturns `202 Accepted` with a [`ScheduleRunResponse`] containing the new\n`schedule_run_id` and the list of enqueued jobs. Returns `409 Conflict` if\na run for this schedule is already in flight or if the schedule is disabled.", + "description": "Creates one `schedule_runs` row, one control-plane backup job, and one\nbackup job per supported external service — all in a single transaction.\nReturns `202 Accepted` with a [`ScheduleRunResponse`] containing the new\n`schedule_run_id` and the list of enqueued jobs. Returns `409 Conflict` if\na run for this schedule is already in flight or if the schedule is disabled.", "operationId": "run_schedule_now", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "202": { - "description": "Fan-out run enqueued for async execution", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduleRunResponse" } } - } + }, + "description": "Fan-out run enqueued for async execution" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule not found" }, "409": { - "description": "Run already in flight or schedule disabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Run already in flight or schedule disabled" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Immediately fan-out a run for the given schedule (Run Now).", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/runs": { "get": { - "tags": [ - "Backups" - ], - "summary": "Paginated run history for a backup schedule (one row per scheduler tick).", "description": "Returns one [`ScheduleRunSummary`] per scheduler tick, with child backup\ncounts aggregated in a single SQL round-trip. Legacy `backups` rows (pre-\nfan-out) are surfaced as synthetic single-job runs so history does not\ndisappear. Ordered by `started_at DESC` (newest first).\n\nUse `GET /backups/schedule-runs/{run_id}/jobs` to drill into a single run.", "operationId": "list_schedule_runs", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-based, defaults to 1, clamped to 1 if < 1).", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (defaults to 20, clamped to 100 if > 100).", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Paginated run history for the schedule", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduleRunSummaryList" } } - } + }, + "description": "Paginated run history for the schedule" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Paginated run history for a backup schedule (one row per scheduler tick).", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/services": { "get": { - "tags": [ - "Backups" - ], - "summary": "List the external services attached to a backup schedule.", "operationId": "list_schedule_services", "parameters": [ { - "name": "id", - "in": "path", "description": "Schedule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Services attached to this schedule", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ExternalServiceSummary" - } + }, + "type": "array" } } - } + }, + "description": "Services attached to this schedule" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the external services attached to a backup schedule.", + "tags": [ + "Backups" ] }, "post": { - "tags": [ - "Backups" - ], - "summary": "Attach one or more external services to a backup schedule. Idempotent \u2014\nservices that are already attached are silently skipped (`ON CONFLICT\nDO NOTHING`). Returns the count of newly inserted rows + the total\nmembership after the operation.", "operationId": "attach_schedule_services", "parameters": [ { - "name": "id", - "in": "path", "description": "Schedule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -50548,99 +51021,99 @@ }, "responses": { "200": { - "description": "Services attached", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttachScheduleServicesResponse" } } - } + }, + "description": "Services attached" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Schedule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Schedule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Attach one or more external services to a backup schedule. Idempotent —\nservices that are already attached are silently skipped (`ON CONFLICT\nDO NOTHING`). Returns the count of newly inserted rows + the total\nmembership after the operation.", + "tags": [ + "Backups" ] } }, "/backups/schedules/{id}/services/{service_id}": { "delete": { - "tags": [ - "Backups" - ], - "summary": "Detach a single external service from a backup schedule. Idempotent \u2014\nreturns `204` whether or not a row was actually removed.", "operationId": "detach_schedule_service", "parameters": [ { - "name": "id", - "in": "path", "description": "Schedule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "service_id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -50649,54 +51122,55 @@ "description": "Service detached (or was not attached)" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Detach a single external service from a backup schedule. Idempotent —\nreturns `204` whether or not a row was actually removed.", + "tags": [ + "Backups" ] } }, "/backups/{id}": { - "get": { - "tags": [ - "Backups" - ], - "summary": "Get a backup by ID", - "operationId": "get_backup", + "delete": { + "operationId": "delete_backup", "parameters": [ { - "name": "id", + "description": "Backup UUID", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -50704,64 +51178,86 @@ } ], "responses": { - "200": { - "description": "Backup details", + "204": { + "description": "Backup deleted" + }, + "400": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/BackupResponse" + "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup artifact cannot be safely attributed" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Backup not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup not found" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Backup is running, referenced, or lacks safe artifact identity" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Object storage or database error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Backups" ], "summary": "Permanently delete one terminal backup from object storage and the database.", - "operationId": "delete_backup", + "tags": [ + "Backups" + ] + }, + "get": { + "operationId": "get_backup", "parameters": [ { - "name": "id", "in": "path", - "description": "Backup UUID", + "name": "id", "required": true, "schema": { "type": "string" @@ -50769,435 +51265,412 @@ } ], "responses": { - "204": { - "description": "Backup deleted" - }, - "400": { - "description": "Backup artifact cannot be safely attributed", + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProblemDetails" + "$ref": "#/components/schemas/BackupResponse" } } - } + }, + "description": "Backup details" }, "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Backup not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "409": { - "description": "Backup is running, referenced, or lacks safe artifact identity", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup not found" }, "500": { - "description": "Object storage or database error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get a backup by ID", + "tags": [ + "Backups" ] } }, "/backups/{id}/cancel": { "post": { - "tags": [ - "Backups" - ], - "summary": "Cancel a single in-flight backup.", - "description": "Flips the parent `backups` row + its latest `backup_jobs` row to\n`failed` with reason `\"cancelled by user \"`. The in-process\n`CancellationToken` is observed on the next heartbeat tick (\u22645s), so the\nengine exits cleanly and rollback reaps the sidecar. Idempotent: cancelling\nan already-terminal backup is a 200 with `cancelled = 0`.", + "description": "Flips the parent `backups` row + its latest `backup_jobs` row to\n`failed` with reason `\"cancelled by user \"`. The in-process\n`CancellationToken` is observed on the next heartbeat tick (≤5s), so the\nengine exits cleanly and rollback reaps the sidecar. Idempotent: cancelling\nan already-terminal backup is a 200 with `cancelled = 0`.", "operationId": "cancel_backup", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Cancel processed (idempotent)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CancelBackupResponse" } } - } + }, + "description": "Cancel processed (idempotent)" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Backup not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Cancel a single in-flight backup.", + "tags": [ + "Backups" ] } }, "/backups/{id}/children": { "get": { - "tags": [ - "Backups" - ], - "summary": "List the external-service child backups that belong to a parent backup.", - "description": "Each entry in `children` corresponds to one `external_service_backups` row,\njoined with `external_services` so the caller receives the service name and\ntype without a second request.\n\nReturns an empty `{ \"children\": [] }` \u2014 **not 404** \u2014 when the parent\nbackup exists but has no children (e.g. control-plane backups).\nReturns 404 when the parent backup itself does not exist.", + "description": "Each entry in `children` corresponds to one `external_service_backups` row,\njoined with `external_services` so the caller receives the service name and\ntype without a second request.\n\nReturns an empty `{ \"children\": [] }` — **not 404** — when the parent\nbackup exists but has no children (e.g. control-plane backups).\nReturns 404 when the parent backup itself does not exist.", "operationId": "list_backup_children", "parameters": [ { - "name": "id", - "in": "path", "description": "Integer row id of the parent backup", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Child backup list (may be empty)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChildBackupListResponse" } } - } + }, + "description": "Child backup list (may be empty)" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Parent backup not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Parent backup not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the external-service child backups that belong to a parent backup.", + "tags": [ + "Backups" ] } }, "/blob": { - "get": { - "tags": [ - "Blob" - ], - "summary": "List blobs", - "operationId": "blob_list", - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "Maximum number of items to return", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "prefix", - "in": "query", - "description": "Prefix to filter by", - "required": false, - "schema": { - "type": "string" + "delete": { + "operationId": "blob_delete", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteBlobRequest" + } } }, - { - "name": "cursor", - "in": "query", - "description": "Continuation token for pagination", - "required": false, - "schema": { - "type": "string" - } - } - ], + "required": true + }, "responses": { "200": { - "description": "List of blobs", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ListBlobsResponse" + "$ref": "#/components/schemas/DeleteBlobResponse" } } - } + }, + "description": "Blobs deleted successfully" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "post": { + ], + "summary": "Delete blobs", "tags": [ "Blob" - ], - "summary": "Upload a blob", - "operationId": "blob_put", - "requestBody": { - "description": "Binary blob data", - "content": { - "application/octet-stream": { - "schema": { - "type": "string" - } + ] + }, + "get": { + "operationId": "blob_list", + "parameters": [ + { + "description": "Maximum number of items to return", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "format": "int32", + "type": "integer" } }, - "required": true - }, - "responses": { - "201": { - "description": "Blob uploaded successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BlobResponse" - } - } + { + "description": "Prefix to filter by", + "in": "query", + "name": "prefix", + "required": false, + "schema": { + "type": "string" } }, - "400": { - "description": "Invalid request", + { + "description": "Continuation token for pagination", + "in": "query", + "name": "cursor", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProblemDetails" + "$ref": "#/components/schemas/ListBlobsResponse" } } - } + }, + "description": "List of blobs" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "List blobs", "tags": [ "Blob" - ], - "summary": "Delete blobs", - "operationId": "blob_delete", + ] + }, + "post": { + "operationId": "blob_put", "requestBody": { "content": { - "application/json": { + "application/octet-stream": { "schema": { - "$ref": "#/components/schemas/DeleteBlobRequest" + "type": "string" } } }, + "description": "Binary blob data", "required": true }, "responses": { - "200": { - "description": "Blobs deleted successfully", + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteBlobResponse" + "$ref": "#/components/schemas/BlobResponse" } } - } + }, + "description": "Blob uploaded successfully" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Upload a blob", + "tags": [ + "Blob" ] } }, "/blob/copy": { "post": { - "tags": [ - "Blob" - ], - "summary": "Copy a blob to a new location", "operationId": "blob_copy", "requestBody": { "content": { @@ -51211,80 +51684,80 @@ }, "responses": { "200": { - "description": "Blob copied successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BlobResponse" } } - } + }, + "description": "Blob copied successfully" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Source blob not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Source blob not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Copy a blob to a new location", + "tags": [ + "Blob" ] } }, "/blob/disable": { "delete": { - "tags": [ - "Blob Management" - ], - "summary": "Disable Blob service", "operationId": "blob_disable", "responses": { "200": { - "description": "Blob service disabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DisableBlobResponse" } } - } + }, + "description": "Blob service disabled" }, "401": { "description": "Unauthorized" @@ -51300,15 +51773,15 @@ { "bearer_auth": [] } + ], + "summary": "Disable Blob service", + "tags": [ + "Blob Management" ] } }, "/blob/enable": { "post": { - "tags": [ - "Blob Management" - ], - "summary": "Enable Blob service", "operationId": "blob_enable", "requestBody": { "content": { @@ -51322,14 +51795,14 @@ }, "responses": { "200": { - "description": "Blob service enabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnableBlobResponse" } } - } + }, + "description": "Blob service enabled" }, "401": { "description": "Unauthorized" @@ -51342,26 +51815,26 @@ { "bearer_auth": [] } + ], + "summary": "Enable Blob service", + "tags": [ + "Blob Management" ] } }, "/blob/status": { "get": { - "tags": [ - "Blob Management" - ], - "summary": "Get Blob service status", "operationId": "blob_status", "responses": { "200": { - "description": "Blob service status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BlobStatusResponse" } } - } + }, + "description": "Blob service status" }, "401": { "description": "Unauthorized" @@ -51374,15 +51847,15 @@ { "bearer_auth": [] } + ], + "summary": "Get Blob service status", + "tags": [ + "Blob Management" ] } }, "/blob/update": { "patch": { - "tags": [ - "Blob Management" - ], - "summary": "Update Blob service configuration", "operationId": "blob_update", "requestBody": { "content": { @@ -51396,14 +51869,14 @@ }, "responses": { "200": { - "description": "Blob service updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateBlobResponse" } } - } + }, + "description": "Blob service updated" }, "401": { "description": "Unauthorized" @@ -51419,31 +51892,31 @@ { "bearer_auth": [] } + ], + "summary": "Update Blob service configuration", + "tags": [ + "Blob Management" ] } }, "/blob/{project_id}/{path}": { "get": { - "tags": [ - "Blob" - ], - "summary": "Download a blob", "operationId": "blob_download", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", - "in": "path", "description": "Blob path", + "in": "path", + "name": "path", "required": true, "schema": { "type": "string" @@ -51455,53 +51928,53 @@ "description": "Blob content" }, "404": { - "description": "Blob not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Blob not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Download a blob", + "tags": [ + "Blob" ] }, "head": { - "tags": [ - "Blob" - ], - "summary": "Get blob metadata", "operationId": "blob_head", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", - "in": "path", "description": "Blob path", + "in": "path", + "name": "path", "required": true, "schema": { "type": "string" @@ -51513,64 +51986,64 @@ "description": "Blob metadata in headers" }, "404": { - "description": "Blob not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Blob not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get blob metadata", + "tags": [ + "Blob" ] } }, "/dashboard/projects-analytics": { "get": { - "tags": [ - "Events" - ], - "summary": "Get dashboard analytics for multiple projects in a single batch request", - "description": "Returns unique visitor counts and hourly sparkline data for all requested projects\nusing only 2 SQL queries instead of 2\u00d7N per-project queries.", + "description": "Returns unique visitor counts and hourly sparkline data for all requested projects\nusing only 2 SQL queries instead of 2×N per-project queries.", "operationId": "get_dashboard_projects_analytics", "parameters": [ { - "name": "project_ids", - "in": "query", "description": "Comma-separated list of project IDs", + "in": "query", + "name": "project_ids", "required": true, "schema": { "type": "string" } }, { - "name": "start_date", - "in": "query", "description": "Start date for filtering", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" @@ -51579,14 +52052,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved batch analytics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DashboardProjectsAnalyticsResponse" } } - } + }, + "description": "Successfully retrieved batch analytics" }, "400": { "description": "Bad request" @@ -51602,58 +52075,58 @@ { "bearer_auth": [] } + ], + "summary": "Get dashboard analytics for multiple projects in a single batch request", + "tags": [ + "Events" ] } }, "/deployments/activity-graph": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get deployment activity graph showing daily deployment counts\nSimilar to GitHub's contribution graph", "operationId": "get_activity_graph", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID (optional)", + "in": "query", + "name": "project_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "days", - "in": "query", "description": "Number of days to include (default: 365)", + "in": "query", + "name": "days", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved activity graph", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActivityGraphResponse" } } - } + }, + "description": "Successfully retrieved activity graph" }, "401": { "description": "Unauthorized" @@ -51666,149 +52139,149 @@ { "bearer_auth": [] } + ], + "summary": "Get deployment activity graph showing daily deployment counts\nSimilar to GitHub's contribution graph", + "tags": [ + "Deployments" ] } }, "/deployments/{deployment_id}/vulnerability-scan": { "get": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "get_scan_by_deployment", "parameters": [ { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Scan for the specified deployment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScanResponse" } } - } + }, + "description": "Scan for the specified deployment" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "No scan found for deployment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "No scan found for deployment" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/deployments/{id}/metrics": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Fetch a time-series range for a single metric on a deployment.", "operationId": "DeploymentMetricsGetRange", "parameters": [ { - "name": "id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric", - "in": "query", "description": "Metric name, e.g. `\"pg.connections_active\"`.", + "in": "query", + "name": "metric", "required": true, "schema": { "type": "string" } }, { - "name": "range", - "in": "query", "description": "Time window: `\"1h\"` | `\"6h\"` | `\"24h\"` | `\"7d\"`.", + "in": "query", + "name": "range", "required": false, "schema": { "type": "string" } }, { - "name": "percentile", + "description": "Optional histogram percentile (0–100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", "in": "query", - "description": "Optional histogram percentile (0\u2013100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", + "name": "percentile", "required": false, "schema": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] } } ], "responses": { "200": { - "description": "Metric time series data points", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/MetricDataPoint" - } + }, + "type": "array" } } - } + }, + "description": "Metric time series data points" }, "400": { "description": "Invalid query parameters" @@ -51827,26 +52300,26 @@ { "bearer_auth": [] } + ], + "summary": "Fetch a time-series range for a single metric on a deployment.", + "tags": [ + "Metrics" ] } }, "/deployments/{id}/metrics/enable": { "patch": { - "tags": [ - "Metrics" - ], - "summary": "Enable or disable OTLP metric ingestion for a deployment.", "description": "When `enabled=true`, seeds the default container alert rules for the\ndeployment via [`temps_monitoring::seed_default_container_rules`] (idempotent).", "operationId": "DeploymentMetricsToggle", "parameters": [ { - "name": "id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -51881,45 +52354,45 @@ { "bearer_auth": [] } + ], + "summary": "Enable or disable OTLP metric ingestion for a deployment.", + "tags": [ + "Metrics" ] } }, "/deployments/{id}/metrics/latest": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Fetch the most-recent metric values for a deployment.", "operationId": "DeploymentMetricsGetLatest", "parameters": [ { - "name": "id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Map of metric name to latest value", "content": { "application/json": { "schema": { - "type": "object", "additionalProperties": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "propertyNames": { "type": "string" - } + }, + "type": "object" } } - } + }, + "description": "Map of metric name to latest value" }, "401": { "description": "Unauthorized" @@ -51935,29 +52408,29 @@ { "bearer_auth": [] } + ], + "summary": "Fetch the most-recent metric values for a deployment.", + "tags": [ + "Metrics" ] } }, "/dns-providers": { "get": { - "tags": [ - "DNS Providers" - ], - "summary": "List all DNS providers", "operationId": "list_dns_providers", "responses": { "200": { - "description": "List of DNS providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsProviderResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of DNS providers" }, "401": { "description": "Unauthorized" @@ -51970,13 +52443,13 @@ { "bearer_auth": [] } + ], + "summary": "List all DNS providers", + "tags": [ + "DNS Providers" ] }, "post": { - "tags": [ - "DNS Providers" - ], - "summary": "Create a new DNS provider", "description": "The provider's credentials will be tested before creation.\nIf the connection test fails, the provider will not be created.", "operationId": "create_dns_provider", "requestBody": { @@ -51991,14 +52464,14 @@ }, "responses": { "201": { - "description": "DNS provider created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsProviderResponse" } } - } + }, + "description": "DNS provider created" }, "400": { "description": "Invalid request or connection test failed" @@ -52014,37 +52487,74 @@ { "bearer_auth": [] } + ], + "summary": "Create a new DNS provider", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{id}": { - "get": { + "delete": { + "operationId": "delete_dns_provider", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "DNS provider deleted" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Provider not found" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Delete a DNS provider", "tags": [ "DNS Providers" - ], - "summary": "Get a DNS provider by ID", + ] + }, + "get": { "operationId": "get_dns_provider", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "DNS provider details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsProviderResponse" } } - } + }, + "description": "DNS provider details" }, "401": { "description": "Unauthorized" @@ -52060,23 +52570,23 @@ { "bearer_auth": [] } + ], + "summary": "Get a DNS provider by ID", + "tags": [ + "DNS Providers" ] }, "put": { - "tags": [ - "DNS Providers" - ], - "summary": "Update a DNS provider", "description": "If new credentials are supplied, they are tested before the update is\npersisted (same as creation) -- otherwise a provider's credentials (and,\nfor Pebble, its target URL) could be swapped for something invalid or\nunsafe without ever going through validation.", "operationId": "update_provider", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -52092,14 +52602,14 @@ }, "responses": { "200": { - "description": "DNS provider updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsProviderResponse" } } - } + }, + "description": "DNS provider updated" }, "400": { "description": "Invalid request" @@ -52118,77 +52628,40 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Update a DNS provider", "tags": [ "DNS Providers" - ], - "summary": "Delete a DNS provider", - "operationId": "delete_dns_provider", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "DNS provider deleted" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Insufficient permissions" - }, - "404": { - "description": "Provider not found" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/dns-providers/{id}/domains": { "get": { - "tags": [ - "DNS Providers" - ], - "summary": "List managed domains for a provider", "operationId": "list_managed_domains", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of managed domains", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ManagedDomainResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of managed domains" }, "401": { "description": "Unauthorized" @@ -52204,22 +52677,22 @@ { "bearer_auth": [] } + ], + "summary": "List managed domains for a provider", + "tags": [ + "DNS Providers" ] }, "post": { - "tags": [ - "DNS Providers" - ], - "summary": "Add a managed domain to a provider", "operationId": "add_managed_domain", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -52235,14 +52708,14 @@ }, "responses": { "201": { - "description": "Managed domain added", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ManagedDomainResponse" } } - } + }, + "description": "Managed domain added" }, "400": { "description": "Invalid request" @@ -52261,37 +52734,37 @@ { "bearer_auth": [] } + ], + "summary": "Add a managed domain to a provider", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{id}/test": { "post": { - "tags": [ - "DNS Providers" - ], - "summary": "Test provider connection", "operationId": "test_provider_connection", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Connection test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectionTestResult" } } - } + }, + "description": "Connection test result" }, "401": { "description": "Unauthorized" @@ -52307,37 +52780,37 @@ { "bearer_auth": [] } + ], + "summary": "Test provider connection", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{id}/zones": { "get": { - "tags": [ - "DNS Providers" - ], - "summary": "List zones available in a provider", "operationId": "list_provider_zones", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of zones", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ZoneListResponse" } } - } + }, + "description": "List of zones" }, "401": { "description": "Unauthorized" @@ -52353,29 +52826,29 @@ { "bearer_auth": [] } + ], + "summary": "List zones available in a provider", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{provider_id}/domains/{domain}": { "delete": { - "tags": [ - "DNS Providers" - ], - "summary": "Remove a managed domain", "operationId": "remove_managed_domain", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52400,27 +52873,27 @@ { "bearer_auth": [] } + ], + "summary": "Remove a managed domain", + "tags": [ + "DNS Providers" ] }, "patch": { - "tags": [ - "DNS Providers" - ], - "summary": "Update a managed domain's settings (hostname mode, sync opt-in, auto-manage).", "operationId": "update_managed_domain", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52439,14 +52912,14 @@ }, "responses": { "200": { - "description": "Managed domain updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ManagedDomainResponse" } } - } + }, + "description": "Managed domain updated" }, "401": { "description": "Unauthorized" @@ -52462,29 +52935,29 @@ { "bearer_auth": [] } + ], + "summary": "Update a managed domain's settings (hostname mode, sync opt-in, auto-manage).", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{provider_id}/domains/{domain}/apply-hostname-mode": { "post": { - "tags": [ - "DNS Providers" - ], - "summary": "Apply a hostname mode to a managed domain (persist + optional DNS sync +\nroute reload).", "operationId": "apply_hostname_mode", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52503,14 +52976,14 @@ }, "responses": { "200": { - "description": "Hostname mode applied", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HostnamePreviewResponse" } } - } + }, + "description": "Hostname mode applied" }, "401": { "description": "Unauthorized" @@ -52526,47 +52999,47 @@ { "bearer_auth": [] } + ], + "summary": "Apply a hostname mode to a managed domain (persist + optional DNS sync +\nroute reload).", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{provider_id}/domains/{domain}/hostname-preview": { "get": { - "tags": [ - "DNS Providers" - ], - "summary": "Preview the impact of switching a managed domain's hostname mode.", "operationId": "preview_hostname_mode", "parameters": [ { - "name": "mode", - "in": "query", "description": "Target mode: standard|flat", + "in": "query", + "name": "mode", "required": true, "schema": { "type": "string" } }, { - "name": "sync", - "in": "query", "description": "Include DNS record changes", + "in": "query", + "name": "sync", "required": false, "schema": { "type": "boolean" } }, { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52575,14 +53048,14 @@ ], "responses": { "200": { - "description": "Hostname mode preview", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HostnamePreviewResponse" } } - } + }, + "description": "Hostname mode preview" }, "401": { "description": "Unauthorized" @@ -52598,29 +53071,29 @@ { "bearer_auth": [] } + ], + "summary": "Preview the impact of switching a managed domain's hostname mode.", + "tags": [ + "DNS Providers" ] } }, "/dns-providers/{provider_id}/domains/{domain}/verify": { "post": { - "tags": [ - "DNS Providers" - ], - "summary": "Verify a managed domain", "operationId": "verify_managed_domain", "parameters": [ { - "name": "provider_id", "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52629,14 +53102,14 @@ ], "responses": { "200": { - "description": "Domain verification result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ManagedDomainResponse" } } - } + }, + "description": "Domain verification result" }, "401": { "description": "Unauthorized" @@ -52652,21 +53125,21 @@ { "bearer_auth": [] } + ], + "summary": "Verify a managed domain", + "tags": [ + "DNS Providers" ] } }, "/dns/lookup": { "get": { - "tags": [ - "DNS" - ], - "summary": "Lookup DNS A records for a domain", "operationId": "lookup_dns_a_records", "parameters": [ { - "name": "domain", - "in": "query", "description": "Domain name to lookup", + "in": "query", + "name": "domain", "required": true, "schema": { "type": "string" @@ -52675,90 +53148,90 @@ ], "responses": { "200": { - "description": "Successfully retrieved DNS A records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsLookupResponse" } } - } + }, + "description": "Successfully retrieved DNS A records" }, "400": { - "description": "Invalid domain name or lookup failed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsLookupError" } } - } + }, + "description": "Invalid domain name or lookup failed" } - } + }, + "summary": "Lookup DNS A records for a domain", + "tags": [ + "DNS" + ] } }, "/domains": { "get": { - "tags": [ - "Domains" - ], - "summary": "List all domains", "operationId": "list_domains", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "search", - "in": "query", "description": "Search domains by name (substring match)", + "example": "example.com", + "in": "query", + "name": "search", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "example.com" + } } ], "responses": { "200": { - "description": "Domains retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListDomainsResponse" } } - } + }, + "description": "Domains retrieved successfully" }, "401": { "description": "Unauthorized" @@ -52771,13 +53244,13 @@ { "bearer_auth": [] } + ], + "summary": "List all domains", + "tags": [ + "Domains" ] }, "post": { - "tags": [ - "Domains" - ], - "summary": "Create a new domain", "description": "Creates a new domain and automatically requests a Let's Encrypt challenge.\nYou can specify the challenge type (HTTP-01 or DNS-01) in the request.\n\n- **HTTP-01**: Validates domain ownership by placing a file on your web server at `/.well-known/acme-challenge/`\n- **DNS-01**: Validates domain ownership by adding a TXT record to your DNS (required for wildcard domains)", "operationId": "create_domain", "requestBody": { @@ -52792,14 +53265,14 @@ }, "responses": { "201": { - "description": "Domain created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainResponse" } } - } + }, + "description": "Domain created successfully" }, "400": { "description": "Invalid input" @@ -52815,21 +53288,21 @@ { "bearer_auth": [] } + ], + "summary": "Create a new domain", + "tags": [ + "Domains" ] } }, "/domains/by-host/{hostname}": { "get": { - "tags": [ - "Domains" - ], - "summary": "Get domain details by hostname", "operationId": "get_domain_by_host", "parameters": [ { - "name": "hostname", - "in": "path", "description": "Domain hostname", + "in": "path", + "name": "hostname", "required": true, "schema": { "type": "string" @@ -52838,14 +53311,14 @@ ], "responses": { "200": { - "description": "Domain details retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainResponse" } } - } + }, + "description": "Domain details retrieved successfully" }, "401": { "description": "Unauthorized" @@ -52861,22 +53334,22 @@ { "bearer_auth": [] } + ], + "summary": "Get domain details by hostname", + "tags": [ + "Domains" ] } }, "/domains/by-host/{hostname}/cert-status": { "get": { - "tags": [ - "Domains" - ], - "summary": "Get on-demand TLS certificate status for a hostname", - "description": "Returns the current cert lifecycle state for a single hostname (from the\n`domains` row) plus the most recent on-demand issuance attempt (from the\n`on_demand_cert_attempts` audit log). This is the operator's first-line\ndiagnostic, surfaced by `temps domain cert-status` (ADR-018 \u00a75). Returns the\nhostname with `None` fields when no on-demand activity exists for it (never a\n404, so the CLI can render \"no attempts recorded\").", + "description": "Returns the current cert lifecycle state for a single hostname (from the\n`domains` row) plus the most recent on-demand issuance attempt (from the\n`on_demand_cert_attempts` audit log). This is the operator's first-line\ndiagnostic, surfaced by `temps domain cert-status` (ADR-018 §5). Returns the\nhostname with `None` fields when no on-demand activity exists for it (never a\n404, so the CLI can render \"no attempts recorded\").", "operationId": "get_on_demand_cert_status", "parameters": [ { - "name": "hostname", - "in": "path", "description": "Domain hostname", + "in": "path", + "name": "hostname", "required": true, "schema": { "type": "string" @@ -52885,14 +53358,14 @@ ], "responses": { "200": { - "description": "On-demand cert status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CertStatusResponse" } } - } + }, + "description": "On-demand cert status retrieved successfully" }, "401": { "description": "Unauthorized" @@ -52908,59 +53381,59 @@ { "bearer_auth": [] } + ], + "summary": "Get on-demand TLS certificate status for a hostname", + "tags": [ + "Domains" ] } }, "/domains/on-demand-certs": { "get": { - "tags": [ - "Domains" - ], - "summary": "List on-demand TLS certificate attempts", - "description": "Returns rows from the append-only `on_demand_cert_attempts` audit log\n(ADR-018 \u00a75), newest first, each joined with the current authoritative cert\nstate (`status`, `expiration_time`, `backoff_until`) from the `domains` row.\nThis backs the console \"Certificates\" surface. No certificate or private-key\nmaterial is returned \u2014 only audit metadata.", + "description": "Returns rows from the append-only `on_demand_cert_attempts` audit log\n(ADR-018 §5), newest first, each joined with the current authoritative cert\nstate (`status`, `expiration_time`, `backoff_until`) from the `domains` row.\nThis backs the console \"Certificates\" surface. No certificate or private-key\nmaterial is returned — only audit metadata.", "operationId": "list_on_demand_certs", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } } ], "responses": { "200": { - "description": "On-demand cert attempts retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListOnDemandCertsResponse" } } - } + }, + "description": "On-demand cert attempts retrieved successfully" }, "401": { "description": "Unauthorized" @@ -52976,44 +53449,45 @@ { "bearer_auth": [] } + ], + "summary": "List on-demand TLS certificate attempts", + "tags": [ + "Domains" ] } }, "/domains/{domain_id}/order": { - "get": { - "tags": [ - "Domains" - ], - "summary": "Get ACME order for a domain", - "operationId": "get_domain_order", + "delete": { + "description": "Cancels the current ACME order for a domain and clears all challenge data.\nThis allows you to start over with a new order if the previous one failed or got stuck.", + "operationId": "cancel_domain_order", "parameters": [ { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Order retrieved successfully", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AcmeOrderResponse" + "$ref": "#/components/schemas/DomainResponse" } } - } + }, + "description": "Order cancelled successfully" }, "401": { "description": "Unauthorized" }, "404": { - "description": "Order not found" + "description": "Domain not found" }, "500": { "description": "Internal server error" @@ -53023,43 +53497,42 @@ { "bearer_auth": [] } - ] - }, - "post": { + ], + "summary": "Cancel ACME order for a domain", "tags": [ "Domains" - ], - "summary": "Create or recreate ACME order for a domain", - "description": "Creates a new ACME order with Let's Encrypt for the specified domain.\nIf an order already exists, you should cancel it first using the cancel-order endpoint.\nReturns the challenge details that need to be fulfilled (DNS record or HTTP token).", - "operationId": "create_or_recreate_order", + ] + }, + "get": { + "operationId": "get_domain_order", "parameters": [ { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Order created successfully", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DomainChallengeResponse" + "$ref": "#/components/schemas/AcmeOrderResponse" } } - } + }, + "description": "Order retrieved successfully" }, "401": { "description": "Unauthorized" }, "404": { - "description": "Domain not found" + "description": "Order not found" }, "500": { "description": "Internal server error" @@ -53069,37 +53542,37 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Get ACME order for a domain", "tags": [ "Domains" - ], - "summary": "Cancel ACME order for a domain", - "description": "Cancels the current ACME order for a domain and clears all challenge data.\nThis allows you to start over with a new order if the previous one failed or got stuck.", - "operationId": "cancel_domain_order", + ] + }, + "post": { + "description": "Creates a new ACME order with Let's Encrypt for the specified domain.\nIf an order already exists, you should cancel it first using the cancel-order endpoint.\nReturns the challenge details that need to be fulfilled (DNS record or HTTP token).", + "operationId": "create_or_recreate_order", "parameters": [ { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Order cancelled successfully", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DomainResponse" + "$ref": "#/components/schemas/DomainChallengeResponse" } } - } + }, + "description": "Order created successfully" }, "401": { "description": "Unauthorized" @@ -53115,39 +53588,39 @@ { "bearer_auth": [] } + ], + "summary": "Create or recreate ACME order for a domain", + "tags": [ + "Domains" ] } }, "/domains/{domain_id}/order/finalize": { "post": { - "tags": [ - "Domains" - ], - "summary": "Finalize ACME order for a domain", "description": "Finalizes the ACME order by completing the challenge validation and requesting the certificate.\nThis should be called after the challenge has been set up (DNS record added or HTTP token served).", "operationId": "finalize_order", "parameters": [ { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Order finalized successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainResponse" } } - } + }, + "description": "Order finalized successfully" }, "401": { "description": "Unauthorized" @@ -53163,26 +53636,26 @@ { "bearer_auth": [] } + ], + "summary": "Finalize ACME order for a domain", + "tags": [ + "Domains" ] } }, "/domains/{domain_id}/setup-dns": { "post": { - "tags": [ - "Domains" - ], - "summary": "Setup DNS challenge records automatically using a DNS provider", "description": "This endpoint automatically creates the required DNS TXT records for ACME DNS-01 challenge\nvalidation using a configured DNS provider. The domain must have an active DNS challenge\npending (created via POST /domains/{id}/order with dns-01 challenge type).\n\nThis is similar to how email domain DNS records are auto-provisioned.", "operationId": "setup_dns_challenge", "parameters": [ { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -53198,14 +53671,14 @@ }, "responses": { "200": { - "description": "DNS records created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetupDnsChallengeResponse" } } - } + }, + "description": "DNS records created successfully" }, "400": { "description": "Bad request - DNS provider not configured or no challenge pending" @@ -53227,38 +53700,30 @@ { "bearer_auth": [] } + ], + "summary": "Setup DNS challenge records automatically using a DNS provider", + "tags": [ + "Domains" ] } }, "/domains/{domain}": { - "get": { - "tags": [ - "Domains" - ], - "summary": "Get domain by ID", - "operationId": "get_domain_by_id", + "delete": { + "operationId": "delete_domain", "parameters": [ { - "name": "domain", + "description": "Domain name", "in": "path", - "description": "Domain ID", + "name": "domain", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], "responses": { - "200": { - "description": "Domain retrieved successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DomainResponse" - } - } - } + "204": { + "description": "Domain deleted successfully" }, "401": { "description": "Unauthorized" @@ -53274,28 +53739,36 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Domains" ], "summary": "Delete a domain", - "operationId": "delete_domain", + "tags": [ + "Domains" + ] + }, + "get": { + "operationId": "get_domain_by_id", "parameters": [ { - "name": "domain", + "description": "Domain ID", "in": "path", - "description": "Domain name", + "name": "domain", "required": true, "schema": { - "type": "string" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Domain deleted successfully" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainResponse" + } + } + }, + "description": "Domain retrieved successfully" }, "401": { "description": "Unauthorized" @@ -53311,21 +53784,21 @@ { "bearer_auth": [] } + ], + "summary": "Get domain by ID", + "tags": [ + "Domains" ] } }, "/domains/{domain}/challenge-token": { "get": { - "tags": [ - "Domains" - ], - "summary": "Get challenge token for a domain (returns plain text token)", "operationId": "get_challenge_token", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain name", + "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -53334,14 +53807,14 @@ ], "responses": { "200": { - "description": "Challenge token retrieved successfully", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Challenge token retrieved successfully" }, "401": { "description": "Unauthorized" @@ -53357,22 +53830,22 @@ { "bearer_auth": [] } + ], + "summary": "Get challenge token for a domain (returns plain text token)", + "tags": [ + "Domains" ] } }, "/domains/{domain}/http-challenge-debug": { "get": { - "tags": [ - "Domains" - ], - "summary": "Get HTTP challenge debug information", "description": "Returns detailed debug information for HTTP-01 challenge including:\n- Whether a challenge exists for the domain\n- The challenge token and URL that Let's Encrypt will access\n- DNS resolution information showing where the domain currently points\n\nThis is useful for debugging why HTTP-01 challenges fail.", "operationId": "get_http_challenge_debug", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain name", + "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -53381,14 +53854,14 @@ ], "responses": { "200": { - "description": "Debug information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HttpChallengeDebugResponse" } } - } + }, + "description": "Debug information retrieved successfully" }, "401": { "description": "Unauthorized" @@ -53401,21 +53874,21 @@ { "bearer_auth": [] } + ], + "summary": "Get HTTP challenge debug information", + "tags": [ + "Domains" ] } }, "/domains/{domain}/provision": { "post": { - "tags": [ - "Domains" - ], - "summary": "Provision a domain certificate", "operationId": "provision_domain", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain name", + "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -53424,14 +53897,14 @@ ], "responses": { "200": { - "description": "Certificate provisioning initiated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProvisionResponse" } } - } + }, + "description": "Certificate provisioning initiated" }, "401": { "description": "Unauthorized" @@ -53447,22 +53920,22 @@ { "bearer_auth": [] } + ], + "summary": "Provision a domain certificate", + "tags": [ + "Domains" ] } }, "/domains/{domain}/renew": { "post": { - "tags": [ - "Domains" - ], - "summary": "Renew domain certificate", "description": "For HTTP-01 domains: Automatically renews the certificate\nFor DNS-01 domains (wildcards): Creates a new ACME order and returns challenge data", "operationId": "renew_domain", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain name", + "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -53471,24 +53944,24 @@ ], "responses": { "200": { - "description": "Certificate renewal initiated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProvisionResponse" } } - } + }, + "description": "Certificate renewal initiated" }, "202": { - "description": "DNS challenge created - manual action required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainChallengeResponse" } } - } + }, + "description": "DNS challenge created - manual action required" }, "401": { "description": "Unauthorized" @@ -53504,38 +53977,38 @@ { "bearer_auth": [] } + ], + "summary": "Renew domain certificate", + "tags": [ + "Domains" ] } }, "/domains/{domain}/status": { "get": { - "tags": [ - "Domains" - ], - "summary": "Check domain status", "operationId": "check_domain_status", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Domain status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainResponse" } } - } + }, + "description": "Domain status retrieved successfully" }, "401": { "description": "Unauthorized" @@ -53551,15 +54024,15 @@ { "bearer_auth": [] } + ], + "summary": "Check domain status", + "tags": [ + "Domains" ] } }, "/drop/inspect": { "post": { - "tags": [ - "Projects" - ], - "summary": "Inspect a source ZIP without creating a project or retaining the upload.", "operationId": "inspect_drop_archive", "requestBody": { "content": { @@ -53573,14 +54046,14 @@ }, "responses": { "200": { - "description": "Detected deployable project roots", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DropInspectionResponse" } } - } + }, + "description": "Detected deployable project roots" }, "400": { "description": "Invalid or unsupported archive" @@ -53590,44 +54063,44 @@ { "bearer_auth": [] } + ], + "summary": "Inspect a source ZIP without creating a project or retaining the upload.", + "tags": [ + "Projects" ] } }, "/email-domains": { "get": { - "tags": [ - "Email Domains" - ], - "summary": "List all email domains", "operationId": "list_email_domains", "parameters": [ { - "name": "provider_id", - "in": "query", "description": "Only return domains belonging to this provider", + "in": "query", + "name": "provider_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } } ], "responses": { "200": { - "description": "List of email domains", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EmailDomainResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of email domains" }, "401": { "description": "Unauthorized" @@ -53643,13 +54116,13 @@ { "bearer_auth": [] } + ], + "summary": "List all email domains", + "tags": [ + "Email Domains" ] }, "post": { - "tags": [ - "Email Domains" - ], - "summary": "Create a new email domain", "operationId": "create_email_domain", "requestBody": { "content": { @@ -53663,14 +54136,14 @@ }, "responses": { "201": { - "description": "Domain created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailDomainWithDnsResponse" } } - } + }, + "description": "Domain created successfully" }, "400": { "description": "Invalid request" @@ -53689,21 +54162,21 @@ { "bearer_auth": [] } + ], + "summary": "Create a new email domain", + "tags": [ + "Email Domains" ] } }, "/email-domains/by-domain/{domain}": { "get": { - "tags": [ - "Email Domains" - ], - "summary": "Get an email domain by domain name with DNS records", "operationId": "get_domain_by_name", "parameters": [ { - "name": "domain", - "in": "path", "description": "Domain name (e.g., 'mail.example.com')", + "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -53712,14 +54185,14 @@ ], "responses": { "200": { - "description": "Email domain details with DNS records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailDomainWithDnsResponse" } } - } + }, + "description": "Email domain details with DNS records" }, "401": { "description": "Unauthorized" @@ -53738,38 +54211,31 @@ { "bearer_auth": [] } + ], + "summary": "Get an email domain by domain name with DNS records", + "tags": [ + "Email Domains" ] } }, "/email-domains/{id}": { - "get": { - "tags": [ - "Email Domains" - ], - "summary": "Get an email domain by ID with DNS records", - "operationId": "get_domain", + "delete": { + "operationId": "delete_email_domain", "parameters": [ { - "name": "id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Email domain details with DNS records", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmailDomainWithDnsResponse" - } - } - } + "204": { + "description": "Domain deleted" }, "401": { "description": "Unauthorized" @@ -53788,29 +54254,36 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Email Domains" ], "summary": "Delete an email domain", - "operationId": "delete_email_domain", + "tags": [ + "Email Domains" + ] + }, + "get": { + "operationId": "get_domain", "parameters": [ { - "name": "id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Domain deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmailDomainWithDnsResponse" + } + } + }, + "description": "Email domain details with DNS records" }, "401": { "description": "Unauthorized" @@ -53829,41 +54302,41 @@ { "bearer_auth": [] } + ], + "summary": "Get an email domain by ID with DNS records", + "tags": [ + "Email Domains" ] } }, "/email-domains/{id}/dns-records": { "get": { - "tags": [ - "Email Domains" - ], - "summary": "Get DNS records for an email domain", "operationId": "get_domain_dns_records", "parameters": [ { - "name": "id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "DNS records for the domain", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/DnsRecordResponse" - } + }, + "type": "array" } } - } + }, + "description": "DNS records for the domain" }, "401": { "description": "Unauthorized" @@ -53882,25 +54355,25 @@ { "bearer_auth": [] } + ], + "summary": "Get DNS records for an email domain", + "tags": [ + "Email Domains" ] } }, "/email-domains/{id}/setup-dns": { "post": { - "tags": [ - "Email Domains" - ], - "summary": "Setup DNS records for an email domain using a configured DNS provider", "operationId": "setup_dns", "parameters": [ { - "name": "id", - "in": "path", "description": "Email Domain ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -53916,14 +54389,14 @@ }, "responses": { "200": { - "description": "DNS records setup result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetupDnsResponse" } } - } + }, + "description": "DNS records setup result" }, "400": { "description": "Invalid request or DNS provider not configured" @@ -53945,38 +54418,38 @@ { "bearer_auth": [] } + ], + "summary": "Setup DNS records for an email domain using a configured DNS provider", + "tags": [ + "Email Domains" ] } }, "/email-domains/{id}/verify": { "post": { - "tags": [ - "Email Domains" - ], - "summary": "Verify an email domain's DNS configuration", "operationId": "verify_domain", "parameters": [ { - "name": "id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Domain verification result with DNS records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailDomainWithDnsResponse" } } - } + }, + "description": "Domain verification result with DNS records" }, "401": { "description": "Unauthorized" @@ -53995,29 +54468,29 @@ { "bearer_auth": [] } + ], + "summary": "Verify an email domain's DNS configuration", + "tags": [ + "Email Domains" ] } }, "/email-providers": { "get": { - "tags": [ - "Email Providers" - ], - "summary": "List all email providers", "operationId": "list_email_providers", "responses": { "200": { - "description": "List of email providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EmailProviderResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of email providers" }, "401": { "description": "Unauthorized" @@ -54033,13 +54506,13 @@ { "bearer_auth": [] } + ], + "summary": "List all email providers", + "tags": [ + "Email Providers" ] }, "post": { - "tags": [ - "Email Providers" - ], - "summary": "Create a new email provider", "operationId": "create_email_provider", "requestBody": { "content": { @@ -54053,14 +54526,14 @@ }, "responses": { "201": { - "description": "Provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailProviderResponse" } } - } + }, + "description": "Provider created successfully" }, "400": { "description": "Invalid request" @@ -54079,73 +54552,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new email provider", + "tags": [ + "Email Providers" ] } }, "/email-providers/{id}": { - "get": { - "tags": [ - "Email Providers" - ], - "summary": "Get an email provider by ID", - "operationId": "get_email_provider", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Provider ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Email provider details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmailProviderResponse" - } - } - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Insufficient permissions" - }, - "404": { - "description": "Provider not found" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } - ] - }, "delete": { - "tags": [ - "Email Providers" - ], - "summary": "Delete an email provider", "operationId": "delete_email_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -54170,24 +54595,72 @@ { "bearer_auth": [] } + ], + "summary": "Delete an email provider", + "tags": [ + "Email Providers" ] }, - "patch": { + "get": { + "operationId": "get_email_provider", + "parameters": [ + { + "description": "Provider ID", + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmailProviderResponse" + } + } + }, + "description": "Email provider details" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Provider not found" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Get an email provider by ID", "tags": [ "Email Providers" - ], - "summary": "Update an email provider", - "description": "Partial update \u2014 any field left out keeps its current value. Most importantly,\nomitting the credential block (`ses_credentials`/`scaleway_credentials`/`smtp_credentials`)\npreserves the stored secret, so operators can rename a provider without re-typing\npasswords. `provider_type` is immutable; to switch providers, delete and recreate.", + ] + }, + "patch": { + "description": "Partial update — any field left out keeps its current value. Most importantly,\nomitting the credential block (`ses_credentials`/`scaleway_credentials`/`smtp_credentials`)\npreserves the stored secret, so operators can rename a provider without re-typing\npasswords. `provider_type` is immutable; to switch providers, delete and recreate.", "operationId": "update_email_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -54203,14 +54676,14 @@ }, "responses": { "200": { - "description": "Provider updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailProviderResponse" } } - } + }, + "description": "Provider updated" }, "400": { "description": "Validation error" @@ -54235,25 +54708,25 @@ { "bearer_auth": [] } + ], + "summary": "Update an email provider", + "tags": [ + "Email Providers" ] } }, "/email-providers/{id}/test": { "post": { - "tags": [ - "Email Providers" - ], - "summary": "Test an email provider by sending a test email to the logged-in user", "operationId": "test_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -54269,14 +54742,14 @@ }, "responses": { "200": { - "description": "Test email result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestEmailResponse" } } - } + }, + "description": "Test email result" }, "400": { "description": "Invalid request" @@ -54298,38 +54771,38 @@ { "bearer_auth": [] } + ], + "summary": "Test an email provider by sending a test email to the logged-in user", + "tags": [ + "Email Providers" ] } }, "/email-providers/{id}/tracking/setup": { "post": { - "tags": [ - "Email Providers" - ], - "summary": "One-click AWS-side setup of SES event tracking (SNS topic + webhook\nsubscription + SESv2 event destination), using the provider's stored\ncredentials.", "operationId": "setup_email_tracking", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Setup completed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailTrackingSetupResponse" } } - } + }, + "description": "Setup completed" }, "400": { "description": "Provider does not support event tracking" @@ -54344,45 +54817,45 @@ "description": "Provider not found" }, "502": { - "description": "An AWS call failed \u2014 the response detail names the failed step" + "description": "An AWS call failed — the response detail names the failed step" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "One-click AWS-side setup of SES event tracking (SNS topic + webhook\nsubscription + SESv2 event destination), using the provider's stored\ncredentials.", + "tags": [ + "Email Providers" ] } }, "/email-providers/{id}/tracking/status": { "get": { - "tags": [ - "Email Providers" - ], - "summary": "Live status of SES event tracking for a provider", "operationId": "get_email_tracking_status", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Event tracking status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailTrackingStatusResponse" } } - } + }, + "description": "Event tracking status" }, "401": { "description": "Unauthorized" @@ -54398,44 +54871,44 @@ { "bearer_auth": [] } + ], + "summary": "Live status of SES event tracking for a provider", + "tags": [ + "Email Providers" ] } }, "/emails": { "get": { - "tags": [ - "Emails" - ], - "summary": "List emails with optional filtering", "operationId": "list_emails", "parameters": [ { - "name": "domain_id", "in": "query", + "name": "domain_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "project_id", "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "status", "in": "query", + "name": "status", "required": false, "schema": { "type": [ @@ -54445,8 +54918,8 @@ } }, { - "name": "from_address", "in": "query", + "name": "from_address", "required": false, "schema": { "type": [ @@ -54456,42 +54929,42 @@ } }, { - "name": "page", "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "page_size", "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } } ], "responses": { "200": { - "description": "List of emails", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedEmailsResponse" } } - } + }, + "description": "List of emails" }, "401": { "description": "Unauthorized" @@ -54507,13 +54980,13 @@ { "bearer_auth": [] } + ], + "summary": "List emails with optional filtering", + "tags": [ + "Emails" ] }, "post": { - "tags": [ - "Emails" - ], - "summary": "Send an email", "operationId": "send_email", "requestBody": { "content": { @@ -54527,14 +55000,14 @@ }, "responses": { "201": { - "description": "Email sent successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SendEmailResponseBody" } } - } + }, + "description": "Email sent successfully" }, "400": { "description": "Invalid request or domain not verified" @@ -54553,59 +55026,59 @@ { "bearer_auth": [] } + ], + "summary": "Send an email", + "tags": [ + "Emails" ] } }, "/emails/events": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "GET /emails/events", "operationId": "get_global_events", "parameters": [ { - "name": "event_type", - "in": "query", "description": "Filter by event type (open, click)", + "in": "query", + "name": "event_type", "required": false, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Paginated tracking events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedEventsResponse" } } - } + }, + "description": "Paginated tracking events" }, "401": { "description": "Unauthorized" @@ -54615,26 +55088,26 @@ { "bearer_auth": [] } + ], + "summary": "GET /emails/events", + "tags": [ + "Email Tracking" ] } }, "/emails/events/stats": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "GET /emails/events/stats", "operationId": "get_global_event_stats", "responses": { "200": { - "description": "Global tracking statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GlobalEventStatsResponse" } } - } + }, + "description": "Global tracking statistics" }, "401": { "description": "Unauthorized" @@ -54644,38 +55117,38 @@ { "bearer_auth": [] } + ], + "summary": "GET /emails/events/stats", + "tags": [ + "Email Tracking" ] } }, "/emails/stats": { "get": { - "tags": [ - "Emails" - ], - "summary": "Get email statistics", "operationId": "get_email_stats", "parameters": [ { - "name": "domain_id", - "in": "query", "description": "Optional domain ID to filter stats", + "in": "query", + "name": "domain_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Email statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailStatsResponse" } } - } + }, + "description": "Email statistics" }, "401": { "description": "Unauthorized" @@ -54691,15 +55164,15 @@ { "bearer_auth": [] } + ], + "summary": "Get email statistics", + "tags": [ + "Emails" ] } }, "/emails/validate": { "post": { - "tags": [ - "Email Validation" - ], - "summary": "Validate an email address", "operationId": "validate_email", "requestBody": { "content": { @@ -54713,14 +55186,14 @@ }, "responses": { "200": { - "description": "Email validation result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidateEmailResponse" } } - } + }, + "description": "Email validation result" }, "400": { "description": "Invalid request" @@ -54739,35 +55212,35 @@ { "bearer_auth": [] } + ], + "summary": "Validate an email address", + "tags": [ + "Email Validation" ] } }, "/emails/{email_id}/track/click/{link_index}": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "Track email link click - redirects to original URL", "description": "This endpoint replaces original links in tracked emails.\nNo authentication required - it's called when the recipient clicks a link.", "operationId": "track_click", "parameters": [ { - "name": "email_id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "email_id", "required": true, "schema": { "type": "string" } }, { - "name": "link_index", - "in": "path", "description": "Link index", + "in": "path", + "name": "link_index", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -54778,22 +55251,22 @@ "404": { "description": "Link not found" } - } + }, + "summary": "Track email link click - redirects to original URL", + "tags": [ + "Email Tracking" + ] } }, "/emails/{email_id}/track/open": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "Track email open - returns a 1x1 transparent GIF", "description": "This endpoint is embedded as an tag in emails.\nNo authentication required - it's called by the email client.", "operationId": "track_open", "parameters": [ { - "name": "email_id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "email_id", "required": true, "schema": { "type": "string" @@ -54807,21 +55280,21 @@ "404": { "description": "Email not found" } - } + }, + "summary": "Track email open - returns a 1x1 transparent GIF", + "tags": [ + "Email Tracking" + ] } }, "/emails/{id}": { "get": { - "tags": [ - "Emails" - ], - "summary": "Get an email by ID", "operationId": "get_email", "parameters": [ { - "name": "id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -54830,14 +55303,14 @@ ], "responses": { "200": { - "description": "Email details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailResponse" } } - } + }, + "description": "Email details" }, "401": { "description": "Unauthorized" @@ -54856,21 +55329,21 @@ { "bearer_auth": [] } + ], + "summary": "Get an email by ID", + "tags": [ + "Emails" ] } }, "/emails/{id}/tracking": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "Get email tracking summary", "operationId": "get_email_tracking", "parameters": [ { - "name": "id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -54879,14 +55352,14 @@ ], "responses": { "200": { - "description": "Tracking summary", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmailTrackingResponse" } } - } + }, + "description": "Tracking summary" }, "401": { "description": "Unauthorized" @@ -54902,30 +55375,30 @@ { "bearer_auth": [] } + ], + "summary": "Get email tracking summary", + "tags": [ + "Email Tracking" ] } }, "/emails/{id}/tracking/events": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "Get email tracking events", "operationId": "get_email_events", "parameters": [ { - "name": "id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "event_type", - "in": "query", "description": "Filter by event type (open, click)", + "in": "query", + "name": "event_type", "required": false, "schema": { "type": "string" @@ -54934,17 +55407,17 @@ ], "responses": { "200": { - "description": "Tracking events", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/TrackingEventResponse" - } + }, + "type": "array" } } - } + }, + "description": "Tracking events" }, "401": { "description": "Unauthorized" @@ -54960,21 +55433,21 @@ { "bearer_auth": [] } + ], + "summary": "Get email tracking events", + "tags": [ + "Email Tracking" ] } }, "/emails/{id}/tracking/links": { "get": { - "tags": [ - "Email Tracking" - ], - "summary": "Get tracked links for an email", "operationId": "get_email_links", "parameters": [ { - "name": "id", - "in": "path", "description": "Email ID (UUID)", + "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -54983,17 +55456,17 @@ ], "responses": { "200": { - "description": "Tracked links", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/TrackedLinkResponse" - } + }, + "type": "array" } } - } + }, + "description": "Tracked links" }, "401": { "description": "Unauthorized" @@ -55009,50 +55482,50 @@ { "bearer_auth": [] } + ], + "summary": "Get tracked links for an email", + "tags": [ + "Email Tracking" ] } }, "/external-services": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get all external services", "operationId": "list_services", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -55062,8 +55535,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -55075,28 +55548,28 @@ ], "responses": { "200": { - "description": "List of external services", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ExternalServiceInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of external services" }, "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "Get all external services", "tags": [ "External Services" - ], - "summary": "Create new external service", + ] + }, + "post": { "operationId": "create_service", "requestBody": { "content": { @@ -55110,14 +55583,14 @@ }, "responses": { "201": { - "description": "Service created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service created successfully" }, "400": { "description": "Invalid request" @@ -55125,29 +55598,29 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Create new external service", + "tags": [ + "External Services" + ] } }, "/external-services/available-containers": { "get": { - "tags": [ - "External Services" - ], - "summary": "List available Docker containers that can be imported as services", "operationId": "list_available_containers", "responses": { "200": { - "description": "List of available containers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/AvailableContainerInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of available containers" }, "401": { "description": "Unauthorized" @@ -55160,21 +55633,21 @@ { "bearer_auth": [] } + ], + "summary": "List available Docker containers that can be imported as services", + "tags": [ + "External Services" ] } }, "/external-services/by-slug/{slug}": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get external service details by slug", "operationId": "get_service_by_slug", "parameters": [ { - "name": "slug", - "in": "path", "description": "External service slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -55183,14 +55656,14 @@ ], "responses": { "200": { - "description": "External service details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceDetails" } } - } + }, + "description": "External service details" }, "404": { "description": "Service not found" @@ -55198,22 +55671,22 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get external service details by slug", + "tags": [ + "External Services" + ] } }, "/external-services/health-status-batch": { "get": { - "tags": [ - "External Services" - ], - "summary": "Current health status for many services at once", "description": "Powers the status dot on the Storage list page. Pass a comma-separated\nlist of service IDs via `?ids=1,2,3`. Omit to get every service.", "operationId": "list_service_health_statuses", "parameters": [ { - "name": "ids", - "in": "query", "description": "Comma-separated service IDs. Omit for all services.", + "in": "query", + "name": "ids", "required": false, "schema": { "type": "string" @@ -55222,27 +55695,27 @@ ], "responses": { "200": { - "description": "Batch of current health statuses", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceHealthStatusBatchResponse" } } - } + }, + "description": "Batch of current health statuses" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Current health status for many services at once", + "tags": [ + "External Services" + ] } }, "/external-services/import": { "post": { - "tags": [ - "External Services" - ], - "summary": "Import an existing Docker container as a managed external service", "operationId": "import_external_service", "requestBody": { "content": { @@ -55256,14 +55729,14 @@ }, "responses": { "201": { - "description": "Service imported successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service imported successfully" }, "400": { "description": "Invalid request" @@ -55282,60 +55755,60 @@ { "bearer_auth": [] } + ], + "summary": "Import an existing Docker container as a managed external service", + "tags": [ + "External Services" ] } }, "/external-services/projects/{project_id}": { "get": { - "tags": [ - "External Services" - ], - "summary": "List services linked to a project", "operationId": "list_project_services", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -55345,8 +55818,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -55358,17 +55831,17 @@ ], "responses": { "200": { - "description": "List of services linked to project", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectServiceInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of services linked to project" }, "404": { "description": "Project not found" @@ -55376,51 +55849,51 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "List services linked to a project", + "tags": [ + "External Services" + ] } }, "/external-services/projects/{project_id}/environment": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get all environment variables for all services linked to a project", "operationId": "get_project_service_environment_variables", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Map of service IDs to their environment variables", "content": { "application/json": { "schema": { - "type": "object", "additionalProperties": { - "type": "object", "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": "object" }, "propertyNames": { - "type": "integer", - "format": "int32" - } + "format": "int32", + "type": "integer" + }, + "type": "object" } } - } + }, + "description": "Map of service IDs to their environment variables" }, "404": { "description": "Project not found" @@ -55428,48 +55901,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get all environment variables for all services linked to a project", + "tags": [ + "External Services" + ] } }, "/external-services/providers/metadata": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get provider metadata (display names, icons, descriptions)", "operationId": "get_providers_metadata", "responses": { "200": { - "description": "List of provider metadata", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderMetadata" - } + }, + "type": "array" } } - } + }, + "description": "List of provider metadata" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get provider metadata (display names, icons, descriptions)", + "tags": [ + "External Services" + ] } }, "/external-services/providers/metadata/{service_type}": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get metadata for a specific provider", "operationId": "get_provider_metadata", "parameters": [ { - "name": "service_type", - "in": "path", "description": "Service type (mongodb, postgres, redis, s3)", + "in": "path", + "name": "service_type", "required": true, "schema": { "type": "string" @@ -55478,14 +55951,14 @@ ], "responses": { "200": { - "description": "Provider metadata", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderMetadata" } } - } + }, + "description": "Provider metadata" }, "404": { "description": "Provider not found" @@ -55493,48 +55966,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get metadata for a specific provider", + "tags": [ + "External Services" + ] } }, "/external-services/types": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get available service types", "operationId": "get_service_types", "responses": { "200": { - "description": "List of available service types", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ServiceTypeRoute" - } + }, + "type": "array" } } - } + }, + "description": "List of available service types" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get available service types", + "tags": [ + "External Services" + ] } }, "/external-services/types/{service_type}/parameters": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get parameter schema for a specific service type", "operationId": "get_service_type_parameters", "parameters": [ { - "name": "service_type", - "in": "path", "description": "Service type", + "in": "path", + "name": "service_type", "required": true, "schema": { "type": "string" @@ -55551,38 +56024,71 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get parameter schema for a specific service type", + "tags": [ + "External Services" + ] } }, "/external-services/{id}": { - "get": { + "delete": { + "operationId": "delete_service", + "parameters": [ + { + "description": "External service ID", + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Service deleted successfully" + }, + "400": { + "description": "Cannot delete: service is still linked to projects" + }, + "404": { + "description": "Service not found" + }, + "500": { + "description": "Internal server error" + } + }, + "summary": "Delete external service", "tags": [ "External Services" - ], - "summary": "Get external service details", + ] + }, + "get": { "operationId": "get_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "External service details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceDetails" } } - } + }, + "description": "External service details" }, "404": { "description": "Service not found" @@ -55590,23 +56096,23 @@ "500": { "description": "Internal server error" } - } - }, - "put": { + }, + "summary": "Get external service details", "tags": [ "External Services" - ], - "summary": "Update external service", + ] + }, + "put": { "operationId": "update_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -55622,14 +56128,14 @@ }, "responses": { "200": { - "description": "Service updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service updated successfully" }, "400": { "description": "Invalid request" @@ -55643,72 +56149,39 @@ "500": { "description": "Internal server error" } - } - }, - "delete": { + }, + "summary": "Update external service", "tags": [ "External Services" - ], - "summary": "Delete external service", - "operationId": "delete_service", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "External service ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Service deleted successfully" - }, - "400": { - "description": "Cannot delete: service is still linked to projects" - }, - "404": { - "description": "Service not found" - }, - "500": { - "description": "Internal server error" - } - } + ] } }, "/external-services/{id}/cluster-health": { "get": { - "tags": [ - "External Services" - ], - "summary": "Per-member health for a Postgres HA cluster.", "description": "Reads pg_auto_failover's `pgautofailover.node` table from the cluster's\nmonitor (TLS, autoctl_node) and joins each member with its\n`pg_stat_replication` row from the current primary. Returns one row per\ndata member with role/state, sync state, and replay lag.\n\nReturns `200` with `monitor_error` set when the monitor is briefly\nunreachable (UI surfaces it as a banner above the table); the table\nitself is empty in that case. Returns `400` for non-cluster services.", "operationId": "get_cluster_health", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Per-member cluster health report", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ClusterHealthReportResponse" } } - } + }, + "description": "Per-member cluster health report" }, "400": { "description": "Service is not a cluster" @@ -55727,39 +56200,39 @@ { "bearer_auth": [] } + ], + "summary": "Per-member health for a Postgres HA cluster.", + "tags": [ + "External Services" ] } }, "/external-services/{id}/health-check": { "post": { - "tags": [ - "External Services" - ], - "summary": "Run a health check for one service right now", "description": "Triggers the same engine-specific probe as the background monitor, writes\na history row, updates the denormalized fields on `external_services`, and\nfires alerts on the Nth consecutive failure (so consecutive-failure state\nstays honest). Returns the fresh snapshot the UI can display immediately.", "operationId": "trigger_service_health_check", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Fresh health snapshot after probing", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceHealthResponse" } } - } + }, + "description": "Fresh health snapshot after probing" }, "404": { "description": "Service not found" @@ -55770,50 +56243,50 @@ "503": { "description": "Health monitor not running on this node" } - } + }, + "summary": "Run a health check for one service right now", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/health-status": { "get": { - "tags": [ - "External Services" - ], - "summary": "Persisted health status for an external service", "description": "Returns the latest health probe result recorded by\n`ExternalServiceHealthMonitor`, plus recent check history for sparklines\nand a 24-hour uptime percentage. Safe to poll from the UI every 30s.", "operationId": "get_service_health_status", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Max number of recent checks (default 50, max 200)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Current health + recent history", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceHealthResponse" } } - } + }, + "description": "Current health + recent history" }, "404": { "description": "Service not found" @@ -55821,26 +56294,26 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Persisted health status for an external service", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/members": { "post": { - "tags": [ - "External Services" - ], - "summary": "Begin adding a single new member to a running cluster.", "description": "Currently only `replica` members can be added at runtime. The\nresponse is **202 Accepted** as soon as the validation passes and\nthe placeholder `service_members` row is inserted. The actual\ncontainer provisioning + DNS registration runs in the background;\npoll `GET /external-services/{id}/members/{member_id}` to watch\n`provisioning_step` advance through the phases.", "operationId": "add_cluster_member", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -55856,14 +56329,14 @@ }, "responses": { "202": { - "description": "Cluster member provisioning started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceMemberInfo" } } - } + }, + "description": "Cluster member provisioning started" }, "400": { "description": "Validation failed (wrong topology, status, or role)" @@ -55879,49 +56352,45 @@ { "bearer_auth": [] } + ], + "summary": "Begin adding a single new member to a running cluster.", + "tags": [ + "External Services" ] } }, "/external-services/{id}/members/{member_id}": { - "get": { - "tags": [ - "External Services" - ], - "summary": "Get a single cluster member's current state.", - "description": "Used by the add-member page to poll the row every second while the\nbackground provisioning task walks through its phases. The\n`provisioning_step` field advances through `inserting_row` \u2192\n`provisioning_container` \u2192 `registering_dns` \u2192 `done` (or `failed`\nwith `provisioning_error` set).", - "operationId": "get_cluster_member", + "delete": { + "description": "Refuses to remove the monitor (singleton), the current primary\n(failover first), or any member if the cluster would drop below the\n2-data-member quorum required for HA. Stops + removes the container,\ndeletes the row, and drops the Tier-2 DNS record.", + "operationId": "remove_cluster_member", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "member_id", - "in": "path", "description": "Cluster member ID", + "in": "path", + "name": "member_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Cluster member details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceMemberInfo" - } - } - } + "204": { + "description": "Cluster member removed" + }, + "400": { + "description": "Validation failed (monitor, primary, or quorum violation)" }, "404": { "description": "Service or member not found" @@ -55934,43 +56403,47 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "External Services" ], "summary": "Remove a single member from a running cluster.", - "description": "Refuses to remove the monitor (singleton), the current primary\n(failover first), or any member if the cluster would drop below the\n2-data-member quorum required for HA. Stops + removes the container,\ndeletes the row, and drops the Tier-2 DNS record.", - "operationId": "remove_cluster_member", + "tags": [ + "External Services" + ] + }, + "get": { + "description": "Used by the add-member page to poll the row every second while the\nbackground provisioning task walks through its phases. The\n`provisioning_step` field advances through `inserting_row` →\n`provisioning_container` → `registering_dns` → `done` (or `failed`\nwith `provisioning_error` set).", + "operationId": "get_cluster_member", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "member_id", - "in": "path", "description": "Cluster member ID", + "in": "path", + "name": "member_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Cluster member removed" - }, - "400": { - "description": "Validation failed (monitor, primary, or quorum violation)" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceMemberInfo" + } + } + }, + "description": "Cluster member details" }, "404": { "description": "Service or member not found" @@ -55983,35 +56456,35 @@ { "bearer_auth": [] } + ], + "summary": "Get a single cluster member's current state.", + "tags": [ + "External Services" ] } }, "/external-services/{id}/members/{member_id}/promote": { "post": { - "tags": [ - "External Services" - ], - "summary": "Promote a replica to primary by triggering a pg_auto_failover\nfailover. The monitor demotes the current primary and the chosen\nreplica transitions to primary; the role reconciler then refreshes\nthe role-aliased VIPs (\u226430s).", "operationId": "promote_cluster_member", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "member_id", - "in": "path", "description": "Cluster member ID", + "in": "path", + "name": "member_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -56033,73 +56506,73 @@ { "bearer_auth": [] } + ], + "summary": "Promote a replica to primary by triggering a pg_auto_failover\nfailover. The monitor demotes the current primary and the chosen\nreplica transitions to primary; the role reconciler then refreshes\nthe role-aliased VIPs (≤30s).", + "tags": [ + "External Services" ] } }, "/external-services/{id}/metrics": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Fetch a time-series range for a single metric on an external service.", "description": "Pass `percentile` to compute a histogram quantile instead of a plain\ngauge/counter average.", "operationId": "ExternalServiceMetricsGetRange", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric", - "in": "query", "description": "Metric name, e.g. `\"pg.connections_active\"`.", + "in": "query", + "name": "metric", "required": true, "schema": { "type": "string" } }, { - "name": "range", - "in": "query", "description": "Time window: `\"1h\"` | `\"6h\"` | `\"24h\"` | `\"7d\"`.", + "in": "query", + "name": "range", "required": false, "schema": { "type": "string" } }, { - "name": "percentile", + "description": "Optional histogram percentile (0–100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", "in": "query", - "description": "Optional histogram percentile (0\u2013100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", + "name": "percentile", "required": false, "schema": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] } } ], "responses": { "200": { - "description": "Metric time series data points", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/MetricDataPoint" - } + }, + "type": "array" } } - } + }, + "description": "Metric time series data points" }, "400": { "description": "Invalid query parameters" @@ -56118,41 +56591,41 @@ { "bearer_auth": [] } + ], + "summary": "Fetch a time-series range for a single metric on an external service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/alert-rules": { "get": { - "tags": [ - "Metrics" - ], - "summary": "List all monitoring alert rules for an external service.", "operationId": "ExternalServiceMetricsGetAlertRules", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of alert rules", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ServiceAlertRuleResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of alert rules" }, "401": { "description": "Unauthorized" @@ -56165,24 +56638,24 @@ { "bearer_auth": [] } + ], + "summary": "List all monitoring alert rules for an external service.", + "tags": [ + "Metrics" ] }, "post": { - "tags": [ - "Metrics" - ], - "summary": "Create a monitoring alert rule for an external service.", "description": "If metric collection is enabled and the service engine has default rules,\nseeding is idempotent (ON CONFLICT DO NOTHING).", "operationId": "ExternalServiceMetricsCreateAlertRule", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -56198,14 +56671,14 @@ }, "responses": { "201": { - "description": "Alert rule created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceAlertRuleResponse" } } - } + }, + "description": "Alert rule created" }, "400": { "description": "Invalid request" @@ -56224,61 +56697,41 @@ { "bearer_auth": [] } + ], + "summary": "Create a monitoring alert rule for an external service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/alert-rules/{rule_id}": { - "put": { - "tags": [ - "Metrics" - ], - "summary": "Update an existing monitoring alert rule for an external service.", - "operationId": "ExternalServiceMetricsUpdateAlertRule", + "delete": { + "operationId": "ExternalServiceMetricsDeleteAlertRule", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "rule_id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "rule_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceUpdateAlertRuleRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "Updated alert rule", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAlertRuleResponse" - } - } - } - }, - "400": { - "description": "Invalid request" + "204": { + "description": "Alert rule deleted" }, "401": { "description": "Unauthorized" @@ -56297,39 +56750,59 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Metrics" ], "summary": "Delete a monitoring alert rule for an external service.", - "operationId": "ExternalServiceMetricsDeleteAlertRule", + "tags": [ + "Metrics" + ] + }, + "put": { + "operationId": "ExternalServiceMetricsUpdateAlertRule", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "rule_id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "rule_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceUpdateAlertRuleRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "Alert rule deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAlertRuleResponse" + } + } + }, + "description": "Updated alert rule" + }, + "400": { + "description": "Invalid request" }, "401": { "description": "Unauthorized" @@ -56348,39 +56821,39 @@ { "bearer_auth": [] } + ], + "summary": "Update an existing monitoring alert rule for an external service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/by-database": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Return the latest per-database metric values for a Postgres service.", "description": "Groups `pg_stat_database` / size metrics by `datname` so the UI can show a\nbreakdown table (each database with its own size, cache-hit ratio, etc.)\nrather than collapsing every database into one value.", "operationId": "ExternalServiceMetricsByDatabase", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Per-database metric breakdown", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatabaseMetricsResponse" } } - } + }, + "description": "Per-database metric breakdown" }, "401": { "description": "Unauthorized" @@ -56396,26 +56869,26 @@ { "bearer_auth": [] } + ], + "summary": "Return the latest per-database metric values for a Postgres service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/enable": { "patch": { - "tags": [ - "Metrics" - ], - "summary": "Enable or disable metric collection for an external service.", "description": "When `enabled=true`, seeds the default alert rules for the service's engine\nvia [`temps_monitoring::seed_default_rules`] (idempotent).", "operationId": "ExternalServiceMetricsToggle", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -56453,45 +56926,45 @@ { "bearer_auth": [] } + ], + "summary": "Enable or disable metric collection for an external service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/latest": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Fetch the most-recent value for every tracked metric on an external service.", "operationId": "ExternalServiceMetricsGetLatest", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Map of metric name to latest value", "content": { "application/json": { "schema": { - "type": "object", "additionalProperties": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" }, "propertyNames": { "type": "string" - } + }, + "type": "object" } } - } + }, + "description": "Map of metric name to latest value" }, "401": { "description": "Unauthorized" @@ -56507,39 +56980,39 @@ { "bearer_auth": [] } + ], + "summary": "Fetch the most-recent value for every tracked metric on an external service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/metrics/status": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Return the freshness status (last-received timestamp) for a service.", - "description": "Cheap O(1) lookup against `service_metrics_status` \u2014 used by the UI to show\n\"last received at \u2026\" without scanning the metrics hypertable.", + "description": "Cheap O(1) lookup against `service_metrics_status` — used by the UI to show\n\"last received at …\" without scanning the metrics hypertable.", "operationId": "ExternalServiceMetricsStatus", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Metrics freshness status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetricsStatusResponse" } } - } + }, + "description": "Metrics freshness status" }, "503": { "description": "Metrics not available" @@ -56549,31 +57022,31 @@ { "bearer_auth": [] } + ], + "summary": "Return the freshness status (last-received timestamp) for a service.", + "tags": [ + "Metrics" ] } }, "/external-services/{id}/parameters/{param_name}": { "get": { - "tags": [ - "External Services" - ], - "summary": "Reveal one sensitive service parameter. Service detail responses never\ncontain plaintext values; every successful reveal is recorded separately.", "operationId": "reveal_service_parameter", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "param_name", - "in": "path", "description": "Sensitive parameter name", + "in": "path", + "name": "param_name", "required": true, "schema": { "type": "string" @@ -56582,14 +57055,14 @@ ], "responses": { "200": { - "description": "Sensitive parameter value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SensitiveValueResponse" } } - } + }, + "description": "Sensitive parameter value" }, "400": { "description": "Parameter is not sensitive" @@ -56603,44 +57076,44 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Reveal one sensitive service parameter. Service detail responses never\ncontain plaintext values; every successful reveal is recorded separately.", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/preview-environment-masked": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get environment variables preview with masked sensitive values", "operationId": "get_service_preview_environment_variables_masked", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Preview of environment variables with sensitive values masked as ***", "content": { "application/json": { "schema": { - "type": "object", "additionalProperties": { "type": "string" }, "propertyNames": { "type": "string" - } + }, + "type": "object" } } - } + }, + "description": "Preview of environment variables with sensitive values masked as ***" }, "404": { "description": "Service not found" @@ -56648,41 +57121,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get environment variables preview with masked sensitive values", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/preview-environment-names": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get environment variable names preview (safe - no sensitive values)", "operationId": "get_service_preview_environment_variable_names", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of environment variable names that would be provided", "content": { "application/json": { "schema": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } } - } + }, + "description": "List of environment variable names that would be provided" }, "404": { "description": "Service not found" @@ -56690,60 +57163,60 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get environment variable names preview (safe - no sensitive values)", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/projects": { "get": { - "tags": [ - "External Services" - ], - "summary": "List projects linked to service", "operationId": "list_service_projects", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -56753,8 +57226,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -56766,17 +57239,17 @@ ], "responses": { "200": { - "description": "List of linked projects", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectServiceInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of linked projects" }, "404": { "description": "Service not found" @@ -56784,23 +57257,23 @@ "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "List projects linked to service", "tags": [ "External Services" - ], - "summary": "Link service to project", + ] + }, + "post": { "operationId": "link_service_to_project", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -56816,14 +57289,14 @@ }, "responses": { "201": { - "description": "Service linked to project successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectServiceInfo" } } - } + }, + "description": "Service linked to project successfully" }, "404": { "description": "Service or project not found" @@ -56831,35 +57304,35 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Link service to project", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/projects/{project_id}": { "delete": { - "tags": [ - "External Services" - ], - "summary": "Unlink service from project", "operationId": "unlink_service_from_project", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -56873,51 +57346,51 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Unlink service from project", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/projects/{project_id}/environment": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get all environment variables for a service-project pair", "operationId": "get_service_environment_variables", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of environment variables", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EnvironmentVariableInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of environment variables" }, "404": { "description": "Service or project not found" @@ -56925,41 +57398,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get all environment variables for a service-project pair", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/projects/{project_id}/environment/{var_name}": { "get": { - "tags": [ - "External Services" - ], - "summary": "Get specific environment variable for a service-project pair", "operationId": "get_service_environment_variable", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "var_name", - "in": "path", "description": "Environment variable name", + "in": "path", + "name": "var_name", "required": true, "schema": { "type": "string" @@ -56968,14 +57441,14 @@ ], "responses": { "200": { - "description": "Environment variable value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentVariableInfo" } } - } + }, + "description": "Environment variable value" }, "403": { "description": "Plaintext secret access is not permitted" @@ -56986,26 +57459,26 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get specific environment variable for a service-project pair", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/resources": { "patch": { - "tags": [ - "External Services" - ], - "summary": "Update a service's resource limits (memory, CPU caps).", "description": "Persists the new caps to the encrypted config AND live-applies them\nvia Docker's update API. Memory and CPU can be hot-changed without a\nrestart on running containers; stopped containers also accept the\nupdate and pick up the new caps on next start.\n\nPass `null` (or omit) any field to leave it unlimited. A request where\nevery field is `null` removes any existing limits.\n\nThe response includes a per-container `applied[]` list so the caller\ncan tell which members got the update and which were skipped (e.g.,\ncontainer not yet created, or `docker update` rejected because the\nnew memory cap is below current usage).", "operationId": "update_service_resources", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57021,14 +57494,14 @@ }, "responses": { "200": { - "description": "Updated resource limits", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResourceLimitsUpdateResponse" } } - } + }, + "description": "Updated resource limits" }, "400": { "description": "Invalid resource limits" @@ -57039,24 +57512,25 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Update a service's resource limits (memory, CPU caps).", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/restore": { "post": { - "tags": [ - "Restore" - ], "operationId": "start_restore", "parameters": [ { - "name": "id", - "in": "path", "description": "External service id (source for the restore)", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57072,105 +57546,105 @@ }, "responses": { "202": { - "description": "Restore run started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestoreRunView" } } - } + }, + "description": "Restore run started" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "404": { - "description": "Backup or service not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup or service not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Restore" ] } }, "/external-services/{id}/restore-capabilities": { "get": { - "tags": [ - "Restore" - ], "operationId": "get_restore_capabilities", "parameters": [ { - "name": "id", - "in": "path", "description": "External service id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Capabilities declared by the service", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestoreCapabilitiesResponse" } } - } + }, + "description": "Capabilities declared by the service" }, "404": { - "description": "Service not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Service not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Restore" ] } }, "/external-services/{id}/restore-plan": { "post": { - "tags": [ - "Restore" - ], "operationId": "plan_restore", "parameters": [ { - "name": "id", - "in": "path", "description": "Target service id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57186,99 +57660,98 @@ }, "responses": { "200": { - "description": "Preview of what the restore will do", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestorePlan" } } - } + }, + "description": "Preview of what the restore will do" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "404": { - "description": "Backup or service not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Backup or service not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Restore" ] } }, "/external-services/{id}/restore-runs": { "get": { - "tags": [ - "Restore" - ], "operationId": "list_restore_runs_for_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Recent restore runs for the service", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/RestoreRunView" - } + }, + "type": "array" } } - } + }, + "description": "Recent restore runs for the service" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Restore" ] } }, "/external-services/{id}/retry": { "post": { - "tags": [ - "External Services" - ], - "summary": "Retry a failed cluster service initialization.", "description": "Cleans up any leftover containers from the previous attempt and\nre-runs cluster initialization with the provided member specifications.", "operationId": "retry_cluster", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57294,14 +57767,14 @@ }, "responses": { "200": { - "description": "Cluster retry initiated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Cluster retry initiated" }, "400": { "description": "Service is not a failed cluster" @@ -57317,38 +57790,38 @@ { "bearer_auth": [] } + ], + "summary": "Retry a failed cluster service initialization.", + "tags": [ + "External Services" ] } }, "/external-services/{id}/runtime": { "get": { - "tags": [ - "External Services" - ], - "summary": "Inspect a service's container(s): status, restart count, OOM-killed flag,\nexit code, and the cgroup limits actually applied.", "operationId": "get_service_runtime", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Container runtime snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceRuntimeReport" } } - } + }, + "description": "Container runtime snapshot" }, "404": { "description": "Service not found" @@ -57356,38 +57829,38 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Inspect a service's container(s): status, restart count, OOM-killed flag,\nexit code, and the cgroup limits actually applied.", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/start": { "post": { - "tags": [ - "External Services" - ], - "summary": "Start an external service", "operationId": "start_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Service started successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service started successfully" }, "404": { "description": "Service not found" @@ -57398,38 +57871,38 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Start an external service", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/stats": { "get": { - "tags": [ - "External Services" - ], - "summary": "Sample current CPU/memory usage from each of a service's containers.\nOne-shot sample, no streaming. Cheap to call (single Docker round-trip\nper member) so the UI can poll on a 5\u201310s interval.", "operationId": "get_service_stats", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Container stats snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceStatsReport" } } - } + }, + "description": "Container stats snapshot" }, "404": { "description": "Service not found" @@ -57437,38 +57910,38 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Sample current CPU/memory usage from each of a service's containers.\nOne-shot sample, no streaming. Cheap to call (single Docker round-trip\nper member) so the UI can poll on a 5–10s interval.", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/stop": { "post": { - "tags": [ - "External Services" - ], - "summary": "Stop an external service", "operationId": "stop_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Service stopped successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service stopped successfully" }, "404": { "description": "Service not found" @@ -57476,25 +57949,25 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Stop an external service", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/upgrade": { "post": { - "tags": [ - "External Services" - ], - "summary": "Upgrade external service to new Docker image with data migration\nThis endpoint uses service-specific upgrade procedures (e.g., pg_upgrade for PostgreSQL)", "operationId": "upgrade_service", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57510,14 +57983,14 @@ }, "responses": { "200": { - "description": "Service upgraded successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalServiceInfo" } } - } + }, + "description": "Service upgraded successfully" }, "400": { "description": "Invalid request or upgrade not supported" @@ -57531,39 +58004,39 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Upgrade external service to new Docker image with data migration\nThis endpoint uses service-specific upgrade procedures (e.g., pg_upgrade for PostgreSQL)", + "tags": [ + "External Services" + ] } }, "/external-services/{id}/wal-health": { "get": { - "tags": [ - "External Services" - ], - "summary": "Postgres WAL & archive health snapshot", "description": "Returns the latest WAL/archive health snapshot recorded by the background\nhealth monitor for a Postgres external service. Powers the warning banner\non the service detail page when the disk is filling up due to stale\nreplication slots, archive backlog, or misconfigured `archive_command`.\n\nReturns 404 when no snapshot exists yet (probe hasn't run, or the service\nisn't Postgres).", "operationId": "getPostgresWalHealth", "parameters": [ { - "name": "id", - "in": "path", "description": "External service ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Latest WAL health snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PostgresWalHealth" } } - } + }, + "description": "Latest WAL health snapshot" }, "404": { "description": "Service not found, or no WAL snapshot available" @@ -57571,39 +58044,39 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Postgres WAL & archive health snapshot", + "tags": [ + "External Services" + ] } }, "/external-services/{service_id}/pg-stat-statements/enable": { "post": { - "tags": [ - "External Services" - ], - "summary": "Enable `pg_stat_statements` on a standalone Postgres service.", - "description": "Stops the container and restarts it so that the\n`shared_preload_libraries=pg_stat_statements` CMD flag (baked into every\nnew standalone Postgres container) takes effect. The named data volume is\nreused unchanged \u2014 no data is lost.\n\n**Clustered (HA) services are rejected** with 422 \u2014 a blind single-container\nrestart bypasses controlled failover. For clustered services the response\nbody describes the manual rolling-restart steps.\n\nConfirmation is the caller's responsibility (UI dialog / CLI `--yes` flag)\nbefore invoking this endpoint.", + "description": "Stops the container and restarts it so that the\n`shared_preload_libraries=pg_stat_statements` CMD flag (baked into every\nnew standalone Postgres container) takes effect. The named data volume is\nreused unchanged — no data is lost.\n\n**Clustered (HA) services are rejected** with 422 — a blind single-container\nrestart bypasses controlled failover. For clustered services the response\nbody describes the manual rolling-restart steps.\n\nConfirmation is the caller's responsibility (UI dialog / CLI `--yes` flag)\nbefore invoking this endpoint.", "operationId": "ExternalServiceEnablePgStatStatements", "parameters": [ { - "name": "service_id", - "in": "path", "description": "ID of the provisioned standalone Postgres service", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Container restarted; pg_stat_statements now active", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnablePgStatStatementsResponse" } } - } + }, + "description": "Container restarted; pg_stat_statements now active" }, "401": { "description": "Unauthorized" @@ -57625,30 +58098,29 @@ { "bearer_auth": [] } + ], + "summary": "Enable `pg_stat_statements` on a standalone Postgres service.", + "tags": [ + "External Services" ] } }, "/external-services/{service_id}/pg-stat-statements/reset": { "post": { - "tags": [ - "External Services" - ], - "summary": "Reset all statistics accumulated by `pg_stat_statements` for a Postgres\nservice. This affects every user, database, and normalized query tracked by\nthe target Postgres instance and cannot be undone.", "operationId": "ExternalServiceResetPgStatStatements", "parameters": [ { - "name": "service_id", - "in": "path", "description": "ID of the provisioned Postgres service", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "requestBody": { - "description": "Explicit confirmation of the global, irreversible reset", "content": { "application/json": { "schema": { @@ -57656,18 +58128,19 @@ } } }, + "description": "Explicit confirmation of the global, irreversible reset", "required": true }, "responses": { "200": { - "description": "All accumulated pg_stat_statements statistics cleared", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResetPgStatStatementsResponse" } } - } + }, + "description": "All accumulated pg_stat_statements statistics cleared" }, "400": { "description": "Missing or invalid reset confirmation" @@ -57692,58 +58165,59 @@ { "bearer_auth": [] } + ], + "summary": "Reset all statistics accumulated by `pg_stat_statements` for a Postgres\nservice. This affects every user, database, and normalized query tracked by\nthe target Postgres instance and cannot be undone.", + "tags": [ + "External Services" ] } }, "/external-services/{service_id}/pg-stat-statements/slow-queries": { "get": { - "tags": [ - "External Services" - ], "operationId": "get_slow_queries", "parameters": [ { - "name": "service_id", - "in": "path", "description": "ID of the provisioned Postgres service", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based). Defaults to 1.", + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] } }, { - "name": "page_size", + "description": "Number of rows per page (1–100). Defaults to 20.", "in": "query", - "description": "Number of rows per page (1\u2013100). Defaults to 20.", + "name": "page_size", "required": false, "schema": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] } }, { - "name": "sort_by", - "in": "query", "description": "Column to sort by: one of `calls`, `total_exec_time_ms`,\n`mean_exec_time_ms`, `rows`, `cache_hit_ratio`. Defaults to\n`mean_exec_time_ms`. Applied server-side so ordering stays\nconsistent across pages.", + "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -57753,9 +58227,9 @@ } }, { - "name": "sort_order", - "in": "query", "description": "Sort direction: `asc` or `desc`. Defaults to `desc`.", + "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -57767,14 +58241,14 @@ ], "responses": { "200": { - "description": "Paginated slow queries from pg_stat_statements", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SlowQueriesResponse" } } - } + }, + "description": "Paginated slow queries from pg_stat_statements" }, "400": { "description": "Invalid pagination or sort parameters" @@ -57799,39 +58273,38 @@ { "bearer_auth": [] } + ], + "tags": [ + "External Services" ] } }, "/external-services/{service_id}/query/ai-data-access": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Report whether the AI assistant may read row data from this service.", - "description": "Always answers (rather than 404-ing when disabled) so the console can render\nthe capability with an \"off \u2014 here's how to turn it on\" state instead of\nhiding it, and so the agent can tell \"not set up\" apart from \"not supported\".", + "description": "Always answers (rather than 404-ing when disabled) so the console can render\nthe capability with an \"off — here's how to turn it on\" state instead of\nhiding it, and so the agent can tell \"not set up\" apart from \"not supported\".", "operationId": "get_ai_data_access", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Current AI data access setting", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiDataAccessResponse" } } - } + }, + "description": "Current AI data access setting" }, "401": { "description": "Unauthorized" @@ -57847,24 +58320,24 @@ { "bearer_auth": [] } + ], + "summary": "Report whether the AI assistant may read row data from this service.", + "tags": [ + "External Services - Query" ] }, "patch": { - "tags": [ - "External Services - Query" - ], - "summary": "Enable or disable AI assistant access to this service's row data.", - "description": "Off by default. Row contents can include password hashes, API tokens and\npersonal data, and enabling this sends them to the configured AI provider \u2014\nso it is a deliberate, audited, per-service decision by the operator.", + "description": "Off by default. Row contents can include password hashes, API tokens and\npersonal data, and enabling this sends them to the configured AI provider —\nso it is a deliberate, audited, per-service decision by the operator.", "operationId": "set_ai_data_access", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -57880,14 +58353,14 @@ }, "responses": { "200": { - "description": "Setting applied", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiDataAccessResponse" } } - } + }, + "description": "Setting applied" }, "401": { "description": "Unauthorized" @@ -57906,40 +58379,40 @@ { "bearer_auth": [] } + ], + "summary": "Enable or disable AI assistant access to this service's row data.", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "List containers at the root level (databases, keyspaces, etc.)", "operationId": "list_root_containers", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of root containers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of root containers" }, "401": { "description": "Unauthorized" @@ -57958,29 +58431,29 @@ { "bearer_auth": [] } + ], + "summary": "List containers at the root level (databases, keyspaces, etc.)", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "List containers at a specific path\nPath segments are separated by forward slashes\nExample: /external-services/1/query/containers/mydb lists schemas in database \"mydb\"", "operationId": "list_containers_at_path", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" @@ -57989,17 +58462,17 @@ ], "responses": { "200": { - "description": "List of containers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of containers" }, "401": { "description": "Unauthorized" @@ -58018,48 +58491,48 @@ { "bearer_auth": [] } + ], + "summary": "List containers at a specific path\nPath segments are separated by forward slashes\nExample: /external-services/1/query/containers/mydb lists schemas in database \"mydb\"", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}/entities": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "List entities (tables, collections, etc.) in a container\nExample: /external-services/1/query/containers/mydb/public/entities lists tables in the public schema", "operationId": "list_entities", "parameters": [ { - "name": "limit", - "in": "query", "description": "Maximum number of entities to return (default: 100, max: 1000)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "token", - "in": "query", "description": "Continuation token for pagination", + "in": "query", + "name": "token", "required": false, "schema": { "type": "string" } }, { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" @@ -58068,14 +58541,14 @@ ], "responses": { "200": { - "description": "Paginated list of entities", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedEntitiesResponse" } } - } + }, + "description": "Paginated list of entities" }, "401": { "description": "Unauthorized" @@ -58094,37 +58567,37 @@ { "bearer_auth": [] } + ], + "summary": "List entities (tables, collections, etc.) in a container\nExample: /external-services/1/query/containers/mydb/public/entities lists tables in the public schema", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}/entities/{entity}": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Get detailed information about an entity (table schema)", "operationId": "get_entity_info", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "entity", "in": "path", + "name": "entity", "required": true, "schema": { "type": "string" @@ -58133,14 +58606,14 @@ ], "responses": { "200": { - "description": "Entity details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityInfoResponse" } } - } + }, + "description": "Entity details" }, "401": { "description": "Unauthorized" @@ -58159,88 +58632,88 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed information about an entity (table schema)", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}/entities/{entity}/data": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Read rows from an entity (read-only `GET`; see [`query_data`] for the\n`POST` form used by the console).", - "description": "Gated for AI callers by the service's `ai_data_access` opt-in \u2014 see\n[`temps_core::ai_tool_call::AiToolCall`].", + "description": "Gated for AI callers by the service's `ai_data_access` opt-in — see\n[`temps_core::ai_tool_call::AiToolCall`].", "operationId": "read_entity_rows", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", - "in": "path", "description": "Container path, slash-separated (e.g. `mydb/public`)", + "in": "path", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "entity", - "in": "path", "description": "Table, collection, key or object name", + "in": "path", + "name": "entity", "required": true, "schema": { "type": "string" } }, { - "name": "filter", - "in": "query", "description": "JSON-encoded backend-specific filter", + "in": "query", + "name": "filter", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Maximum rows to return", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Rows to skip", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "sort_by", - "in": "query", "description": "Field to sort by", + "in": "query", + "name": "sort_by", "required": false, "schema": { "type": "string" } }, { - "name": "sort_order", - "in": "query", "description": "asc or desc", + "in": "query", + "name": "sort_order", "required": false, "schema": { "type": "string" @@ -58249,14 +58722,14 @@ ], "responses": { "200": { - "description": "Query results", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QueryDataResponse" } } - } + }, + "description": "Query results" }, "400": { "description": "Invalid query or filter" @@ -58278,35 +58751,35 @@ { "bearer_auth": [] } + ], + "summary": "Read rows from an entity (read-only `GET`; see [`query_data`] for the\n`POST` form used by the console).", + "tags": [ + "External Services - Query" ] }, "post": { - "tags": [ - "External Services - Query" - ], - "summary": "Query data from an entity with optional filters, pagination, and sorting", "operationId": "query_data", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "entity", "in": "path", + "name": "entity", "required": true, "schema": { "type": "string" @@ -58325,14 +58798,14 @@ }, "responses": { "200": { - "description": "Query results", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QueryDataResponse" } } - } + }, + "description": "Query results" }, "400": { "description": "Invalid query" @@ -58354,37 +58827,37 @@ { "bearer_auth": [] } + ], + "summary": "Query data from an entity with optional filters, pagination, and sorting", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}/entities/{entity}/download": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Download an object (S3 only) as a streaming response", "operationId": "download_object", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "entity", "in": "path", + "name": "entity", "required": true, "schema": { "type": "string" @@ -58393,10 +58866,10 @@ ], "responses": { "200": { - "description": "Object data stream", "content": { "application/octet-stream": {} - } + }, + "description": "Object data stream" }, "401": { "description": "Unauthorized" @@ -58415,29 +58888,29 @@ { "bearer_auth": [] } + ], + "summary": "Download an object (S3 only) as a streaming response", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/containers/{path}/info": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Get information about a specific container", "operationId": "get_query_container_info", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "path", "in": "path", + "name": "path", "required": true, "schema": { "type": "string" @@ -58446,14 +58919,14 @@ ], "responses": { "200": { - "description": "Container information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerResponse" } } - } + }, + "description": "Container information" }, "401": { "description": "Unauthorized" @@ -58472,37 +58945,37 @@ { "bearer_auth": [] } + ], + "summary": "Get information about a specific container", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/query/explorer-support": { "get": { - "tags": [ - "External Services - Query" - ], - "summary": "Check if a service supports query explorer functionality", "operationId": "check_explorer_support", "parameters": [ { - "name": "service_id", "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Explorer support information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExplorerSupportResponse" } } - } + }, + "description": "Explorer support information" }, "401": { "description": "Unauthorized" @@ -58521,41 +58994,41 @@ { "bearer_auth": [] } + ], + "summary": "Check if a service supports query explorer functionality", + "tags": [ + "External Services - Query" ] } }, "/external-services/{service_id}/upgrades": { "get": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "List recent upgrades for a single service (newest first, page size 50).", "operationId": "list_pg_upgrades", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Recent upgrades", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/PgUpgradeResponse" - } + }, + "type": "array" } } - } + }, + "description": "Recent upgrades" }, "500": { "description": "Internal error" @@ -58565,23 +59038,23 @@ { "bearer_auth": [] } + ], + "summary": "List recent upgrades for a single service (newest first, page size 50).", + "tags": [ + "Postgres Upgrades" ] }, "post": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Start a new PostgreSQL major-version upgrade for a service.", "operationId": "start_pg_upgrade", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -58597,14 +59070,14 @@ }, "responses": { "201": { - "description": "Upgrade started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeResponse" } } - } + }, + "description": "Upgrade started" }, "400": { "description": "Invalid request" @@ -58623,48 +59096,48 @@ { "bearer_auth": [] } + ], + "summary": "Start a new PostgreSQL major-version upgrade for a service.", + "tags": [ + "Postgres Upgrades" ] } }, "/external-services/{service_id}/upgrades/{id}": { "get": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Get a single upgrade by id, scoped to a service.", "operationId": "get_pg_upgrade", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "id", - "in": "path", "description": "Upgrade id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Upgrade", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeResponse" } } - } + }, + "description": "Upgrade" }, "404": { "description": "Not found" @@ -58677,48 +59150,48 @@ { "bearer_auth": [] } + ], + "summary": "Get a single upgrade by id, scoped to a service.", + "tags": [ + "Postgres Upgrades" ] } }, "/external-services/{service_id}/upgrades/{id}/cancel": { "post": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Cancel an in-flight upgrade. The orchestrator stops at its next phase\nboundary; already-terminal upgrades return 409.", "operationId": "cancel_pg_upgrade", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "id", - "in": "path", "description": "Upgrade id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Cancellation requested", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeResponse" } } - } + }, + "description": "Cancellation requested" }, "404": { "description": "Not found" @@ -58734,48 +59207,48 @@ { "bearer_auth": [] } + ], + "summary": "Cancel an in-flight upgrade. The orchestrator stops at its next phase\nboundary; already-terminal upgrades return 409.", + "tags": [ + "Postgres Upgrades" ] } }, "/external-services/{service_id}/upgrades/{id}/logs": { "get": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Get the accumulated JSONL log content for an upgrade (for dashboard display).", "operationId": "get_pg_upgrade_logs", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "id", - "in": "path", "description": "Upgrade id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Log content", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeLogResponse" } } - } + }, + "description": "Log content" }, "404": { "description": "Not found" @@ -58788,48 +59261,48 @@ { "bearer_auth": [] } + ], + "summary": "Get the accumulated JSONL log content for an upgrade (for dashboard display).", + "tags": [ + "Postgres Upgrades" ] } }, "/external-services/{service_id}/upgrades/{id}/retry": { "post": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Retry a failed upgrade. The phase is preserved, so the state machine\nresumes from where it failed.", "operationId": "retry_pg_upgrade", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "id", - "in": "path", "description": "Upgrade id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Retry scheduled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeResponse" } } - } + }, + "description": "Retry scheduled" }, "400": { "description": "Upgrade is not in a retriable state" @@ -58845,48 +59318,48 @@ { "bearer_auth": [] } + ], + "summary": "Retry a failed upgrade. The phase is preserved, so the state machine\nresumes from where it failed.", + "tags": [ + "Postgres Upgrades" ] } }, "/external-services/{service_id}/upgrades/{id}/rollback": { "post": { - "tags": [ - "Postgres Upgrades" - ], - "summary": "Roll a completed upgrade back to its pre-upgrade PGDATA volume and old image.\nOnly valid while the rollback retention window is still open (see\n`ROLLBACK_RETENTION_DAYS`) and the rollback volume has not been swept.", "operationId": "rollback_pg_upgrade", "parameters": [ { - "name": "service_id", - "in": "path", "description": "External service id", + "in": "path", + "name": "service_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "id", - "in": "path", "description": "Upgrade id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Rollback complete", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PgUpgradeResponse" } } - } + }, + "description": "Rollback complete" }, "404": { "description": "Not found" @@ -58902,20 +59375,21 @@ { "bearer_auth": [] } + ], + "summary": "Roll a completed upgrade back to its pre-upgrade PGDATA volume and old image.\nOnly valid while the rollback retention window is still open (see\n`ROLLBACK_RETENTION_DAYS`) and the rollback volume has not been swept.", + "tags": [ + "Postgres Upgrades" ] } }, "/files/{file_path}": { "get": { - "tags": [ - "Files" - ], "operationId": "get_file", "parameters": [ { - "name": "file_path", - "in": "path", "description": "Relative path to the file from static directory", + "in": "path", + "name": "file_path", "required": true, "schema": { "type": "string" @@ -58924,10 +59398,10 @@ ], "responses": { "200": { - "description": "File content retrieved successfully", "content": { "application/octet-stream": {} - } + }, + "description": "File content retrieved successfully" }, "401": { "description": "Authentication required" @@ -58946,16 +59420,15 @@ { "bearer_auth": [] } + ], + "tags": [ + "Files" ] } }, "/flags/exposure": { "post": { - "tags": [ - "Feature Flags" - ], - "summary": "Record which flags a running app actually evaluated.", - "description": "This is what makes `last_evaluated_at` mean something. The snapshot\nendpoint hands the SDK every flag in the environment and evaluation then\nhappens locally, so the control plane cannot otherwise tell a flag that is\nreferenced by live code from one nothing has called in a year. Stamping on\nsnapshot fetch would mark every flag as freshly used and defeat the point.\n\nScope comes from the deployment token, never the body. The endpoint writes\nonly `last_evaluated_at` \u2014 never a flag's value \u2014 so \"a deployment token\ncannot change what a flag serves\" still holds despite this being a write.", + "description": "This is what makes `last_evaluated_at` mean something. The snapshot\nendpoint hands the SDK every flag in the environment and evaluation then\nhappens locally, so the control plane cannot otherwise tell a flag that is\nreferenced by live code from one nothing has called in a year. Stamping on\nsnapshot fetch would mark every flag as freshly used and defeat the point.\n\nScope comes from the deployment token, never the body. The endpoint writes\nonly `last_evaluated_at` — never a flag's value — so \"a deployment token\ncannot change what a flag serves\" still holds despite this being a write.", "operationId": "record_flag_exposure", "requestBody": { "content": { @@ -58969,14 +59442,14 @@ }, "responses": { "200": { - "description": "Exposure recorded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecordExposureResponse" } } - } + }, + "description": "Exposure recorded" }, "400": { "description": "Deployment token required" @@ -58995,42 +59468,42 @@ { "bearer_auth": [] } + ], + "summary": "Record which flags a running app actually evaluated.", + "tags": [ + "Feature Flags" ] } }, "/flags/snapshot": { "get": { - "tags": [ - "Feature Flags" - ], - "summary": "Every flag for the caller's environment, collapsed to what the evaluator\nneeds.", "description": "Scope comes from the deployment token, never from the URL: a container's\nbaked-in `TEMPS_API_TOKEN` identifies exactly one project (and usually one\nenvironment), so a compromised app cannot read another tenant's flags by\nchanging a path parameter.\n\nSupports `If-None-Match`, so the SDK's background poll is a 304 in the\ncommon case.", "operationId": "get_flag_snapshot", "parameters": [ { - "name": "environment_id", - "in": "query", "description": "Required only when the calling token is project-wide rather than scoped\nto a single environment.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } } ], "responses": { "200": { - "description": "Snapshot for the environment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagSnapshotResponse" } } - } + }, + "description": "Snapshot for the environment" }, "304": { "description": "Snapshot unchanged" @@ -59052,21 +59525,21 @@ { "bearer_auth": [] } + ], + "summary": "Every flag for the caller's environment, collapsed to what the evaluator\nneeds.", + "tags": [ + "Feature Flags" ] } }, "/geo/{ip}": { "get": { - "tags": [ - "geo" - ], - "summary": "Get geolocation information for an IP address", "operationId": "get_ip_geolocation", "parameters": [ { - "name": "ip", - "in": "path", "description": "IP address to geolocate (IPv4 or IPv6)", + "in": "path", + "name": "ip", "required": true, "schema": { "type": "string" @@ -59075,116 +59548,116 @@ ], "responses": { "200": { - "description": "Geolocation information retrieved", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GeoLocationResponse" } } - } + }, + "description": "Geolocation information retrieved" }, "400": { - "description": "Invalid IP address", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid IP address" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "IP address not found in database", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "IP address not found in database" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get geolocation information for an IP address", + "tags": [ + "geo" ] } }, "/git-connections": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "List user's git provider connections", "operationId": "list_connections", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number for pagination (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Number of items per page (default: 30, max: 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "sort", - "in": "query", "description": "Sort field (created_at, updated_at, account_name)", + "in": "query", + "name": "sort", "required": false, "schema": { "type": "string" } }, { - "name": "direction", - "in": "query", "description": "Sort direction (asc, desc), default: desc", + "in": "query", + "name": "direction", "required": false, "schema": { "type": "string" @@ -59193,14 +59666,14 @@ ], "responses": { "200": { - "description": "List of connections", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectionListResponse" } } - } + }, + "description": "List of connections" }, "401": { "description": "Unauthorized" @@ -59213,25 +59686,25 @@ { "bearer_auth": [] } + ], + "summary": "List user's git provider connections", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}": { "delete": { - "tags": [ - "Git Providers" - ], - "summary": "Permanently delete a git provider connection", "operationId": "delete_connection", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -59256,25 +59729,25 @@ { "bearer_auth": [] } + ], + "summary": "Permanently delete a git provider connection", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}/activate": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Activate a git provider connection", "operationId": "activate_connection", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -59299,25 +59772,25 @@ { "bearer_auth": [] } + ], + "summary": "Activate a git provider connection", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}/deactivate": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Deactivate a git provider connection", "operationId": "deactivate_connection", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -59342,39 +59815,39 @@ { "bearer_auth": [] } + ], + "summary": "Deactivate a git provider connection", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}/health-check": { "post": { - "tags": [ - "Git Provider Connections" - ], - "summary": "Run an on-demand health check for a git connection.", "description": "Probes the upstream (GitHub App, PAT, or OAuth token), persists the result,\nand fires admin notifications on status transitions. Returns the updated\nconnection.", "operationId": "run_connection_health_check", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Health check completed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConnectionResponse" } } - } + }, + "description": "Health check completed" }, "401": { "description": "Unauthorized" @@ -59390,99 +59863,99 @@ { "bearer_auth": [] } + ], + "summary": "Run an on-demand health check for a git connection.", + "tags": [ + "Git Provider Connections" ] } }, "/git-connections/{connection_id}/repositories": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "List repositories for a specific connection", "description": "Fetches repositories from the connected git provider with support for pagination, search, and filtering.\nThis endpoint calls the provider's API directly to get the most up-to-date repository list.", "operationId": "list_repositories_by_connection", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number for pagination", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Number of items per page (max 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "sort", - "in": "query", "description": "Sort field (name, created_at, updated_at, stars, etc.)", + "in": "query", + "name": "sort", "required": false, "schema": { "type": "string" } }, { - "name": "direction", - "in": "query", "description": "Sort direction (asc, desc)", + "in": "query", + "name": "direction", "required": false, "schema": { "type": "string" } }, { - "name": "search", - "in": "query", "description": "Search term to filter repositories", + "in": "query", + "name": "search", "required": false, "schema": { "type": "string" } }, { - "name": "owner", - "in": "query", "description": "Filter by repository owner", + "in": "query", + "name": "owner", "required": false, "schema": { "type": "string" } }, { - "name": "language", - "in": "query", "description": "Filter by programming language", + "in": "query", + "name": "language", "required": false, "schema": { "type": "string" } }, { - "name": "private", - "in": "query", "description": "Filter by private status (true/false)", + "in": "query", + "name": "private", "required": false, "schema": { "type": "boolean" @@ -59491,14 +59964,14 @@ ], "responses": { "200": { - "description": "List of repositories", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryListResponse" } } - } + }, + "description": "List of repositories" }, "401": { "description": "Unauthorized" @@ -59514,39 +59987,39 @@ { "bearer_auth": [] } + ], + "summary": "List repositories for a specific connection", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}/sync": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Start a repository sync for a connection", - "description": "Kicks off a background sync of the connection's repositories from the\nprovider. Returns `202 Accepted` immediately \u2014 the caller should poll\nthe connection endpoint for `syncing` / `synced_repository_count`\nupdates rather than waiting on this response. The sync is guarded by\na hard deadline and always releases the `syncing` flag on exit, so a\nclient that disconnects mid-sync will not leave the connection stuck.", + "description": "Kicks off a background sync of the connection's repositories from the\nprovider. Returns `202 Accepted` immediately — the caller should poll\nthe connection endpoint for `syncing` / `synced_repository_count`\nupdates rather than waiting on this response. The sync is guarded by\na hard deadline and always releases the `syncing` flag on exit, so a\nclient that disconnects mid-sync will not leave the connection stuck.", "operationId": "sync_repositories", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "202": { - "description": "Repository sync started in background", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositorySyncStartedResponse" } } - } + }, + "description": "Repository sync started in background" }, "401": { "description": "Unauthorized" @@ -59565,25 +60038,25 @@ { "bearer_auth": [] } + ], + "summary": "Start a repository sync for a connection", + "tags": [ + "Git Providers" ] } }, "/git-connections/{connection_id}/update-token": { "post": { - "tags": [ - "Git Provider Connections" - ], - "summary": "Update access token for a connection (when tokens expire or are rotated)", "operationId": "update_connection_token", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -59599,14 +60072,14 @@ }, "responses": { "200": { - "description": "Token updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateTokenResponse" } } - } + }, + "description": "Token updated successfully" }, "401": { "description": "Unauthorized" @@ -59622,38 +60095,38 @@ { "bearer_auth": [] } + ], + "summary": "Update access token for a connection (when tokens expire or are rotated)", + "tags": [ + "Git Provider Connections" ] } }, "/git-connections/{connection_id}/validate": { "get": { - "tags": [ - "Git Provider Connections" - ], - "summary": "Validate a connection by testing the access token", "operationId": "validate_connection", "parameters": [ { - "name": "connection_id", - "in": "path", "description": "Connection ID", + "in": "path", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Connection validation result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidationResponse" } } - } + }, + "description": "Connection validation result" }, "401": { "description": "Unauthorized" @@ -59669,29 +60142,29 @@ { "bearer_auth": [] } + ], + "summary": "Validate a connection by testing the access token", + "tags": [ + "Git Provider Connections" ] } }, "/git-providers": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "List all git providers", "operationId": "list_git_providers", "responses": { "200": { - "description": "List of providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of providers" }, "401": { "description": "Unauthorized" @@ -59704,13 +60177,13 @@ { "bearer_auth": [] } + ], + "summary": "List all git providers", + "tags": [ + "Git Providers" ] }, "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a new git provider configuration", "operationId": "create_git_provider", "requestBody": { "content": { @@ -59724,14 +60197,14 @@ }, "responses": { "201": { - "description": "Provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "Provider created successfully" }, "400": { "description": "Bad request" @@ -59747,15 +60220,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a new git provider configuration", + "tags": [ + "Git Providers" ] } }, "/git-providers/bitbucket": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a Bitbucket Cloud provider with access token or app password authentication", "operationId": "create_bitbucket_provider", "requestBody": { "content": { @@ -59769,17 +60242,17 @@ }, "responses": { "201": { - "description": "Bitbucket provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "Bitbucket provider created successfully" }, "400": { - "description": "Bad request \u2014 missing or invalid auth fields" + "description": "Bad request — missing or invalid auth fields" }, "401": { "description": "Unauthorized" @@ -59795,15 +60268,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a Bitbucket Cloud provider with access token or app password authentication", + "tags": [ + "Git Providers" ] } }, "/git-providers/generic": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a Generic git provider for self-hosted or arbitrary HTTPS git hosts.\nSupports public repositories (no token) and private repositories (token-based).", "operationId": "create_generic_provider", "requestBody": { "content": { @@ -59817,17 +60290,17 @@ }, "responses": { "201": { - "description": "Generic git provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "Generic git provider created successfully" }, "400": { - "description": "Bad request \u2014 invalid clone URL or missing fields" + "description": "Bad request — invalid clone URL or missing fields" }, "401": { "description": "Unauthorized" @@ -59843,15 +60316,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a Generic git provider for self-hosted or arbitrary HTTPS git hosts.\nSupports public repositories (no token) and private repositories (token-based).", + "tags": [ + "Git Providers" ] } }, "/git-providers/gitea/pat": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a Gitea Personal Access Token provider", "operationId": "create_gitea_pat_provider", "requestBody": { "content": { @@ -59865,17 +60338,17 @@ }, "responses": { "201": { - "description": "Gitea PAT provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "Gitea PAT provider created successfully" }, "400": { - "description": "Bad request \u2014 invalid URL or missing fields" + "description": "Bad request — invalid URL or missing fields" }, "401": { "description": "Unauthorized" @@ -59891,15 +60364,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a Gitea Personal Access Token provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/github/pat": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a GitHub Personal Access Token provider", "operationId": "create_github_pat_provider", "requestBody": { "content": { @@ -59913,14 +60386,14 @@ }, "responses": { "201": { - "description": "GitHub PAT provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "GitHub PAT provider created successfully" }, "400": { "description": "Bad request" @@ -59936,15 +60409,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a GitHub Personal Access Token provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/gitlab/oauth": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a GitLab OAuth provider", "operationId": "create_gitlab_oauth_provider", "requestBody": { "content": { @@ -59958,14 +60431,14 @@ }, "responses": { "201": { - "description": "GitLab OAuth provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "GitLab OAuth provider created successfully" }, "400": { "description": "Bad request" @@ -59981,15 +60454,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a GitLab OAuth provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/gitlab/pat": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Create a GitLab PAT provider", "operationId": "create_gitlab_pat_provider", "requestBody": { "content": { @@ -60003,14 +60476,14 @@ }, "responses": { "201": { - "description": "GitLab PAT provider created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "GitLab PAT provider created successfully" }, "400": { "description": "Bad request" @@ -60026,38 +60499,34 @@ { "bearer_auth": [] } + ], + "summary": "Create a GitLab PAT provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}": { - "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get a specific git provider", - "operationId": "get_git_provider", + "delete": { + "operationId": "delete_git_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Provider details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProviderResponse" - } - } - } + "204": { + "description": "Provider deleted successfully" + }, + "400": { + "description": "Provider has connections and cannot be deleted" }, "401": { "description": "Unauthorized" @@ -60073,32 +60542,36 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Git Providers" ], "summary": "Permanently delete a git provider", - "operationId": "delete_git_provider", + "tags": [ + "Git Providers" + ] + }, + "get": { + "operationId": "get_git_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Provider deleted successfully" - }, - "400": { - "description": "Provider has connections and cannot be deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProviderResponse" + } + } + }, + "description": "Provider details" }, "401": { "description": "Unauthorized" @@ -60114,25 +60587,25 @@ { "bearer_auth": [] } + ], + "summary": "Get a specific git provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/activate": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Activate a git provider", "operationId": "activate_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -60154,40 +60627,40 @@ { "bearer_auth": [] } + ], + "summary": "Activate a git provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/callback": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Handle OAuth callback for a git provider", "operationId": "handle_git_provider_oauth_callback", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Git provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "code", - "in": "query", "description": "OAuth authorization code", + "in": "query", + "name": "code", "required": true, "schema": { "type": "string" } }, { - "name": "state", - "in": "query", "description": "CSRF state token", + "in": "query", + "name": "state", "required": true, "schema": { "type": "string" @@ -60207,41 +60680,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Handle OAuth callback for a git provider", + "tags": [ + "Git Providers" + ] } }, "/git-providers/{provider_id}/connections": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get connections for a specific git provider", "operationId": "get_provider_connections", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID to get connections for", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of connections for the provider", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ConnectionResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of connections for the provider" }, "401": { "description": "Unauthorized" @@ -60257,25 +60730,25 @@ { "bearer_auth": [] } + ], + "summary": "Get connections for a specific git provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/credentials": { "patch": { - "tags": [ - "Git Providers" - ], - "summary": "Partially update credentials for an existing git provider. Only the fields\nyou send are replaced; omitted fields keep their stored values. Fields that\ndon't apply to the provider's auth method are ignored on the service side.", "operationId": "update_git_provider_credentials", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Git provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -60291,14 +60764,14 @@ }, "responses": { "200": { - "description": "Credentials updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderResponse" } } - } + }, + "description": "Credentials updated" }, "400": { "description": "Bad request" @@ -60320,25 +60793,25 @@ { "bearer_auth": [] } + ], + "summary": "Partially update credentials for an existing git provider. Only the fields\nyou send are replaced; omitted fields keep their stored values. Fields that\ndon't apply to the provider's auth method are ignored on the service side.", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/deactivate": { "post": { - "tags": [ - "Git Providers" - ], - "summary": "Deactivate a git provider", "operationId": "deactivate_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -60360,38 +60833,38 @@ { "bearer_auth": [] } + ], + "summary": "Deactivate a git provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/deletion-check": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Check if a git provider can be safely deleted", "operationId": "check_provider_deletion_safety", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Git provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deletion check result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderDeletionCheckResponse" } } - } + }, + "description": "Deletion check result" }, "404": { "description": "Provider not found" @@ -60404,25 +60877,25 @@ { "bearer_auth": [] } + ], + "summary": "Check if a git provider can be safely deleted", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/oauth/authorize": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Start OAuth flow for a git provider", "operationId": "start_git_provider_oauth", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Git provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -60441,99 +60914,99 @@ { "bearer_auth": [] } + ], + "summary": "Start OAuth flow for a git provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/repositories": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "List all repositories for a specific provider", "description": "Lists repositories synced to the database across every connection under\nthis provider, with the same pagination/filtering as `/repositories`.", "operationId": "list_repositories_by_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number for pagination", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Number of items per page (max 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "sort", - "in": "query", "description": "Sort field (name, created_at, updated_at, stars, watchers, size, issues)", + "in": "query", + "name": "sort", "required": false, "schema": { "type": "string" } }, { - "name": "direction", - "in": "query", "description": "Sort direction (asc, desc)", + "in": "query", + "name": "direction", "required": false, "schema": { "type": "string" } }, { - "name": "search", - "in": "query", "description": "Search term to filter repositories", + "in": "query", + "name": "search", "required": false, "schema": { "type": "string" } }, { - "name": "owner", - "in": "query", "description": "Filter by repository owner", + "in": "query", + "name": "owner", "required": false, "schema": { "type": "string" } }, { - "name": "language", - "in": "query", "description": "Filter by programming language", + "in": "query", + "name": "language", "required": false, "schema": { "type": "string" } }, { - "name": "private", - "in": "query", "description": "Filter by private status (true/false)", + "in": "query", + "name": "private", "required": false, "schema": { "type": "boolean" @@ -60542,14 +61015,14 @@ ], "responses": { "200": { - "description": "List of repositories", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryListResponse" } } - } + }, + "description": "List of repositories" }, "401": { "description": "Unauthorized" @@ -60565,25 +61038,25 @@ { "bearer_auth": [] } + ], + "summary": "List all repositories for a specific provider", + "tags": [ + "Git Providers" ] } }, "/git-providers/{provider_id}/safe-delete": { "delete": { - "tags": [ - "Git Providers" - ], - "summary": "Safely delete a git provider (only if no projects are using it)", "operationId": "delete_provider_safely", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "Git provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -60605,39 +61078,39 @@ { "bearer_auth": [] } + ], + "summary": "Safely delete a git provider (only if no projects are using it)", + "tags": [ + "Git Providers" ] } }, "/git/public/{provider}/{owner}/{repo}": { "get": { - "tags": [ - "Public Repositories" - ], - "summary": "Get information about a public repository (supports GitHub and GitLab)", "operationId": "get_public_repository", "parameters": [ { - "name": "provider", - "in": "path", "description": "Git provider (github or gitlab)", + "in": "path", + "name": "provider", "required": true, "schema": { "type": "string" } }, { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "repo", - "in": "path", "description": "Repository name", + "in": "path", + "name": "repo", "required": true, "schema": { "type": "string" @@ -60646,14 +61119,14 @@ ], "responses": { "200": { - "description": "Repository information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicRepositoryInfo" } } - } + }, + "description": "Repository information" }, "400": { "description": "Provider not supported" @@ -60667,48 +61140,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get information about a public repository (supports GitHub and GitLab)", + "tags": [ + "Public Repositories" + ] } }, "/git/public/{provider}/{owner}/{repo}/branches": { "get": { - "tags": [ - "Public Repositories" - ], - "summary": "Get branches for a public repository (supports GitHub and GitLab)", "operationId": "get_public_branches", "parameters": [ { - "name": "provider", - "in": "path", "description": "Git provider (github or gitlab)", + "in": "path", + "name": "provider", "required": true, "schema": { "type": "string" } }, { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "repo", - "in": "path", "description": "Repository name", + "in": "path", + "name": "repo", "required": true, "schema": { "type": "string" } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -60717,14 +61190,14 @@ ], "responses": { "200": { - "description": "List of branches", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BranchListResponse" } } - } + }, + "description": "List of branches" }, "400": { "description": "Provider not supported" @@ -60738,48 +61211,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get branches for a public repository (supports GitHub and GitLab)", + "tags": [ + "Public Repositories" + ] } }, "/git/public/{provider}/{owner}/{repo}/presets": { "get": { - "tags": [ - "Public Repositories" - ], - "summary": "Detect presets for a public repository (supports GitHub and GitLab)", "operationId": "detect_public_presets", "parameters": [ { - "name": "provider", - "in": "path", "description": "Git provider (github or gitlab)", + "in": "path", + "name": "provider", "required": true, "schema": { "type": "string" } }, { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "repo", - "in": "path", "description": "Repository name", + "in": "path", + "name": "repo", "required": true, "schema": { "type": "string" } }, { - "name": "branch", - "in": "query", "description": "Branch name to detect presets for (default: repository's default branch)", + "in": "query", + "name": "branch", "required": false, "schema": { "type": [ @@ -60789,9 +61262,9 @@ } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -60800,14 +61273,14 @@ ], "responses": { "200": { - "description": "Detected presets", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicPresetResponse" } } - } + }, + "description": "Detected presets" }, "400": { "description": "Provider not supported" @@ -60821,15 +61294,15 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Detect presets for a public repository (supports GitHub and GitLab)", + "tags": [ + "Public Repositories" + ] } }, "/imports/discover": { "post": { - "tags": [ - "Imports" - ], - "summary": "Discover workloads from a source", "operationId": "discover_workloads", "requestBody": { "content": { @@ -60843,14 +61316,14 @@ }, "responses": { "200": { - "description": "List of discovered workloads", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DiscoverResponse" } } - } + }, + "description": "List of discovered workloads" }, "400": { "description": "Invalid request" @@ -60866,15 +61339,15 @@ { "bearer_auth": [] } + ], + "summary": "Discover workloads from a source", + "tags": [ + "Imports" ] } }, "/imports/execute": { "post": { - "tags": [ - "Imports" - ], - "summary": "Execute an import", "operationId": "execute_import", "requestBody": { "content": { @@ -60888,14 +61361,14 @@ }, "responses": { "202": { - "description": "Import execution started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExecuteImportResponse" } } - } + }, + "description": "Import execution started" }, "400": { "description": "Invalid request" @@ -60911,15 +61384,15 @@ { "bearer_auth": [] } + ], + "summary": "Execute an import", + "tags": [ + "Imports" ] } }, "/imports/plan": { "post": { - "tags": [ - "Imports" - ], - "summary": "Create an import plan", "operationId": "create_plan", "requestBody": { "content": { @@ -60933,14 +61406,14 @@ }, "responses": { "200": { - "description": "Import plan created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatePlanResponse" } } - } + }, + "description": "Import plan created" }, "400": { "description": "Invalid request" @@ -60956,29 +61429,29 @@ { "bearer_auth": [] } + ], + "summary": "Create an import plan", + "tags": [ + "Imports" ] } }, "/imports/sources": { "get": { - "tags": [ - "Imports" - ], - "summary": "List available import sources", "operationId": "list_sources", "responses": { "200": { - "description": "List of available import sources", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ImportSourceInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of available import sources" }, "401": { "description": "Unauthorized" @@ -60991,21 +61464,21 @@ { "bearer_auth": [] } + ], + "summary": "List available import sources", + "tags": [ + "Imports" ] } }, "/imports/{session_id}": { "get": { - "tags": [ - "Imports" - ], - "summary": "Get import status", "operationId": "get_import_status", "parameters": [ { - "name": "session_id", - "in": "path", "description": "Import session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { "type": "string" @@ -61014,14 +61487,14 @@ ], "responses": { "200": { - "description": "Import status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ImportStatusResponse" } } - } + }, + "description": "Import status" }, "401": { "description": "Unauthorized" @@ -61037,38 +61510,38 @@ { "bearer_auth": [] } + ], + "summary": "Get import status", + "tags": [ + "Imports" ] } }, "/incidents/{incident_id}": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get an incident by ID", "operationId": "get_incident", "parameters": [ { - "name": "incident_id", - "in": "path", "description": "Incident ID", + "in": "path", + "name": "incident_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved incident", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" } } - } + }, + "description": "Successfully retrieved incident" }, "401": { "description": "Unauthorized" @@ -61087,25 +61560,25 @@ { "bearer_auth": [] } + ], + "summary": "Get an incident by ID", + "tags": [ + "Status Page" ] } }, "/incidents/{incident_id}/status": { "patch": { - "tags": [ - "Status Page" - ], - "summary": "Update incident status", "operationId": "update_incident_status", "parameters": [ { - "name": "incident_id", - "in": "path", "description": "Incident ID", + "in": "path", + "name": "incident_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -61121,14 +61594,14 @@ }, "responses": { "200": { - "description": "Incident status updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" } } - } + }, + "description": "Incident status updated successfully" }, "400": { "description": "Invalid request" @@ -61150,41 +61623,41 @@ { "bearer_auth": [] } + ], + "summary": "Update incident status", + "tags": [ + "Status Page" ] } }, "/incidents/{incident_id}/updates": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get incident updates", "operationId": "get_incident_updates", "parameters": [ { - "name": "incident_id", - "in": "path", "description": "Incident ID", + "in": "path", + "name": "incident_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved incident updates", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/IncidentUpdateResponse" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved incident updates" }, "401": { "description": "Unauthorized" @@ -61203,26 +61676,26 @@ { "bearer_auth": [] } + ], + "summary": "Get incident updates", + "tags": [ + "Status Page" ] } }, "/internal/nodes": { "get": { - "tags": [ - "Nodes" - ], - "summary": "List all registered nodes (admin \u2014 session auth via RequireAuth)", "operationId": "admin_list_nodes", "responses": { "200": { - "description": "List of nodes", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NodeListResponse" } } - } + }, + "description": "List of nodes" }, "401": { "description": "Unauthorized" @@ -61235,15 +61708,15 @@ { "bearer_auth": [] } + ], + "summary": "List all registered nodes (admin — session auth via RequireAuth)", + "tags": [ + "Nodes" ] } }, "/internal/nodes/register": { "post": { - "tags": [ - "Nodes" - ], - "summary": "Register a new worker node or reconnect an existing one", "operationId": "register_node", "requestBody": { "content": { @@ -61257,24 +61730,24 @@ }, "responses": { "200": { - "description": "Node reconnected successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterNodeResponse" } } - } + }, + "description": "Node reconnected successfully" }, "201": { - "description": "Node registered successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterNodeResponse" } } - } + }, + "description": "Node registered successfully" }, "400": { "description": "Validation error" @@ -61282,38 +61755,38 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Register a new worker node or reconnect an existing one", + "tags": [ + "Nodes" + ] } }, "/internal/nodes/{node_id}": { - "get": { - "tags": [ - "Nodes" - ], - "summary": "Get a specific node by ID (admin \u2014 session auth via RequireAuth)", - "operationId": "admin_get_node", + "delete": { + "operationId": "admin_remove_node", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Node details", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NodeInfoResponse" + "$ref": "#/components/schemas/RemoveNodeResponse" } } - } + }, + "description": "Node removed" }, "401": { "description": "Unauthorized" @@ -61321,6 +61794,9 @@ "404": { "description": "Node not found" }, + "409": { + "description": "Node still has active containers" + }, "500": { "description": "Internal server error" } @@ -61329,36 +61805,36 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Nodes" ], "summary": "Remove a node from the cluster entirely. The node should be drained first\nto ensure containers have been rescheduled. If the node still has active\ncontainers, it will be drained automatically before removal.", - "operationId": "admin_remove_node", + "tags": [ + "Nodes" + ] + }, + "get": { + "operationId": "admin_get_node", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Node removed", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RemoveNodeResponse" + "$ref": "#/components/schemas/NodeInfoResponse" } } - } + }, + "description": "Node details" }, "401": { "description": "Unauthorized" @@ -61366,9 +61842,6 @@ "404": { "description": "Node not found" }, - "409": { - "description": "Node still has active containers" - }, "500": { "description": "Internal server error" } @@ -61377,38 +61850,38 @@ { "bearer_auth": [] } + ], + "summary": "Get a specific node by ID (admin — session auth via RequireAuth)", + "tags": [ + "Nodes" ] } }, "/internal/nodes/{node_id}/containers": { "get": { - "tags": [ - "Nodes" - ], - "summary": "List all containers running on a specific node", "operationId": "admin_list_node_containers", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Containers on this node", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NodeContainerListResponse" } } - } + }, + "description": "Containers on this node" }, "401": { "description": "Unauthorized" @@ -61424,25 +61897,25 @@ { "bearer_auth": [] } + ], + "summary": "List all containers running on a specific node", + "tags": [ + "Nodes" ] } }, "/internal/nodes/{node_id}/dns/ack": { "post": { - "tags": [ - "Internal DNS" - ], - "summary": "`POST /internal/nodes/{node_id}/dns/ack`", "operationId": "post_dns_ack", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node id, must match the bearer token's node", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -61458,14 +61931,14 @@ }, "responses": { "200": { - "description": "ACK accepted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsAckResponse" } } - } + }, + "description": "ACK accepted" }, "400": { "description": "ACK higher than server generation" @@ -61479,48 +61952,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "`POST /internal/nodes/{node_id}/dns/ack`", + "tags": [ + "Internal DNS" + ] } }, "/internal/nodes/{node_id}/dns/changes": { "get": { - "tags": [ - "Internal DNS" - ], - "summary": "`GET /internal/nodes/{node_id}/dns/changes?since=N`", "operationId": "get_dns_changes", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node id, must match the bearer token's node", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "since", - "in": "query", "description": "Highest generation the agent has already applied. Pass `0` to\nrequest a full zone snapshot. Defaults to `0` if omitted.", + "in": "query", + "name": "since", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Diff or full snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DnsChangesResponse" } } - } + }, + "description": "Diff or full snapshot" }, "401": { "description": "Missing or invalid bearer token" @@ -61531,84 +62004,84 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "`GET /internal/nodes/{node_id}/dns/changes?since=N`", + "tags": [ + "Internal DNS" + ] } }, "/internal/nodes/{node_id}/drain": { - "get": { - "tags": [ - "Nodes" - ], - "summary": "Get the drain status for a node, including migration progress.", - "description": "Returns container counts and whether the drain is complete.\nCan be polled to track drain progress.", - "operationId": "admin_drain_status", + "delete": { + "operationId": "admin_undrain_node", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Drain status", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DrainStatusResponse" + "$ref": "#/components/schemas/UndrainNodeResponse" } } - } + }, + "description": "Node reactivated" + }, + "400": { + "description": "Node not in drainable state" }, "401": { "description": "Unauthorized" }, "404": { "description": "Node not found" - }, - "500": { - "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "post": { + ], + "summary": "Undrain (reactivate) a node so it can accept new deployments again.\nOnly works for nodes in \"draining\" or \"drained\" status.", "tags": [ "Nodes" - ], - "summary": "Drain a node: mark it as \"draining\" so no new replicas are scheduled on it,\nand trigger redeployment of all affected environments so their containers\nare rescheduled to healthy nodes.", - "operationId": "admin_drain_node", + ] + }, + "get": { + "description": "Returns container counts and whether the drain is complete.\nCan be polled to track drain progress.", + "operationId": "admin_drain_status", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Node drain initiated", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DrainNodeResponse" + "$ref": "#/components/schemas/DrainStatusResponse" } } - } + }, + "description": "Drain status" }, "401": { "description": "Unauthorized" @@ -61624,70 +62097,70 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Get the drain status for a node, including migration progress.", "tags": [ "Nodes" - ], - "summary": "Undrain (reactivate) a node so it can accept new deployments again.\nOnly works for nodes in \"draining\" or \"drained\" status.", - "operationId": "admin_undrain_node", + ] + }, + "post": { + "operationId": "admin_drain_node", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Node reactivated", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UndrainNodeResponse" + "$ref": "#/components/schemas/DrainNodeResponse" } } - } - }, - "400": { - "description": "Node not in drainable state" + }, + "description": "Node drain initiated" }, "401": { "description": "Unauthorized" }, "404": { "description": "Node not found" + }, + "500": { + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Drain a node: mark it as \"draining\" so no new replicas are scheduled on it,\nand trigger redeployment of all affected environments so their containers\nare rescheduled to healthy nodes.", + "tags": [ + "Nodes" ] } }, "/internal/nodes/{node_id}/heartbeat": { "post": { - "tags": [ - "Nodes" - ], - "summary": "Receive a heartbeat from a worker node", "operationId": "node_heartbeat", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -61703,14 +62176,14 @@ }, "responses": { "200": { - "description": "Heartbeat received", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HeartbeatResponse" } } - } + }, + "description": "Heartbeat received" }, "401": { "description": "Unauthorized" @@ -61721,38 +62194,38 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Receive a heartbeat from a worker node", + "tags": [ + "Nodes" + ] } }, "/internal/nodes/{node_id}/network/peers": { "get": { - "tags": [ - "Nodes" - ], - "summary": "`GET /internal/nodes/{node_id}/network/peers`", "operationId": "list_peers", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node id, must match the bearer token's node", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Peer list and self-allocation", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PeerListResponse" } } - } + }, + "description": "Peer list and self-allocation" }, "401": { "description": "Missing or invalid bearer token" @@ -61763,49 +62236,49 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "`GET /internal/nodes/{node_id}/network/peers`", + "tags": [ + "Nodes" + ] } }, "/internal/nodes/{node_id}/s3-credentials/{s3_source_id}": { "get": { - "tags": [ - "Nodes" - ], - "summary": "Get decrypted S3 credentials for a backup/restore operation.", "description": "Agents call this endpoint to receive the S3 credentials they need to upload\nor download backups. The credentials are decrypted from the stored S3 source\nand returned over the authenticated TLS/WireGuard channel.", "operationId": "get_s3_credentials", "parameters": [ { - "name": "node_id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "node_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "s3_source_id", - "in": "path", "description": "S3 source ID", + "in": "path", + "name": "s3_source_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "S3 credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/S3CredentialsResponse" } } - } + }, + "description": "S3 credentials" }, "401": { "description": "Unauthorized" @@ -61816,21 +62289,21 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get decrypted S3 credentials for a backup/restore operation.", + "tags": [ + "Nodes" + ] } }, "/ip-access-control": { "get": { - "tags": [ - "IP Access Control" - ], - "summary": "List all IP access control rules", "operationId": "list_ip_access_control", "parameters": [ { - "name": "action", - "in": "query", "description": "Filter by action (\"block\" or \"allow\")", + "in": "query", + "name": "action", "required": false, "schema": { "type": [ @@ -61842,60 +62315,60 @@ ], "responses": { "200": { - "description": "List of IP access control rules", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/IpAccessControlResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of IP access control rules" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List all IP access control rules", + "tags": [ + "IP Access Control" ] }, "post": { - "tags": [ - "IP Access Control" - ], - "summary": "Create a new IP access control rule", "operationId": "create_ip_access_control", "requestBody": { "content": { @@ -61909,85 +62382,85 @@ }, "responses": { "201": { - "description": "IP access control rule created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IpAccessControlResponse" } } - } + }, + "description": "IP access control rule created" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "409": { - "description": "Duplicate IP address", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Duplicate IP address" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Create a new IP access control rule", + "tags": [ + "IP Access Control" ] } }, "/ip-access-control/check/{ip}": { "get": { - "tags": [ - "IP Access Control" - ], - "summary": "Check if an IP address is blocked", "operationId": "check_ip_blocked", "parameters": [ { - "name": "ip", - "in": "path", "description": "IP address to check", + "in": "path", + "name": "ip", "required": true, "schema": { "type": "string" @@ -61999,204 +62472,204 @@ "description": "IP block status" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Check if an IP address is blocked", + "tags": [ + "IP Access Control" ] } }, "/ip-access-control/{id}": { - "get": { - "tags": [ - "IP Access Control" - ], - "summary": "Get a single IP access control rule by ID", - "operationId": "get_ip_access_control", + "delete": { + "operationId": "delete_ip_access_control", "parameters": [ { - "name": "id", - "in": "path", "description": "IP access control rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "IP access control rule details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IpAccessControlResponse" - } - } - } + "204": { + "description": "IP access control rule deleted" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "IP access control rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "IP access control rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "IP Access Control" ], "summary": "Delete an IP access control rule", - "operationId": "delete_ip_access_control", + "tags": [ + "IP Access Control" + ] + }, + "get": { + "operationId": "get_ip_access_control", "parameters": [ { - "name": "id", - "in": "path", "description": "IP access control rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "IP access control rule deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IpAccessControlResponse" + } + } + }, + "description": "IP access control rule details" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "IP access control rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "IP access control rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get a single IP access control rule by ID", + "tags": [ + "IP Access Control" ] }, "patch": { - "tags": [ - "IP Access Control" - ], - "summary": "Update an IP access control rule", "operationId": "update_ip_access_control", "parameters": [ { - "name": "id", - "in": "path", "description": "IP access control rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -62212,79 +62685,79 @@ }, "responses": { "200": { - "description": "IP access control rule updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IpAccessControlResponse" } } - } + }, + "description": "IP access control rule updated" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "IP access control rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "IP access control rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update an IP access control rule", + "tags": [ + "IP Access Control" ] } }, "/kv/del": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Delete one or more keys", "operationId": "kv_del", "requestBody": { "content": { @@ -62298,14 +62771,14 @@ }, "responses": { "200": { - "description": "Keys deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelResponse" } } - } + }, + "description": "Keys deleted" }, "401": { "description": "Unauthorized" @@ -62318,26 +62791,26 @@ { "bearer_auth": [] } + ], + "summary": "Delete one or more keys", + "tags": [ + "KV Store" ] } }, "/kv/disable": { "delete": { - "tags": [ - "KV Management" - ], - "summary": "Disable KV service", "operationId": "kv_disable", "responses": { "200": { - "description": "KV service disabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DisableKvResponse" } } - } + }, + "description": "KV service disabled" }, "401": { "description": "Unauthorized" @@ -62353,15 +62826,15 @@ { "bearer_auth": [] } + ], + "summary": "Disable KV service", + "tags": [ + "KV Management" ] } }, "/kv/enable": { "post": { - "tags": [ - "KV Management" - ], - "summary": "Enable KV service", "operationId": "kv_enable", "requestBody": { "content": { @@ -62375,14 +62848,14 @@ }, "responses": { "200": { - "description": "KV service enabled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnableKvResponse" } } - } + }, + "description": "KV service enabled" }, "401": { "description": "Unauthorized" @@ -62395,15 +62868,15 @@ { "bearer_auth": [] } + ], + "summary": "Enable KV service", + "tags": [ + "KV Management" ] } }, "/kv/expire": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Set expiration on a key", "operationId": "kv_expire", "requestBody": { "content": { @@ -62417,14 +62890,14 @@ }, "responses": { "200": { - "description": "Expiration set", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExpireResponse" } } - } + }, + "description": "Expiration set" }, "401": { "description": "Unauthorized" @@ -62437,15 +62910,15 @@ { "bearer_auth": [] } + ], + "summary": "Set expiration on a key", + "tags": [ + "KV Store" ] } }, "/kv/get": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Get a value by key", "operationId": "kv_get", "requestBody": { "content": { @@ -62459,14 +62932,14 @@ }, "responses": { "200": { - "description": "Value retrieved", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetResponse" } } - } + }, + "description": "Value retrieved" }, "401": { "description": "Unauthorized" @@ -62479,15 +62952,15 @@ { "bearer_auth": [] } + ], + "summary": "Get a value by key", + "tags": [ + "KV Store" ] } }, "/kv/incr": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Increment a numeric value", "operationId": "kv_incr", "requestBody": { "content": { @@ -62501,14 +62974,14 @@ }, "responses": { "200": { - "description": "Value incremented", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncrResponse" } } - } + }, + "description": "Value incremented" }, "401": { "description": "Unauthorized" @@ -62521,15 +62994,15 @@ { "bearer_auth": [] } + ], + "summary": "Increment a numeric value", + "tags": [ + "KV Store" ] } }, "/kv/keys": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Get keys matching a pattern", "operationId": "kv_keys", "requestBody": { "content": { @@ -62543,14 +63016,14 @@ }, "responses": { "200": { - "description": "Keys retrieved", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KeysResponse" } } - } + }, + "description": "Keys retrieved" }, "401": { "description": "Unauthorized" @@ -62563,15 +63036,15 @@ { "bearer_auth": [] } + ], + "summary": "Get keys matching a pattern", + "tags": [ + "KV Store" ] } }, "/kv/set": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Set a value with optional expiration", "operationId": "kv_set", "requestBody": { "content": { @@ -62585,14 +63058,14 @@ }, "responses": { "200": { - "description": "Value set", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetResponse" } } - } + }, + "description": "Value set" }, "401": { "description": "Unauthorized" @@ -62605,26 +63078,26 @@ { "bearer_auth": [] } + ], + "summary": "Set a value with optional expiration", + "tags": [ + "KV Store" ] } }, "/kv/status": { "get": { - "tags": [ - "KV Management" - ], - "summary": "Get KV service status", "operationId": "kv_status", "responses": { "200": { - "description": "KV service status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KvStatusResponse" } } - } + }, + "description": "KV service status" }, "401": { "description": "Unauthorized" @@ -62637,15 +63110,15 @@ { "bearer_auth": [] } + ], + "summary": "Get KV service status", + "tags": [ + "KV Management" ] } }, "/kv/ttl": { "post": { - "tags": [ - "KV Store" - ], - "summary": "Get time-to-live for a key", "operationId": "kv_ttl", "requestBody": { "content": { @@ -62659,14 +63132,14 @@ }, "responses": { "200": { - "description": "TTL retrieved", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TtlResponse" } } - } + }, + "description": "TTL retrieved" }, "401": { "description": "Unauthorized" @@ -62679,15 +63152,15 @@ { "bearer_auth": [] } + ], + "summary": "Get time-to-live for a key", + "tags": [ + "KV Store" ] } }, "/kv/update": { "patch": { - "tags": [ - "KV Management" - ], - "summary": "Update KV service configuration", "operationId": "kv_update", "requestBody": { "content": { @@ -62701,14 +63174,14 @@ }, "responses": { "200": { - "description": "KV service updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateKvResponse" } } - } + }, + "description": "KV service updated" }, "401": { "description": "Unauthorized" @@ -62724,38 +63197,39 @@ { "bearer_auth": [] } + ], + "summary": "Update KV service configuration", + "tags": [ + "KV Management" ] } }, "/lb/routes": { "get": { - "tags": [ - "Load Balancer" - ], "operationId": "list_routes", "responses": { "200": { - "description": "List of routes", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/RouteResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of routes" }, "500": { "description": "Internal server error" } - } - }, - "post": { + }, "tags": [ "Load Balancer" - ], + ] + }, + "post": { "operationId": "create_route", "requestBody": { "content": { @@ -62769,31 +63243,55 @@ }, "responses": { "201": { - "description": "Route created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteResponse" } } - } + }, + "description": "Route created successfully" }, "400": { "description": "Invalid request" } - } + }, + "tags": [ + "Load Balancer" + ] } }, "/lb/routes/{domain}": { - "get": { + "delete": { + "operationId": "delete_route", + "parameters": [ + { + "in": "path", + "name": "domain", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Route deleted successfully" + }, + "404": { + "description": "Route not found" + } + }, "tags": [ "Load Balancer" - ], + ] + }, + "get": { "operationId": "get_route", "parameters": [ { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -62802,29 +63300,29 @@ ], "responses": { "200": { - "description": "Route found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteResponse" } } - } + }, + "description": "Route found" }, "404": { "description": "Route not found" } - } - }, - "put": { + }, "tags": [ "Load Balancer" - ], + ] + }, + "put": { "operationId": "update_route", "parameters": [ { - "name": "domain", "in": "path", + "name": "domain", "required": true, "schema": { "type": "string" @@ -62843,50 +63341,26 @@ }, "responses": { "200": { - "description": "Route updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteResponse" } } - } + }, + "description": "Route updated successfully" }, "404": { "description": "Route not found" } - } - }, - "delete": { + }, "tags": [ "Load Balancer" - ], - "operationId": "delete_route", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Route deleted successfully" - }, - "404": { - "description": "Route not found" - } - } + ] } }, "/logout": { "post": { - "tags": [ - "Authentication" - ], "operationId": "logout", "responses": { "200": { @@ -62903,113 +63377,112 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/logs/context": { "get": { - "tags": [ - "Logs" - ], - "summary": "Get context lines surrounding a specific log line", "operationId": "get_log_context", "parameters": [ { - "name": "chunk_id", - "in": "query", "description": "Chunk ID", + "in": "query", + "name": "chunk_id", "required": true, "schema": { "type": "string" } }, { - "name": "line_offset", - "in": "query", "description": "Line offset within the chunk", + "in": "query", + "name": "line_offset", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "lines", - "in": "query", "description": "Context lines before and after (default: 25)", + "in": "query", + "name": "lines", "required": false, "schema": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Context lines", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContextLogsResponse" } } - } + }, + "description": "Context lines" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "404": { - "description": "Chunk not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Chunk not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get context lines surrounding a specific log line", + "tags": [ + "Logs" ] } }, "/logs/search": { "post": { - "tags": [ - "Logs" - ], - "summary": "Search logs with structured filters and full text search", "operationId": "search_logs", "requestBody": { "content": { @@ -63023,104 +63496,104 @@ }, "responses": { "200": { - "description": "Search results", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SearchLogsResponse" } } - } + }, + "description": "Search results" }, "400": { - "description": "Invalid search parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid search parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Search logs with structured filters and full text search", + "tags": [ + "Logs" ] } }, "/logs/tail": { "get": { - "tags": [ - "Logs" - ], - "summary": "Live tail logs via Server-Sent Events", "operationId": "tail_logs", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { "type": "string" } }, { - "name": "service", - "in": "query", "description": "Service name", + "in": "query", + "name": "service", "required": true, "schema": { "type": "string" } }, { - "name": "env", - "in": "query", "description": "Environment", + "in": "query", + "name": "env", "required": true, "schema": { "type": "string" } }, { - "name": "levels", - "in": "query", "description": "Optional level filters", + "in": "query", + "name": "levels", "required": true, "schema": { - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } }, { - "name": "text", - "in": "query", "description": "Optional text filter", + "in": "query", + "name": "text", "required": false, "schema": { "type": "string" @@ -63132,35 +63605,35 @@ "description": "SSE stream of log lines" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Live tail logs via Server-Sent Events", + "tags": [ + "Logs" ] } }, "/monitors-health/projects": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get monitor-based health summaries for multiple projects in a single query", "operationId": "get_projects_monitor_health", "parameters": [ { - "name": "project_ids", - "in": "query", "description": "Comma-separated list of project IDs", + "in": "query", + "name": "project_ids", "required": true, "schema": { "type": "string" @@ -63169,14 +63642,14 @@ ], "responses": { "200": { - "description": "Health summaries per project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectsMonitorHealthResponse" } } - } + }, + "description": "Health summaries per project" }, "400": { "description": "Invalid parameters" @@ -63192,38 +63665,31 @@ { "bearer_auth": [] } + ], + "summary": "Get monitor-based health summaries for multiple projects in a single query", + "tags": [ + "Status Page" ] } }, "/monitors/{monitor_id}": { - "get": { - "tags": [ - "Status Page" - ], - "summary": "Get a monitor by ID", - "operationId": "get_monitor", + "delete": { + "operationId": "delete_monitor", "parameters": [ { - "name": "monitor_id", - "in": "path", "description": "Monitor ID", + "in": "path", + "name": "monitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Successfully retrieved monitor", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorResponse" - } - } - } + "204": { + "description": "Monitor deleted successfully" }, "401": { "description": "Unauthorized" @@ -63242,29 +63708,36 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Status Page" ], "summary": "Delete a monitor", - "operationId": "delete_monitor", + "tags": [ + "Status Page" + ] + }, + "get": { + "operationId": "get_monitor", "parameters": [ { - "name": "monitor_id", - "in": "path", "description": "Monitor ID", + "in": "path", + "name": "monitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Monitor deleted successfully" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorResponse" + } + } + }, + "description": "Successfully retrieved monitor" }, "401": { "description": "Unauthorized" @@ -63283,49 +63756,49 @@ { "bearer_auth": [] } + ], + "summary": "Get a monitor by ID", + "tags": [ + "Status Page" ] } }, "/monitors/{monitor_id}/bucketed": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get bucketed status data for a monitor using TimescaleDB", "operationId": "get_bucketed_status", "parameters": [ { - "name": "monitor_id", - "in": "path", "description": "Monitor ID", + "in": "path", + "name": "monitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "interval", - "in": "query", "description": "Bucket interval: '5min', 'hourly', or 'daily' (default: hourly)", + "in": "query", + "name": "interval", "required": false, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601) (default: 24 hours ago)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601) (default: now)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" @@ -63334,14 +63807,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved bucketed status data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusBucketedResponse" } } - } + }, + "description": "Successfully retrieved bucketed status data" }, "400": { "description": "Invalid parameters" @@ -63363,40 +63836,40 @@ { "bearer_auth": [] } + ], + "summary": "Get bucketed status data for a monitor using TimescaleDB", + "tags": [ + "Status Page" ] } }, "/monitors/{monitor_id}/current-status": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get current status and uptime metrics for a monitor", "operationId": "get_current_monitor_status", "parameters": [ { - "name": "monitor_id", - "in": "path", "description": "Monitor ID", + "in": "path", + "name": "monitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", - "in": "query", "description": "Custom start time (ISO 8601) - overrides timeframe", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "Custom end time (ISO 8601)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" @@ -63405,14 +63878,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved current status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CurrentStatusResponse" } } - } + }, + "description": "Successfully retrieved current status" }, "400": { "description": "Invalid time parameters" @@ -63434,50 +63907,50 @@ { "bearer_auth": [] } + ], + "summary": "Get current status and uptime metrics for a monitor", + "tags": [ + "Status Page" ] } }, "/monitors/{monitor_id}/uptime": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get uptime history for a monitor", "operationId": "get_uptime_history", "parameters": [ { - "name": "monitor_id", - "in": "path", "description": "Monitor ID", + "in": "path", + "name": "monitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "days", - "in": "query", "description": "Number of days of history (default: 60) - ignored if start_time/end_time provided", + "in": "query", + "name": "days", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601) - overrides days parameter", + "in": "query", + "name": "start_time", "required": true, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601) - defaults to now", + "in": "query", + "name": "end_time", "required": true, "schema": { "type": "string" @@ -63486,14 +63959,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved uptime history", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UptimeHistoryResponse" } } - } + }, + "description": "Successfully retrieved uptime history" }, "400": { "description": "Invalid time parameters" @@ -63515,72 +63988,72 @@ { "bearer_auth": [] } + ], + "summary": "Get uptime history for a monitor", + "tags": [ + "Status Page" ] } }, "/nodes/{id}/metrics": { "get": { - "tags": [ - "Metrics" - ], - "summary": "Fetch a time-series range for a single metric on a node.", "operationId": "NodeMetricsGetRange", "parameters": [ { - "name": "id", - "in": "path", "description": "Node ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric", - "in": "query", "description": "Metric name, e.g. `\"pg.connections_active\"`.", + "in": "query", + "name": "metric", "required": true, "schema": { "type": "string" } }, { - "name": "range", - "in": "query", "description": "Time window: `\"1h\"` | `\"6h\"` | `\"24h\"` | `\"7d\"`.", + "in": "query", + "name": "range", "required": false, "schema": { "type": "string" } }, { - "name": "percentile", + "description": "Optional histogram percentile (0–100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", "in": "query", - "description": "Optional histogram percentile (0\u2013100). When provided, the endpoint\nfetches histogram buckets and computes the requested quantile.", + "name": "percentile", "required": false, "schema": { + "format": "double", "type": [ "number", "null" - ], - "format": "double" + ] } } ], "responses": { "200": { - "description": "Metric time series data points", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/MetricDataPoint" - } + }, + "type": "array" } } - } + }, + "description": "Metric time series data points" }, "400": { "description": "Invalid query parameters" @@ -63599,26 +64072,49 @@ { "bearer_auth": [] } + ], + "summary": "Fetch a time-series range for a single metric on a node.", + "tags": [ + "Metrics" ] } }, "/notification-preferences": { - "get": { + "delete": { + "operationId": "delete_preferences", + "responses": { + "204": { + "description": "Successfully deleted preferences" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Delete notification preferences", "tags": [ "Notification Preferences" - ], - "summary": "Get notification preferences", + ] + }, + "get": { "operationId": "get_preferences", "responses": { "200": { - "description": "Successfully retrieved preferences", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationPreferencesResponse" } } - } + }, + "description": "Successfully retrieved preferences" }, "401": { "description": "Unauthorized" @@ -63631,13 +64127,13 @@ { "bearer_auth": [] } + ], + "summary": "Get notification preferences", + "tags": [ + "Notification Preferences" ] }, "put": { - "tags": [ - "Notification Preferences" - ], - "summary": "Update notification preferences", "operationId": "update_preferences", "requestBody": { "content": { @@ -63651,14 +64147,14 @@ }, "responses": { "200": { - "description": "Successfully updated preferences", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationPreferencesResponse" } } - } + }, + "description": "Successfully updated preferences" }, "401": { "description": "Unauthorized" @@ -63671,73 +64167,50 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Update notification preferences", "tags": [ "Notification Preferences" - ], - "summary": "Delete notification preferences", - "operationId": "delete_preferences", - "responses": { - "204": { - "description": "Successfully deleted preferences" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/notification-providers": { "get": { - "tags": [ - "Notification Providers" - ], - "summary": "List all notification providers", "operationId": "list_notification_providers", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -63747,8 +64220,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -63760,17 +64233,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/NotificationProviderResponse" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved providers" }, "500": { "description": "Internal server error" @@ -63780,13 +64253,13 @@ { "bearer_auth": [] } + ], + "summary": "List all notification providers", + "tags": [ + "Notification Providers" ] }, "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Create a new notification provider", "operationId": "create_notification_provider", "requestBody": { "content": { @@ -63800,14 +64273,14 @@ }, "responses": { "201": { - "description": "Successfully created provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully created provider" }, "400": { "description": "Invalid request" @@ -63820,15 +64293,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a new notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/cloudflare": { "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Create a new Cloudflare Email Sending notification provider", "operationId": "create_cloudflare_provider", "requestBody": { "content": { @@ -63842,14 +64315,14 @@ }, "responses": { "201": { - "description": "Successfully created Cloudflare provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully created Cloudflare provider" }, "400": { "description": "Invalid request" @@ -63862,25 +64335,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new Cloudflare Email Sending notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/cloudflare/{id}": { "put": { - "tags": [ - "Notification Providers" - ], - "summary": "Update a Cloudflare Email Sending notification provider", "operationId": "update_cloudflare_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -63896,14 +64369,14 @@ }, "responses": { "200": { - "description": "Successfully updated Cloudflare provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully updated Cloudflare provider" }, "404": { "description": "Provider not found" @@ -63916,15 +64389,15 @@ { "bearer_auth": [] } + ], + "summary": "Update a Cloudflare Email Sending notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/email": { "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Create a new Email notification provider", "operationId": "create_notification_email_provider", "requestBody": { "content": { @@ -63938,14 +64411,14 @@ }, "responses": { "201": { - "description": "Successfully created Email provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully created Email provider" }, "400": { "description": "Invalid request" @@ -63958,25 +64431,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new Email notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/email/{id}": { "put": { - "tags": [ - "Notification Providers" - ], - "summary": "Update an Email notification provider", "operationId": "update_notification_email_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -63992,14 +64465,14 @@ }, "responses": { "200": { - "description": "Successfully updated Email provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully updated Email provider" }, "404": { "description": "Provider not found" @@ -64012,15 +64485,15 @@ { "bearer_auth": [] } + ], + "summary": "Update an Email notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/slack": { "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Create a new Slack notification provider", "operationId": "create_slack_provider", "requestBody": { "content": { @@ -64034,14 +64507,14 @@ }, "responses": { "201": { - "description": "Successfully created Slack provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully created Slack provider" }, "400": { "description": "Invalid request" @@ -64054,25 +64527,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new Slack notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/slack/{id}": { "put": { - "tags": [ - "Notification Providers" - ], - "summary": "Update a Slack notification provider", "operationId": "update_slack_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -64088,14 +64561,14 @@ }, "responses": { "200": { - "description": "Successfully updated Slack provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully updated Slack provider" }, "404": { "description": "Provider not found" @@ -64108,15 +64581,15 @@ { "bearer_auth": [] } + ], + "summary": "Update a Slack notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/webhook": { "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Create a new Webhook notification provider", "description": "Webhook providers send notifications as JSON payloads to any HTTP endpoint.\nYou can configure custom headers for authentication (Bearer tokens, API keys, etc.).\nThe webhook will receive a JSON payload with notification details including:\nid, title, message, type, priority, severity, timestamp, and metadata.", "operationId": "create_webhook_provider", "requestBody": { @@ -64131,14 +64604,14 @@ }, "responses": { "201": { - "description": "Successfully created Webhook provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully created Webhook provider" }, "400": { "description": "Invalid request" @@ -64151,25 +64624,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new Webhook notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/webhook/{id}": { "put": { - "tags": [ - "Notification Providers" - ], - "summary": "Update a Webhook notification provider", "operationId": "update_webhook_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -64185,14 +64658,14 @@ }, "responses": { "200": { - "description": "Successfully updated Webhook provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully updated Webhook provider" }, "404": { "description": "Provider not found" @@ -64205,38 +64678,73 @@ { "bearer_auth": [] } + ], + "summary": "Update a Webhook notification provider", + "tags": [ + "Notification Providers" ] } }, "/notification-providers/{id}": { - "get": { + "delete": { + "operationId": "delete_notification_provider", + "parameters": [ + { + "description": "Provider ID", + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Successfully deleted provider" + }, + "404": { + "description": "Provider not found" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Delete a notification provider", "tags": [ "Notification Providers" - ], - "summary": "Get a single notification provider", + ] + }, + "get": { "operationId": "get_notification_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully retrieved provider" }, "404": { "description": "Provider not found" @@ -64249,23 +64757,23 @@ { "bearer_auth": [] } + ], + "summary": "Get a single notification provider", + "tags": [ + "Notification Providers" ] }, "put": { - "tags": [ - "Notification Providers" - ], - "summary": "Update a notification provider", "operationId": "update_notification_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -64281,14 +64789,14 @@ }, "responses": { "200": { - "description": "Successfully updated provider", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationProviderResponse" } } - } + }, + "description": "Successfully updated provider" }, "400": { "description": "Invalid masked provider configuration" @@ -64304,65 +64812,31 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Update a notification provider", "tags": [ "Notification Providers" - ], - "summary": "Delete a notification provider", - "operationId": "delete_notification_provider", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Provider ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Successfully deleted provider" - }, - "404": { - "description": "Provider not found" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/notification-providers/{id}/config/{field}": { "get": { - "tags": [ - "Notification Providers" - ], "operationId": "reveal_notification_provider_config", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "field", - "in": "path", "description": "Sensitive field, such as password or headers.Authorization", + "in": "path", + "name": "field", "required": true, "schema": { "type": "string" @@ -64371,14 +64845,14 @@ ], "responses": { "200": { - "description": "Sensitive provider configuration value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SensitiveConfigValueResponse" } } - } + }, + "description": "Sensitive provider configuration value" }, "400": { "description": "Field is not revealable" @@ -64397,38 +64871,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "Notification Providers" ] } }, "/notification-providers/{id}/test": { "post": { - "tags": [ - "Notification Providers" - ], - "summary": "Test a notification provider", "operationId": "test_notification_provider", "parameters": [ { - "name": "id", - "in": "path", "description": "Provider ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Test result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestProviderResponse" } } - } + }, + "description": "Test result" }, "404": { "description": "Provider not found" @@ -64441,50 +64914,50 @@ { "bearer_auth": [] } + ], + "summary": "Test a notification provider", + "tags": [ + "Notification Providers" ] } }, "/orders": { "get": { - "tags": [ - "Domains" - ], - "summary": "List all ACME orders", "operationId": "list_orders", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -64494,8 +64967,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -64507,14 +64980,14 @@ ], "responses": { "200": { - "description": "Orders retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListOrdersResponse" } } - } + }, + "description": "Orders retrieved successfully" }, "401": { "description": "Unauthorized" @@ -64527,103 +65000,103 @@ { "bearer_auth": [] } + ], + "summary": "List all ACME orders", + "tags": [ + "Domains" ] } }, "/otel/alerts": { "get": { - "tags": [ - "Alerts" - ], - "summary": "List alert rules for a project (newest first, paginated).", "operationId": "list_alerts", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Alert rules for the project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricAlertsResponse" } } - } + }, + "description": "Alert rules for the project" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List alert rules for a project (newest first, paginated).", + "tags": [ + "Alerts" ] }, "post": { - "tags": [ - "Alerts" - ], - "summary": "Create a new alert rule for a project.", "operationId": "create_alert", "requestBody": { "content": { @@ -64637,69 +65110,69 @@ }, "responses": { "201": { - "description": "Alert rule created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricAlertRuleResponse" } } - } + }, + "description": "Alert rule created" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Create a new alert rule for a project.", + "tags": [ + "Alerts" ] } }, "/otel/alerts/preview": { "post": { - "tags": [ - "Alerts" - ], - "summary": "Backtest an anomaly detector over a time range without saving a rule.", "description": "Replays the metric against the same band the evaluator would use, returning\nthe per-bucket band + which points would have fired. Powers the form's\n\"would this have fired?\" preview and the explorer band overlay. Read-only.", "operationId": "preview_alert", "requestBody": { @@ -64714,254 +65187,254 @@ }, "responses": { "200": { - "description": "Per-bucket band + breach points", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnomalyPreviewResponse" } } - } + }, + "description": "Per-bucket band + breach points" }, "400": { - "description": "Not an anomaly detector / bad input", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Not an anomaly detector / bad input" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Backtest an anomaly detector over a time range without saving a rule.", + "tags": [ + "Alerts" ] } }, "/otel/alerts/{id}": { - "get": { - "tags": [ - "Alerts" - ], - "summary": "Fetch a single alert rule by id.", - "operationId": "get_alert", + "delete": { + "operationId": "delete_alert", "parameters": [ { - "name": "id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", + "description": "Owning project ID (scopes the delete)", "in": "query", - "description": "Owning project ID (scopes the lookup)", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Alert rule", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OtelMetricAlertRuleResponse" - } - } - } + "204": { + "description": "Alert rule deleted" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Alert rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Alert rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Alerts" ], "summary": "Delete an alert rule.", - "operationId": "delete_alert", + "tags": [ + "Alerts" + ] + }, + "get": { + "operationId": "get_alert", "parameters": [ { - "name": "id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", + "description": "Owning project ID (scopes the lookup)", "in": "query", - "description": "Owning project ID (scopes the delete)", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Alert rule deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OtelMetricAlertRuleResponse" + } + } + }, + "description": "Alert rule" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Alert rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Alert rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Fetch a single alert rule by id.", + "tags": [ + "Alerts" ] }, "patch": { - "tags": [ - "Alerts" - ], - "summary": "Update an alert rule's fields.", "operationId": "update_alert", "parameters": [ { - "name": "id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Owning project ID (scopes the update)", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -64977,167 +65450,167 @@ }, "responses": { "200": { - "description": "Alert rule updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricAlertRuleResponse" } } - } + }, + "description": "Alert rule updated" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Alert rule not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Alert rule not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update an alert rule's fields.", + "tags": [ + "Alerts" ] } }, "/otel/dashboards": { "get": { - "tags": [ - "Dashboards" - ], - "summary": "List dashboards for a project (newest first, paginated).", "operationId": "list_dashboards", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Dashboards for the project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelDashboardsResponse" } } - } + }, + "description": "Dashboards for the project" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List dashboards for a project (newest first, paginated).", + "tags": [ + "Dashboards" ] }, "post": { - "tags": [ - "Dashboards" - ], - "summary": "Create a new dashboard for a project.", "operationId": "create_dashboard", "requestBody": { "content": { @@ -65151,254 +65624,254 @@ }, "responses": { "201": { - "description": "Dashboard created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelDashboardResponse" } } - } + }, + "description": "Dashboard created" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Create a new dashboard for a project.", + "tags": [ + "Dashboards" ] } }, "/otel/dashboards/{id}": { - "get": { - "tags": [ - "Dashboards" - ], - "summary": "Fetch a single dashboard by id.", - "operationId": "get_dashboard", + "delete": { + "operationId": "delete_dashboard", "parameters": [ { - "name": "id", - "in": "path", "description": "Dashboard ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", + "description": "Owning project ID (scopes the delete)", "in": "query", - "description": "Owning project ID (scopes the lookup)", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Dashboard", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OtelDashboardResponse" - } - } - } + "204": { + "description": "Dashboard deleted" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Dashboard not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Dashboard not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Dashboards" ], "summary": "Delete a dashboard.", - "operationId": "delete_dashboard", + "tags": [ + "Dashboards" + ] + }, + "get": { + "operationId": "get_dashboard", "parameters": [ { - "name": "id", - "in": "path", "description": "Dashboard ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", + "description": "Owning project ID (scopes the lookup)", "in": "query", - "description": "Owning project ID (scopes the delete)", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Dashboard deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OtelDashboardResponse" + } + } + }, + "description": "Dashboard" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Dashboard not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Dashboard not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Fetch a single dashboard by id.", + "tags": [ + "Dashboards" ] }, "patch": { - "tags": [ - "Dashboards" - ], - "summary": "Update a dashboard's name and/or layout.", "operationId": "update_dashboard", "parameters": [ { - "name": "id", - "in": "path", "description": "Dashboard ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "project_id", - "in": "query", "description": "Owning project ID (scopes the update)", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -65414,232 +65887,232 @@ }, "responses": { "200": { - "description": "Dashboard updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelDashboardResponse" } } - } + }, + "description": "Dashboard updated" }, "400": { - "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Validation error" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Dashboard not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Dashboard not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update a dashboard's name and/or layout.", + "tags": [ + "Dashboards" ] } }, "/otel/genai/traces": { "get": { - "tags": [ - "GenAI" - ], - "summary": "Query GenAI trace summaries \u2014 traces containing spans with `gen_ai.*` attributes.", - "description": "`duration_ms` is the only field guaranteed to be milliseconds. `gen_ai.*`\nspan attributes (e.g. time-to-first-token, token latency) often follow the\nOTel GenAI semantic conventions, which use **seconds** (a fractional\ndouble), not milliseconds \u2014 do not read them as ms without converting.", + "description": "`duration_ms` is the only field guaranteed to be milliseconds. `gen_ai.*`\nspan attributes (e.g. time-to-first-token, token latency) often follow the\nOTel GenAI semantic conventions, which use **seconds** (a fractional\ndouble), not milliseconds — do not read them as ms without converting.", "operationId": "query_genai_traces", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "service_name", - "in": "query", "description": "Filter by service name", + "in": "query", + "name": "service_name", "required": false, "schema": { "type": "string" } }, { - "name": "gen_ai_system", - "in": "query", "description": "Filter by AI system (openai, anthropic, etc.)", + "in": "query", + "name": "gen_ai_system", "required": false, "schema": { "type": "string" } }, { - "name": "gen_ai_model", - "in": "query", "description": "Filter by model (gpt-4, claude-sonnet-4-20250514, etc.)", + "in": "query", + "name": "gen_ai_model", "required": false, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Start time (RFC 3339)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (RFC 3339)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max traces to return (default: 50, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Offset for pagination", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "GenAI trace summaries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GenAiTraceSummariesResponse" } } - } + }, + "description": "GenAI trace summaries" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Query GenAI trace summaries — traces containing spans with `gen_ai.*` attributes.", + "tags": [ + "GenAI" ] } }, "/otel/genai/traces/{project_id}/{trace_id}": { "get": { - "tags": [ - "GenAI" - ], - "summary": "Get GenAI span details for a specific trace.", - "description": "`duration_ms` is the only field guaranteed to be milliseconds. `gen_ai.*`\nspan attributes (e.g. time-to-first-token, token latency) often follow the\nOTel GenAI semantic conventions, which use **seconds** (a fractional\ndouble), not milliseconds \u2014 do not read them as ms without converting.", + "description": "`duration_ms` is the only field guaranteed to be milliseconds. `gen_ai.*`\nspan attributes (e.g. time-to-first-token, token latency) often follow the\nOTel GenAI semantic conventions, which use **seconds** (a fractional\ndouble), not milliseconds — do not read them as ms without converting.", "operationId": "get_genai_trace", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "trace_id", - "in": "path", "description": "Trace ID (hex)", + "in": "path", + "name": "trace_id", "required": true, "schema": { "type": "string" @@ -65648,66 +66121,66 @@ ], "responses": { "200": { - "description": "GenAI trace span details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GenAiTraceDetailResponse" } } - } + }, + "description": "GenAI trace span details" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get GenAI span details for a specific trace.", + "tags": [ + "GenAI" ] } }, "/otel/global/traces/{trace_id}": { "get": { - "tags": [ - "Traces" - ], - "summary": "Assemble a unified cross-project span waterfall (Phase 2).", - "description": "Fans out to every project that holds spans for `trace_id` (up to 20\nprojects, 10,000 total spans). Spans are annotated with\n`project_id`/`project_name` and sorted by `start_time ASC`.\n`truncated: true` signals a hit on either cap; `truncated_projects`\nlists the dropped project IDs. See ADR-027 \u00a74 for the full design.", + "description": "Fans out to every project that holds spans for `trace_id` (up to 20\nprojects, 10,000 total spans). Spans are annotated with\n`project_id`/`project_name` and sorted by `start_time ASC`.\n`truncated: true` signals a hit on either cap; `truncated_projects`\nlists the dropped project IDs. See ADR-027 §4 for the full design.", "operationId": "getUnifiedTrace", "parameters": [ { - "name": "trace_id", - "in": "path", "description": "Trace ID (32 lowercase hex characters)", + "in": "path", + "name": "trace_id", "required": true, "schema": { "type": "string" @@ -65716,424 +66189,424 @@ ], "responses": { "200": { - "description": "Unified cross-project trace waterfall", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UnifiedTrace" } } - } + }, + "description": "Unified cross-project trace waterfall" }, "400": { - "description": "trace_id is not 32 lowercase hex characters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "trace_id is not 32 lowercase hex characters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions or deployment token", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions or deployment token" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Assemble a unified cross-project span waterfall (Phase 2).", + "tags": [ + "Traces" ] } }, "/otel/health/{project_id}": { "get": { - "tags": [ - "OTel" - ], - "summary": "Get health summaries for a project.", "operationId": "get_health", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Health summaries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthResponse" } } - } + }, + "description": "Health summaries" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get health summaries for a project.", + "tags": [ + "OTel" ] } }, "/otel/insights/{project_id}": { "get": { - "tags": [ - "Insights" - ], - "summary": "List anomaly insights for a project.", "operationId": "list_insights", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "status", - "in": "query", "description": "Filter by status (active, resolved)", + "in": "query", + "name": "status", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max insights to return (default: 20, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Offset for pagination", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Insights list", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InsightsResponse" } } - } + }, + "description": "Insights list" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List anomaly insights for a project.", + "tags": [ + "Insights" ] } }, "/otel/logs": { "get": { - "tags": [ - "Telemetry Logs" - ], - "summary": "Query log records with optional filters.", "operationId": "query_logs", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "severity", - "in": "query", "description": "Filter by severity (TRACE, DEBUG, INFO, WARN, ERROR, FATAL)", + "in": "query", + "name": "severity", "required": false, "schema": { "type": "string" } }, { - "name": "service_name", - "in": "query", "description": "Filter by service name", + "in": "query", + "name": "service_name", "required": false, "schema": { "type": "string" } }, { - "name": "search", - "in": "query", "description": "Full-text search in log body (ILIKE)", + "in": "query", + "name": "search", "required": false, "schema": { "type": "string" } }, { - "name": "trace_id", - "in": "query", "description": "Filter by correlated trace ID", + "in": "query", + "name": "trace_id", "required": false, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Start time (RFC 3339)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (RFC 3339)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max logs to return (default: 100, max: 1000)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Offset for pagination", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Log records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LogsResponse" } } - } + }, + "description": "Log records" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Query log records with optional filters.", + "tags": [ + "Telemetry Logs" ] } }, "/otel/metric-label-keys": { "get": { - "tags": [ - "Telemetry Metrics" - ], - "summary": "List the attribute (label) keys observed on a metric \u2014 powers the\nlabel-filter key autocomplete.", "operationId": "list_metric_label_keys", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric_name", - "in": "query", "description": "Metric to inspect", + "in": "query", + "name": "metric_name", "required": true, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Window start (RFC 3339); defaults to 24h before end", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "Window end (RFC 3339); defaults to now", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" @@ -66142,102 +66615,102 @@ ], "responses": { "200": { - "description": "Distinct label keys", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricLabelKeysResponse" } } - } + }, + "description": "Distinct label keys" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the attribute (label) keys observed on a metric — powers the\nlabel-filter key autocomplete.", + "tags": [ + "Telemetry Metrics" ] } }, "/otel/metric-label-values": { "get": { - "tags": [ - "Telemetry Metrics" - ], - "summary": "List the distinct values seen for a label key on a metric \u2014 powers value\nautocomplete once a key is chosen.", "operationId": "list_metric_label_values", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric_name", - "in": "query", "description": "Metric to inspect", + "in": "query", + "name": "metric_name", "required": true, "schema": { "type": "string" } }, { - "name": "label_key", - "in": "query", "description": "Label key whose values to list (must match [a-zA-Z0-9_.:-])", + "in": "query", + "name": "label_key", "required": true, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Window start (RFC 3339); defaults to 24h before end", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "Window end (RFC 3339); defaults to now", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" @@ -66246,245 +66719,245 @@ ], "responses": { "200": { - "description": "Distinct label values", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricLabelValuesResponse" } } - } + }, + "description": "Distinct label values" }, "400": { - "description": "Invalid label key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid label key" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List the distinct values seen for a label key on a metric — powers value\nautocomplete once a key is chosen.", + "tags": [ + "Telemetry Metrics" ] } }, "/otel/metric-names/{project_id}": { "get": { - "tags": [ - "Telemetry Metrics" - ], - "summary": "List distinct metric names for a project.", "operationId": "list_metric_names", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of metric names", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricNamesResponse" } } - } + }, + "description": "List of metric names" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List distinct metric names for a project.", + "tags": [ + "Telemetry Metrics" ] } }, "/otel/metrics": { "get": { - "tags": [ - "Telemetry Metrics" - ], - "summary": "Query metrics with time bucketing.", "operationId": "query_metrics", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric_name", - "in": "query", "description": "Filter by metric name", + "in": "query", + "name": "metric_name", "required": false, "schema": { "type": "string" } }, { - "name": "service_name", - "in": "query", "description": "Filter by service name", + "in": "query", + "name": "service_name", "required": false, "schema": { "type": "string" } }, { - "name": "environment", - "in": "query", "description": "Filter by deployment environment", + "in": "query", + "name": "environment", "required": false, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Start time (RFC 3339)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (RFC 3339)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" } }, { - "name": "bucket_interval", - "in": "query", "description": "Bucket interval (e.g. '1 hour', '5 minutes')", + "in": "query", + "name": "bucket_interval", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max buckets to return (default: 1000)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "metric_type", - "in": "query", "description": "Filter by metric type (gauge, sum, histogram, exponential_histogram, summary)", + "in": "query", + "name": "metric_type", "required": false, "schema": { "type": "string" } }, { - "name": "aggregation", - "in": "query", "description": "Per-bucket aggregation: avg (default), sum, min, max, count, rate, p50/p95/p99, quantile:0.95", + "in": "query", + "name": "aggregation", "required": false, "schema": { "type": "string" } }, { - "name": "label_filters", - "in": "query", "description": "Comma-separated key=value data-point label filters (keys must match [a-zA-Z0-9_.:-])", + "in": "query", + "name": "label_filters", "required": false, "schema": { "type": "string" } }, { - "name": "group_by", - "in": "query", "description": "Comma-separated label keys to group series by", + "in": "query", + "name": "group_by", "required": false, "schema": { "type": "string" @@ -66493,655 +66966,896 @@ ], "responses": { "200": { - "description": "Metrics data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OtelMetricsResponse" } } - } + }, + "description": "Metrics data" }, "400": { - "description": "Invalid label key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid label key" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Query metrics with time bucketing.", + "tags": [ + "Telemetry Metrics" ] } }, "/otel/pipeline-stats": { "get": { - "tags": [ - "OTel" - ], - "summary": "Get OTel pipeline statistics (admin/system view).", "operationId": "get_pipeline_stats", "responses": { "200": { - "description": "Pipeline statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PipelineStatsResponse" } } - } + }, + "description": "Pipeline statistics" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get OTel pipeline statistics (admin/system view).", + "tags": [ + "OTel" ] } }, "/otel/quota/{project_id}": { "get": { - "tags": [ - "OTel" - ], - "summary": "Get storage quota for a project.", "operationId": "get_quota", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Storage quota", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuotaResponse" } } - } + }, + "description": "Storage quota" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get storage quota for a project.", + "tags": [ + "OTel" ] } }, - "/otel/trace-summaries": { + "/otel/span-stats": { "get": { - "tags": [ - "Traces" - ], - "summary": "Query trace summaries \u2014 one row per trace with span count, error count,\nroot span info, and proper trace-level pagination.", - "operationId": "query_trace_summaries", + "description": "Groups spans by `(project, service, span name)` over a bounded window and\nreturns count, error rate, total/min/max/avg/stddev duration, p50/p95/p99,\nand two variability ratios per operation. Sorting is what makes it useful:\n\n- `sort_by=total_time` (default) — where the wall-clock actually goes.\n- `sort_by=p95` / `p99` — what users actually feel.\n- `sort_by=variability` or `tail_ratio` — operations whose *spread* is the\n problem: the ones that take 40ms most of the time and 4s the rest.\n- `span_name=payments.charge` — the worst this one operation ever got, in\n `max_duration_ms`.\n\nPair the variability sorts with `min_count` — a ratio computed from three\nsamples is noise, and without a floor it outranks every real signal.\n\nTwo bounds are enforced rather than clamped, so a result never claims to\ncover more than it does: at most 50 projects, and a window no wider than\n31 days. Both return 400. Unlike the trace list this report has no early\nexit — it aggregates every span in the window before it can rank anything.", + "operationId": "query_span_stats", "parameters": [ { + "description": "Single project to report on", + "in": "query", "name": "project_id", + "required": false, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Comma-separated project ids, e.g. `4,5,6` (max 50)", "in": "query", - "description": "Project ID", - "required": true, + "name": "project_ids", + "required": false, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } }, { - "name": "trace_id", + "description": "Window start (RFC 3339); defaults to 24h before end_time. The window may not exceed 31 days", "in": "query", - "description": "Filter by trace ID", + "name": "start_time", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Window end (RFC 3339); defaults to now", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" } }, { + "description": "Restrict to one service", + "in": "query", "name": "service_name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Restrict to one operation by exact span name", "in": "query", - "description": "Filter by service name", + "name": "span_name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Case-insensitive substring match on the span name", + "in": "query", + "name": "name_pattern", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "server | client | internal | producer | consumer", + "in": "query", + "name": "kind", "required": false, "schema": { "type": "string" } }, { + "description": "ok | error | unset", + "in": "query", "name": "status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Restrict to one environment", "in": "query", - "description": "Filter by status (OK, ERROR)", + "name": "environment_id", + "required": false, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Restrict to one deployment", + "in": "query", + "name": "deployment_id", + "required": false, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Comma-separated key=value span attribute filters", + "in": "query", + "name": "attributes", "required": false, "schema": { "type": "string" } }, { + "description": "Ignore spans faster than this", + "in": "query", "name": "min_duration_ms", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "description": "Drop operations with fewer samples than this", "in": "query", - "description": "Minimum trace duration in ms", + "name": "min_count", "required": false, "schema": { - "type": "number", - "format": "double" + "format": "int64", + "minimum": 0, + "type": "integer" } }, { - "name": "start_time", + "description": "total_time | p50 | p95 | p99 | max | avg | stddev | count | errors | error_rate | variability | tail_ratio", "in": "query", - "description": "Start time (RFC 3339)", + "name": "sort_by", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", + "description": "asc | desc (default)", "in": "query", - "description": "End time (RFC 3339)", + "name": "sort_order", "required": false, "schema": { "type": "string" } }, { - "name": "environment_id", + "description": "Page size (default 20, max 100)", "in": "query", - "description": "Filter by environment ID", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int64", + "minimum": 0, + "type": "integer" } }, { - "name": "deployment_id", + "description": "Page offset", "in": "query", - "description": "Filter by deployment ID", + "name": "offset", + "required": false, + "schema": { + "format": "int64", + "minimum": 0, + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SpanStatsResponse" + } + } + }, + "description": "Per-operation latency statistics" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Invalid query (no project, empty window)" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Insufficient permissions" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Rank operations by latency, volume, or inconsistency.", + "tags": [ + "Traces" + ] + } + }, + "/otel/trace-summaries": { + "get": { + "operationId": "query_trace_summaries", + "parameters": [ + { + "description": "Project ID", + "in": "query", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Filter by trace ID", + "in": "query", + "name": "trace_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } }, { - "name": "name_pattern", + "description": "Filter by service name", "in": "query", - "description": "Filter by span name pattern (ILIKE)", + "name": "service_name", "required": false, "schema": { "type": "string" } }, { - "name": "sort_by", + "description": "Filter by status (OK, ERROR)", "in": "query", - "description": "Sort field: 'start_time' (default) or 'duration'", + "name": "status", "required": false, "schema": { "type": "string" } }, { - "name": "sort_order", + "description": "Minimum trace duration in ms", "in": "query", - "description": "Sort direction: 'asc' or 'desc' (default)", + "name": "min_duration_ms", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "description": "Start time (RFC 3339)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "include_total", + "description": "End time (RFC 3339)", + "in": "query", + "name": "end_time", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", + "required": false, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", + "required": false, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Filter by span name pattern (ILIKE)", + "in": "query", + "name": "name_pattern", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort field: 'start_time' (default) or 'duration'", + "in": "query", + "name": "sort_by", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Sort direction: 'asc' or 'desc' (default)", "in": "query", + "name": "sort_order", + "required": false, + "schema": { + "type": "string" + } + }, + { "description": "Compute the `total` count (default: true). Set false to skip the second aggregation when only the page is needed", + "in": "query", + "name": "include_total", "required": false, "schema": { "type": "boolean" } }, { - "name": "limit", - "in": "query", "description": "Max traces to return (default: 50, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Offset for pagination", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Trace summaries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TraceSummariesResponse" } } - } + }, + "description": "Trace summaries" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Query trace summaries — one row per trace with span count, error count,\nroot span info, and proper trace-level pagination.", + "tags": [ + "Traces" ] } }, "/otel/traces": { "get": { - "tags": [ - "Traces" - ], - "summary": "Query trace spans with optional filters.", - "description": "Each returned span has a `duration_ms` field (float, milliseconds) \u2014 this is\nthe ONLY field guaranteed to be in milliseconds. Spans also carry an\n`attributes` map of raw key/value pairs exactly as reported by the\ninstrumenting library: numeric attribute values may be seconds, milliseconds,\nmicroseconds, or nanoseconds depending on that library's convention, and\nnothing in this response labels the unit. Never assume an attribute's\nnumeric value shares `duration_ms`'s unit, and never state a duration in\nmilliseconds unless it came from a `duration_ms` field.", + "description": "Each returned span has a `duration_ms` field (float, milliseconds) — this is\nthe ONLY field guaranteed to be in milliseconds. Spans also carry an\n`attributes` map of raw key/value pairs exactly as reported by the\ninstrumenting library: numeric attribute values may be seconds, milliseconds,\nmicroseconds, or nanoseconds depending on that library's convention, and\nnothing in this response labels the unit. Never assume an attribute's\nnumeric value shares `duration_ms`'s unit, and never state a duration in\nmilliseconds unless it came from a `duration_ms` field.", "operationId": "query_traces", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "trace_id", - "in": "query", "description": "Filter by trace ID", + "in": "query", + "name": "trace_id", "required": false, "schema": { "type": "string" } }, { - "name": "service_name", - "in": "query", "description": "Filter by service name", + "in": "query", + "name": "service_name", "required": false, "schema": { "type": "string" } }, { - "name": "status", - "in": "query", "description": "Filter by status (OK, ERROR, UNSET)", + "in": "query", + "name": "status", "required": false, "schema": { "type": "string" } }, { - "name": "min_duration_ms", - "in": "query", "description": "Minimum span duration in ms", + "in": "query", + "name": "min_duration_ms", "required": false, "schema": { - "type": "number", - "format": "double" + "format": "double", + "type": "number" } }, { - "name": "start_time", - "in": "query", "description": "Start time (RFC 3339)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (RFC 3339)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Max spans to return (default: 100, max: 1000)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "offset", - "in": "query", "description": "Offset for pagination", + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Trace spans", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TracesResponse" } } - } + }, + "description": "Trace spans" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Query trace spans with optional filters.", + "tags": [ + "Traces" ] } }, "/otel/traces/cross-project/{trace_id}": { "get": { - "tags": [ - "Traces" - ], - "summary": "Discover sibling projects that share the same `trace_id` (Phase 1 banner).", - "description": "Returns an empty `siblings` list when the trace is single-project \u2014 never\n404. Project names are included so the UI can render navigation links\nwithout a second round-trip. See ADR-027 \u00a73 for the full auth model and\ntopology-disclosure trade-offs.", + "description": "Returns an empty `siblings` list when the trace is single-project — never\n404. Project names are included so the UI can render navigation links\nwithout a second round-trip. See ADR-027 §3 for the full auth model and\ntopology-disclosure trade-offs.", "operationId": "getCrossProjectTraceSiblings", "parameters": [ { - "name": "trace_id", - "in": "path", "description": "Trace ID (32 lowercase hex characters)", + "in": "path", + "name": "trace_id", "required": true, "schema": { "type": "string" } }, { - "name": "exclude_project_id", - "in": "query", "description": "Project ID to exclude (the caller's own project) so the UI does not render a self-link", + "in": "query", + "name": "exclude_project_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Sibling projects sharing this trace", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CrossProjectTraceResponse" } } - } + }, + "description": "Sibling projects sharing this trace" }, "400": { - "description": "trace_id is not 32 lowercase hex characters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "trace_id is not 32 lowercase hex characters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions or deployment token", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions or deployment token" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Discover sibling projects that share the same `trace_id` (Phase 1 banner).", + "tags": [ + "Traces" ] } }, "/otel/traces/{project_id}/{trace_id}": { "get": { - "tags": [ - "Traces" - ], - "summary": "Get all spans for a specific trace.", - "description": "Each span has a `duration_ms` field (float, milliseconds) \u2014 the ONLY field\nguaranteed to be in milliseconds \u2014 plus an `attributes` map of raw\nkey/value pairs exactly as the instrumenting library reported them.\nNumeric attribute values (e.g. connection-pool wait times, queue delays)\nmay be in seconds, milliseconds, microseconds, or nanoseconds depending on\nthat library's own convention; this response never labels the unit. When\nexplaining what a span spent time on, only quote milliseconds from\n`duration_ms` (or from `start_time`/`end_time` deltas) \u2014 never assume a raw\nattribute number is already in milliseconds.", + "description": "Each span has a `duration_ms` field (float, milliseconds) — the ONLY field\nguaranteed to be in milliseconds — plus an `attributes` map of raw\nkey/value pairs exactly as the instrumenting library reported them.\nNumeric attribute values (e.g. connection-pool wait times, queue delays)\nmay be in seconds, milliseconds, microseconds, or nanoseconds depending on\nthat library's own convention; this response never labels the unit. When\nexplaining what a span spent time on, only quote milliseconds from\n`duration_ms` (or from `start_time`/`end_time` deltas) — never assume a raw\nattribute number is already in milliseconds.", "operationId": "get_trace", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "trace_id", - "in": "path", "description": "Trace ID (hex)", + "in": "path", + "name": "trace_id", "required": true, "schema": { "type": "string" @@ -67150,63 +67864,62 @@ ], "responses": { "200": { - "description": "Trace spans tree", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TracesResponse" } } - } + }, + "description": "Trace spans tree" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get all spans for a specific trace.", + "tags": [ + "Traces" ] } }, "/otel/v1/logs": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest log records via OTLP/HTTP protobuf.", "description": "Authenticates via API key in header, decompresses, decodes protobuf,\nchecks rate limit and storage quota, routes high-severity logs\nto DB and all logs to S3.", "operationId": "ingest_logs", "requestBody": { - "description": "OTLP ExportLogsServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67214,6 +67927,7 @@ } } }, + "description": "OTLP ExportLogsServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67221,73 +67935,72 @@ "description": "Logs accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest log records via OTLP/HTTP protobuf.", + "tags": [ + "OTel Ingest" ] } }, "/otel/v1/metrics": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest metrics via OTLP/HTTP protobuf.", "description": "Authenticates via API key in header, decompresses, decodes protobuf,\nchecks rate limit and storage quota, then stores.", "operationId": "ingest_metrics", "requestBody": { - "description": "OTLP ExportMetricsServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67295,6 +68008,7 @@ } } }, + "description": "OTLP ExportMetricsServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67302,73 +68016,72 @@ "description": "Metrics accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest metrics via OTLP/HTTP protobuf.", + "tags": [ + "OTel Ingest" ] } }, "/otel/v1/traces": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest trace spans via OTLP/HTTP protobuf.", "description": "Authenticates via API key in header, decompresses, decodes protobuf,\nchecks rate limit and storage quota, then stores spans.", "operationId": "ingest_traces", "requestBody": { - "description": "OTLP ExportTraceServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67376,6 +68089,7 @@ } } }, + "description": "OTLP ExportTraceServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67383,104 +68097,103 @@ "description": "Traces accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest trace spans via OTLP/HTTP protobuf.", + "tags": [ + "OTel Ingest" ] } }, "/otel/v1/{project_id}/{environment_id}/{deployment_id}/logs": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest log records with project/environment/deployment in the URL path.", "operationId": "ingest_logs_by_path", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "requestBody": { - "description": "OTLP ExportLogsServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67488,6 +68201,7 @@ } } }, + "description": "OTLP ExportLogsServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67495,104 +68209,103 @@ "description": "Logs accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest log records with project/environment/deployment in the URL path.", + "tags": [ + "OTel Ingest" ] } }, "/otel/v1/{project_id}/{environment_id}/{deployment_id}/metrics": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest metrics with project/environment/deployment in the URL path.", "operationId": "ingest_metrics_by_path", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "requestBody": { - "description": "OTLP ExportMetricsServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67600,6 +68313,7 @@ } } }, + "description": "OTLP ExportMetricsServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67607,104 +68321,103 @@ "description": "Metrics accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest metrics with project/environment/deployment in the URL path.", + "tags": [ + "OTel Ingest" ] } }, "/otel/v1/{project_id}/{environment_id}/{deployment_id}/traces": { "post": { - "tags": [ - "OTel Ingest" - ], - "summary": "Ingest trace spans with project/environment/deployment in the URL path.", "operationId": "ingest_traces_by_path", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "requestBody": { - "description": "OTLP ExportTraceServiceRequest (protobuf, optionally gzip/zstd compressed)", "content": { "application/x-protobuf": { "schema": { @@ -67712,6 +68425,7 @@ } } }, + "description": "OTLP ExportTraceServiceRequest (protobuf, optionally gzip/zstd compressed)", "required": true }, "responses": { @@ -67719,254 +68433,254 @@ "description": "Traces accepted (OTLP protobuf response)" }, "400": { - "description": "Invalid payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid payload" }, "401": { - "description": "Missing or invalid API key", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Missing or invalid API key" }, "413": { - "description": "Storage quota exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Storage quota exceeded" }, "429": { - "description": "Rate limit exceeded", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Rate limit exceeded" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "api_key": [] } + ], + "summary": "Ingest trace spans with project/environment/deployment in the URL path.", + "tags": [ + "OTel Ingest" ] } }, "/performance/has-metrics": { "get": { - "tags": [ - "Performance" - ], - "summary": "Check if performance metrics exist for a project", "operationId": "has_performance_metrics", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully checked performance metrics availability", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HasMetricsResponse" } } - } + }, + "description": "Successfully checked performance metrics availability" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Check if performance metrics exist for a project", + "tags": [ + "Performance" ] } }, "/performance/metrics": { "get": { - "tags": [ - "Performance" - ], - "summary": "Get performance metrics", "operationId": "get_performance_metrics", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DD HH:MM:SS", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Deployment ID (optional)", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "device_type", - "in": "query", "description": "Device type filter: desktop or mobile (optional)", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": "string" } }, { - "name": "include_bots", - "in": "query", "description": "Include crawler/datacenter bot samples (default false)", + "in": "query", + "name": "include_bots", "required": false, "schema": { "type": "boolean" } }, { - "name": "filter_path", - "in": "query", "description": "Filter to one page pathname (optional)", + "in": "query", + "name": "filter_path", "required": false, "schema": { "type": "string" } }, { - "name": "filter_country", - "in": "query", "description": "Filter to one country (optional)", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Filter to one region (optional)", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_city", - "in": "query", "description": "Filter to one city (optional)", + "in": "query", + "name": "filter_city", "required": false, "schema": { "type": "string" } }, { - "name": "filter_browser", - "in": "query", "description": "Filter to one browser (optional)", + "in": "query", + "name": "filter_browser", "required": false, "schema": { "type": "string" } }, { - "name": "filter_operating_system", - "in": "query", "description": "Filter to one operating system (optional)", + "in": "query", + "name": "filter_operating_system", "required": false, "schema": { "type": "string" @@ -67975,186 +68689,186 @@ ], "responses": { "200": { - "description": "Successfully retrieved performance metrics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PerformanceMetricsResponse" } } - } + }, + "description": "Successfully retrieved performance metrics" }, "400": { - "description": "Invalid date format or missing parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Invalid date format or missing parameters" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get performance metrics", + "tags": [ + "Performance" ] } }, "/performance/metrics-over-time": { "get": { - "tags": [ - "Performance" - ], - "summary": "Get metrics over time", "operationId": "get_metrics_over_time", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DDTHH:MM:SSZ", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DDTHH:MM:SSZ", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Deployment ID (optional)", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "device_type", - "in": "query", "description": "Device type filter: desktop or mobile (optional)", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": "string" } }, { - "name": "include_bots", - "in": "query", "description": "Include crawler/datacenter bot samples (default false)", + "in": "query", + "name": "include_bots", "required": false, "schema": { "type": "boolean" } }, { - "name": "filter_path", - "in": "query", "description": "Filter to one page pathname (optional)", + "in": "query", + "name": "filter_path", "required": false, "schema": { "type": "string" } }, { - "name": "filter_country", - "in": "query", "description": "Filter to one country (optional)", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Filter to one region (optional)", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_city", - "in": "query", "description": "Filter to one city (optional)", + "in": "query", + "name": "filter_city", "required": false, "schema": { "type": "string" } }, { - "name": "filter_browser", - "in": "query", "description": "Filter to one browser (optional)", + "in": "query", + "name": "filter_browser", "required": false, "schema": { "type": "string" } }, { - "name": "filter_operating_system", - "in": "query", "description": "Filter to one operating system (optional)", + "in": "query", + "name": "filter_operating_system", "required": false, "schema": { "type": "string" @@ -68163,195 +68877,195 @@ ], "responses": { "200": { - "description": "Successfully retrieved metrics over time", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetricsOverTimeResponse" } } - } + }, + "description": "Successfully retrieved metrics over time" }, "400": { - "description": "Invalid date format or missing parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Invalid date format or missing parameters" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get metrics over time", + "tags": [ + "Performance" ] } }, "/performance/page-metrics": { "get": { - "tags": [ - "Performance" - ], - "summary": "Get grouped page metrics", "operationId": "get_grouped_page_metrics", "parameters": [ { - "name": "start_date", - "in": "query", "description": "Start date in format YYYY-MM-DDTHH:MM:SSZ", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in format YYYY-MM-DDTHH:MM:SSZ", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Project ID or slug", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Deployment ID (optional)", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "group_by", - "in": "query", "description": "Group by: path, country, region, city, device_type, browser, operating_system", + "in": "query", + "name": "group_by", "required": true, "schema": { "type": "string" } }, { - "name": "device_type", - "in": "query", "description": "Device type filter: desktop or mobile (optional)", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": "string" } }, { - "name": "include_bots", - "in": "query", "description": "Include crawler/datacenter bot samples (default false)", + "in": "query", + "name": "include_bots", "required": false, "schema": { "type": "boolean" } }, { - "name": "filter_path", - "in": "query", "description": "Filter to one page pathname (optional)", + "in": "query", + "name": "filter_path", "required": false, "schema": { "type": "string" } }, { - "name": "filter_country", - "in": "query", "description": "Filter to one country (optional)", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Filter to one region (optional)", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_city", - "in": "query", "description": "Filter to one city (optional)", + "in": "query", + "name": "filter_city", "required": false, "schema": { "type": "string" } }, { - "name": "filter_browser", - "in": "query", "description": "Filter to one browser (optional)", + "in": "query", + "name": "filter_browser", "required": false, "schema": { "type": "string" } }, { - "name": "filter_operating_system", - "in": "query", "description": "Filter to one operating system (optional)", + "in": "query", + "name": "filter_operating_system", "required": false, "schema": { "type": "string" @@ -68360,81 +69074,81 @@ ], "responses": { "200": { - "description": "Successfully retrieved grouped page metrics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupedPageMetricsResponse" } } - } + }, + "description": "Successfully retrieved grouped page metrics" }, "400": { - "description": "Invalid date format, missing parameters, or invalid group_by value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Invalid date format, missing parameters, or invalid group_by value" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get grouped page metrics", + "tags": [ + "Performance" ] } }, "/platform/access-info": { "get": { - "tags": [ - "Platform" - ], - "summary": "Get information about how the service is being accessed", "description": "Returns details about the server's access mode, public IP address, private IP address,\nand domain creation capabilities. Both IP addresses are always included when available.", "operationId": "get_access_info", "responses": { "200": { - "description": "Service access information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServiceAccessInfo" } } - } + }, + "description": "Service access information" }, "401": { "description": "Unauthorized" @@ -68450,15 +69164,15 @@ { "bearer_auth": [] } + ], + "summary": "Get information about how the service is being accessed", + "tags": [ + "Platform" ] } }, "/platform/private-ip": { "get": { - "tags": [ - "Platform" - ], - "summary": "Get private/local IP address of the server", "operationId": "get_private_ip", "responses": { "200": { @@ -68475,15 +69189,15 @@ { "bearer_auth": [] } + ], + "summary": "Get private/local IP address of the server", + "tags": [ + "Platform" ] } }, "/platform/public-ip": { "get": { - "tags": [ - "Platform" - ], - "summary": "Get public IP address of the server", "operationId": "get_public_ip", "responses": { "200": { @@ -68500,26 +69214,26 @@ { "bearer_auth": [] } + ], + "summary": "Get public IP address of the server", + "tags": [ + "Platform" ] } }, "/presets": { "get": { - "tags": [ - "Presets" - ], - "summary": "List all available presets", "operationId": "list_presets", "responses": { "200": { - "description": "List of available presets", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListPresetsResponse" } } - } + }, + "description": "List of available presets" }, "401": { "description": "Unauthorized" @@ -68532,22 +69246,22 @@ { "bearer_auth": [] } + ], + "summary": "List all available presets", + "tags": [ + "Presets" ] } }, "/presets/{slug}/dockerfile": { "post": { - "tags": [ - "Presets" - ], - "summary": "Generate a Dockerfile from a preset", "description": "Returns the Dockerfile content and build arguments for a given preset slug.\nThe CLI can use this to build Docker images locally without needing a Dockerfile\nin the project directory, enabling zero-config deployments.", "operationId": "generate_preset_dockerfile", "parameters": [ { - "name": "slug", - "in": "path", "description": "Preset slug (e.g., nextjs, vite, python)", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -68566,14 +69280,14 @@ }, "responses": { "200": { - "description": "Generated Dockerfile", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GenerateDockerfileResponse" } } - } + }, + "description": "Generated Dockerfile" }, "401": { "description": "Unauthorized" @@ -68589,51 +69303,52 @@ { "bearer_auth": [] } + ], + "summary": "Generate a Dockerfile from a preset", + "tags": [ + "Presets" ] } }, "/preview-gateway/logs": { "get": { - "tags": [ - "Preview Gateway" - ], "operationId": "get_preview_gateway_logs", "parameters": [ { - "name": "tail", - "in": "query", "description": "Lines to tail (default 200, max 2000)", + "in": "query", + "name": "tail", "required": false, "schema": { - "type": "integer", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LogsResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] } }, "/preview-gateway/restart": { "post": { - "tags": [ - "Preview Gateway" - ], "operationId": "restart_preview_gateway", "responses": { "204": { @@ -68644,37 +69359,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] } }, "/preview-gateway/settings": { "get": { - "tags": [ - "Preview Gateway" - ], "operationId": "get_preview_gateway_settings", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PreviewGatewaySettingsResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] }, "patch": { - "tags": [ - "Preview Gateway" - ], "operationId": "patch_preview_gateway_settings", "requestBody": { "content": { @@ -68688,53 +69403,53 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PreviewGatewaySettingsResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] } }, "/preview-gateway/status": { "get": { - "tags": [ - "Preview Gateway" - ], "operationId": "get_preview_gateway_status", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GatewayStatus" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] } }, "/preview-gateway/upgrade": { "post": { - "tags": [ - "Preview Gateway" - ], "operationId": "upgrade_preview_gateway", "requestBody": { "content": { @@ -68755,48 +69470,47 @@ { "bearer_auth": [] } + ], + "tags": [ + "Preview Gateway" ] } }, "/projects": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get a list of all projects", "operationId": "get_projects", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number (1-based)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Number of items per page", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "List of projects", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedProjectList" } } - } + }, + "description": "List of projects" }, "401": { "description": "Unauthorized" @@ -68809,13 +69523,13 @@ { "bearer_auth": [] } + ], + "summary": "Get a list of all projects", + "tags": [ + "Projects" ] }, "post": { - "tags": [ - "Projects" - ], - "summary": "Create a new project", "operationId": "create_project", "requestBody": { "content": { @@ -68829,14 +69543,14 @@ }, "responses": { "200": { - "description": "Project created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Project created successfully" }, "400": { "description": "Invalid input" @@ -68849,21 +69563,21 @@ { "bearer_auth": [] } + ], + "summary": "Create a new project", + "tags": [ + "Projects" ] } }, "/projects/by-slug/{slug}": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get details of a specific project by slug", "operationId": "get_project_by_slug", "parameters": [ { - "name": "slug", - "in": "path", "description": "Project slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -68872,14 +69586,14 @@ ], "responses": { "200": { - "description": "Project details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Project details" }, "404": { "description": "Project not found" @@ -68889,15 +69603,15 @@ { "bearer_auth": [] } + ], + "summary": "Get details of a specific project by slug", + "tags": [ + "Projects" ] } }, "/projects/from-template": { "post": { - "tags": [ - "Projects" - ], - "summary": "Create a new project from a template", "description": "Creates a new repository from a template and sets up the project with the\nspecified configuration. The template is cloned to a new repository under\nthe authenticated user's account or specified organization.", "operationId": "create_project_from_template", "requestBody": { @@ -68912,14 +69626,14 @@ }, "responses": { "201": { - "description": "Project created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateProjectFromTemplateResponse" } } - } + }, + "description": "Project created successfully" }, "400": { "description": "Invalid input" @@ -68941,26 +69655,26 @@ { "bearer_auth": [] } + ], + "summary": "Create a new project from a template", + "tags": [ + "Projects" ] } }, "/projects/statistics": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get project statistics", "operationId": "get_project_statistics", "responses": { "200": { - "description": "Project statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectStatisticsResponse" } } - } + }, + "description": "Project statistics" }, "401": { "description": "Unauthorized" @@ -68973,38 +69687,78 @@ { "bearer_auth": [] } + ], + "summary": "Get project statistics", + "tags": [ + "Projects" ] } }, "/projects/{id}": { - "get": { + "delete": { + "operationId": "delete_project", + "parameters": [ + { + "description": "Project ID", + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Project deleted successfully" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Project not found" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "Projects" - ], - "summary": "Get details of a specific project", + ] + }, + "get": { "operationId": "get_project", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Project details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Project details" }, "404": { "description": "Project not found" @@ -69014,22 +69768,23 @@ { "bearer_auth": [] } + ], + "summary": "Get details of a specific project", + "tags": [ + "Projects" ] }, "put": { - "tags": [ - "Projects" - ], "operationId": "update_project", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69045,14 +69800,14 @@ }, "responses": { "200": { - "description": "Project updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Project updated successfully" }, "401": { "description": "Unauthorized" @@ -69071,143 +69826,102 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Projects" - ], - "operationId": "delete_project", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Project ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Project deleted successfully" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Project not found" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/projects/{id}/deployments": { "get": { - "tags": [ - "Projects" - ], "operationId": "get_project_deployments", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID filter", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of deployments", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentListResponse" } } - } + }, + "description": "List of deployments" }, "404": { "description": "Project not found" } - } + }, + "tags": [ + "Projects" + ] } }, "/projects/{id}/last-deployment": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get the last deployment for a specific project", "operationId": "get_last_deployment", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Last deployment details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentResponse" } } - } + }, + "description": "Last deployment details" }, "404": { "description": "Project not found or no deployments" @@ -69215,25 +69929,25 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get the last deployment for a specific project", + "tags": [ + "Deployments" + ] } }, "/projects/{id}/source": { "patch": { - "tags": [ - "Projects" - ], - "summary": "Change a project's source type to a Git-less type (docker_image /\nstatic_files / manual). Switching TO Git is done via the Git settings\nendpoint (`POST /projects/{id}/git`), which also supplies the repository and\nprovider connection.", "operationId": "change_project_source", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69249,14 +69963,14 @@ }, "responses": { "200": { - "description": "Source type changed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Source type changed" }, "400": { "description": "Invalid source type change (e.g. switching to Git here)" @@ -69278,25 +69992,25 @@ { "bearer_auth": [] } + ], + "summary": "Change a project's source type to a Git-less type (docker_image /\nstatic_files / manual). Switching TO Git is done via the Git settings\nendpoint (`POST /projects/{id}/git`), which also supplies the repository and\nprovider connection.", + "tags": [ + "Projects" ] } }, "/projects/{id}/trigger-pipeline": { "post": { - "tags": [ - "Projects" - ], - "summary": "Trigger pipeline for a specific project", "operationId": "trigger_project_pipeline", "parameters": [ { - "name": "id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69312,14 +70026,14 @@ }, "responses": { "200": { - "description": "Pipeline triggered successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TriggerPipelineResponse" } } - } + }, + "description": "Pipeline triggered successfully" }, "400": { "description": "Invalid request" @@ -69330,39 +70044,40 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Trigger pipeline for a specific project", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/access": { "get": { - "tags": [ - "Teams" - ], "operationId": "list_project_access", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Access grants", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectAccessResponse" - } + }, + "type": "array" } } - } + }, + "description": "Access grants" }, "403": { "description": "Insufficient permissions or no access to this project" @@ -69372,21 +70087,21 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] }, "post": { - "tags": [ - "Teams" - ], "operationId": "grant_project_access", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69402,14 +70117,14 @@ }, "responses": { "201": { - "description": "Access granted (idempotent upsert)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectAccessResponse" } } - } + }, + "description": "Access granted (idempotent upsert)" }, "403": { "description": "Insufficient permissions or no access to this project" @@ -69422,32 +70137,32 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/projects/{project_id}/access/{team_id}": { "delete": { - "tags": [ - "Teams" - ], "operationId": "revoke_project_access", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69466,58 +70181,57 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/projects/{project_id}/active-visitors": { "get": { - "tags": [ - "Events" - ], - "summary": "Get active visitors count", "operationId": "get_active_visitors", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved active visitors count", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActiveVisitorsResponse" } } - } + }, + "description": "Successfully retrieved active visitors count" }, "401": { "description": "Unauthorized" @@ -69530,37 +70244,38 @@ { "bearer_auth": [] } + ], + "summary": "Get active visitors count", + "tags": [ + "Events" ] } }, "/projects/{project_id}/agents": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_agents", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of agents for project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListAgentsResponse" } } - } + }, + "description": "List of agents for project" }, "401": { "description": "Unauthorized" @@ -69576,22 +70291,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "post": { - "tags": [ - "Agents" - ], "operationId": "create_agent", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -69607,14 +70322,14 @@ }, "responses": { "201": { - "description": "Agent created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentConfigResponse" } } - } + }, + "description": "Agent created" }, "400": { "description": "Validation error" @@ -69633,30 +70348,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/cli-status": { "get": { - "tags": [ - "Agents" - ], "operationId": "get_cli_status", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "provider", - "in": "query", "description": "AI provider: claude_cli or codex_cli", + "in": "query", + "name": "provider", "required": false, "schema": { "type": "string" @@ -69678,59 +70393,59 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_all_runs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (max 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of all agent runs for a project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListRunsResponse" } } - } + }, + "description": "List of all agent runs for a project" }, "401": { "description": "Unauthorized" @@ -69746,49 +70461,48 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs/latest-for-source": { "get": { - "tags": [ - "Agents" - ], "operationId": "latest_run_for_source", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "trigger_source_type", - "in": "query", "description": "Trigger source type, e.g. 'error_group'", + "in": "query", + "name": "trigger_source_type", "required": true, "schema": { "type": "string" } }, { - "name": "trigger_source_id", - "in": "query", "description": "Trigger source ID", + "in": "query", + "name": "trigger_source_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Latest matching run, or null if none", "content": { "application/json": { "schema": { @@ -69802,7 +70516,8 @@ ] } } - } + }, + "description": "Latest matching run, or null if none" }, "401": { "description": "Unauthorized" @@ -69818,47 +70533,47 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs/{run_id}": { "get": { - "tags": [ - "Agents" - ], "operationId": "get_run_with_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Run with logs", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentRunWithLogsResponse" } } - } + }, + "description": "Run with logs" }, "401": { "description": "Unauthorized" @@ -69877,47 +70592,47 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs/{run_id}/cancel": { "post": { - "tags": [ - "Agents" - ], "operationId": "cancel_run", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Agent run ID to cancel", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Run cancelled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentRunResponse" } } - } + }, + "description": "Run cancelled" }, "400": { "description": "Run is already in a terminal state" @@ -69939,48 +70654,47 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs/{run_id}/retry": { "post": { - "tags": [ - "Agents" - ], - "summary": "Retry a completed, failed, cancelled, or no_fix run with the same trigger context.\nCreates a new run record and spawns the executor.", "operationId": "retry_run", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID to retry", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "202": { - "description": "New run created from retry", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentRunResponse" } } - } + }, + "description": "New run created from retry" }, "400": { "description": "Run is still active" @@ -70002,44 +70716,44 @@ { "bearer_auth": [] } + ], + "summary": "Retry a completed, failed, cancelled, or no_fix run with the same trigger context.\nCreates a new run record and spawns the executor.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/runs/{run_id}/stream": { "get": { - "tags": [ - "Agents" - ], - "summary": "SSE endpoint for real-time streaming of run events.\nPolls the agent_run_logs table every 500ms for new entries and streams them.\nCloses when the run reaches a terminal status.", "operationId": "stream_run_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Agent run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Server-Sent Events stream of run log events and terminal status", "content": { "text/event-stream": {} - } + }, + "description": "Server-Sent Events stream of run log events and terminal status" }, "401": { "description": "Unauthorized" @@ -70055,37 +70769,38 @@ { "bearer_auth": [] } + ], + "summary": "SSE endpoint for real-time streaming of run events.\nPolls the agent_run_logs table every 500ms for new entries and streams them.\nCloses when the run reaches a terminal status.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/sandbox-status": { "get": { - "tags": [ - "Agents" - ], "operationId": "get_sandbox_status", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Project-scoped sandbox readiness (Docker + agent image)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxStatusResponse" } } - } + }, + "description": "Project-scoped sandbox readiness (Docker + agent image)" }, "401": { "description": "Unauthorized" @@ -70098,31 +70813,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/smoke-test": { "post": { - "tags": [ - "Agents" - ], - "summary": "Run a smoke test to verify the selected AI CLI works in the environment\nwhere agents will actually execute (host or sandbox container). If no\n`provider_id` is supplied the globally active provider is tested.", "operationId": "smoke_test_agent", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "provider_id", - "in": "query", "description": "Provider id to test; defaults to the globally active provider", + "in": "query", + "name": "provider_id", "required": false, "schema": { "type": "string" @@ -70131,14 +70845,14 @@ ], "responses": { "200": { - "description": "Smoke test result for the AI CLI in the agent's execution environment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SmokeTestResponse" } } - } + }, + "description": "Smoke test result for the AI CLI in the agent's execution environment" }, "401": { "description": "Unauthorized" @@ -70151,30 +70865,80 @@ { "bearer_auth": [] } + ], + "summary": "Run a smoke test to verify the selected AI CLI works in the environment\nwhere agents will actually execute (host or sandbox container). If no\n`provider_id` is supplied the globally active provider is tested.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/{slug}": { - "get": { + "delete": { + "operationId": "delete_agent", + "parameters": [ + { + "description": "Project ID", + "in": "path", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Agent slug", + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Agent deleted" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Agent not found" + }, + "500": { + "description": "Internal server error" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "Agents" - ], + ] + }, + "get": { "operationId": "get_agent", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Agent slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -70183,14 +70947,14 @@ ], "responses": { "200": { - "description": "Agent config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentConfigResponse" } } - } + }, + "description": "Agent config" }, "401": { "description": "Unauthorized" @@ -70206,28 +70970,28 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "put": { - "tags": [ - "Agents" - ], "operationId": "update_agent", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Agent slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -70246,14 +71010,14 @@ }, "responses": { "200": { - "description": "Agent updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentConfigResponse" } } - } + }, + "description": "Agent updated" }, "400": { "description": "Validation error" @@ -70275,117 +71039,68 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Agents" - ], - "operationId": "delete_agent", - "parameters": [ - { - "name": "project_id", - "in": "path", - "description": "Project ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "slug", - "in": "path", - "description": "Agent slug", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Agent deleted" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Insufficient permissions" - }, - "404": { - "description": "Agent not found" - }, - "500": { - "description": "Internal server error" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/projects/{project_id}/agents/{slug}/runs": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_agent_runs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Agent slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (max 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of runs for a specific agent", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListRunsResponse" } } - } + }, + "description": "List of runs for a specific agent" }, "401": { "description": "Unauthorized" @@ -70404,30 +71119,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/agents/{slug}/trigger": { "post": { - "tags": [ - "Agents" - ], "operationId": "trigger_agent", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Agent slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -70446,14 +71161,14 @@ }, "responses": { "202": { - "description": "Agent run created and queued", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentRunResponse" } } - } + }, + "description": "Agent run created and queued" }, "400": { "description": "Validation error" @@ -70484,78 +71199,77 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/aggregated-buckets": { "get": { - "tags": [ - "Events" - ], - "summary": "Get aggregated metrics by time bucket", "operationId": "get_aggregated_buckets", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for the query range", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for the query range", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment filter", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Optional deployment filter", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors (default: events)", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" } }, { - "name": "bucket_size", - "in": "query", "description": "Time bucket size: '1 hour', '1 day', '1 week', etc. (default: '1 hour')", + "in": "query", + "name": "bucket_size", "required": false, "schema": { "type": "string" @@ -70564,14 +71278,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved aggregated buckets", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AggregatedBucketsResponse" } } - } + }, + "description": "Successfully retrieved aggregated buckets" }, "400": { "description": "Bad request" @@ -70587,37 +71301,37 @@ { "bearer_auth": [] } + ], + "summary": "Get aggregated metrics by time bucket", + "tags": [ + "Events" ] } }, "/projects/{project_id}/ai/conversations": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "Find the existing chat for a context (returns `null` if none yet). Requires\nthe per-project `ai_debug_chat_enabled` toggle to be on; returns 403 when the\nfeature is disabled so revoking it consistently hides existing chat content.", "operationId": "find_conversation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "context_type", "in": "query", + "name": "context_type", "required": true, "schema": { "type": "string" } }, { - "name": "context_id", "in": "query", + "name": "context_id", "required": true, "schema": { "type": "string" @@ -70626,7 +71340,6 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { @@ -70640,7 +71353,8 @@ ] } } - } + }, + "description": "" }, "401": { "description": "" @@ -70653,22 +71367,22 @@ { "bearer_auth": [] } + ], + "summary": "Find the existing chat for a context (returns `null` if none yet). Requires\nthe per-project `ai_debug_chat_enabled` toggle to be on; returns 403 when the\nfeature is disabled so revoking it consistently hides existing chat content.", + "tags": [ + "AI Chat" ] }, "post": { - "tags": [ - "AI Chat" - ], - "summary": "Get-or-create the chat for a context (seeds it on first open).", "operationId": "create_conversation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -70684,14 +71398,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConversationResponse" } } - } + }, + "description": "" }, "401": { "description": "" @@ -70707,40 +71421,40 @@ { "bearer_auth": [] } + ], + "summary": "Get-or-create the chat for a context (seeds it on first open).", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/conversations/list": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "List all active conversations for a project, most-recently-active first.\nPowers the conversation switcher in the AI assistant sidebar.", "operationId": "list_conversations", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ConversationResponse" - } + }, + "type": "array" } } - } + }, + "description": "" }, "401": { "description": "" @@ -70753,29 +71467,29 @@ { "bearer_auth": [] } + ], + "summary": "List all active conversations for a project, most-recently-active first.\nPowers the conversation switcher in the AI assistant sidebar.", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/conversations/{public_id}": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "Full conversation history (excluding the internal system seed).", "operationId": "get_conversation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "public_id", "in": "path", + "name": "public_id", "required": true, "schema": { "type": "string" @@ -70784,14 +71498,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConversationDetailResponse" } } - } + }, + "description": "" }, "401": { "description": "" @@ -70807,27 +71521,27 @@ { "bearer_auth": [] } + ], + "summary": "Full conversation history (excluding the internal system seed).", + "tags": [ + "AI Chat" ] }, "patch": { - "tags": [ - "AI Chat" - ], - "summary": "Rename a conversation (set its human-facing title).", "operationId": "rename_conversation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "public_id", "in": "path", + "name": "public_id", "required": true, "schema": { "type": "string" @@ -70846,14 +71560,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ConversationResponse" } } - } + }, + "description": "" }, "400": { "description": "" @@ -70872,29 +71586,29 @@ { "bearer_auth": [] } + ], + "summary": "Rename a conversation (set its human-facing title).", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/conversations/{public_id}/archive": { "post": { - "tags": [ - "AI Chat" - ], - "summary": "Archive (soft-delete) a conversation.", "operationId": "archive_conversation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "public_id", "in": "path", + "name": "public_id", "required": true, "schema": { "type": "string" @@ -70919,29 +71633,29 @@ { "bearer_auth": [] } + ], + "summary": "Archive (soft-delete) a conversation.", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/conversations/{public_id}/messages": { "post": { - "tags": [ - "AI Chat" - ], - "summary": "Send a user message; stream the assistant reply as Server-Sent Events.", "operationId": "send_message", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "public_id", "in": "path", + "name": "public_id", "required": true, "schema": { "type": "string" @@ -70960,10 +71674,10 @@ }, "responses": { "200": { - "description": "SSE stream of assistant text deltas", "content": { "text/event-stream": {} - } + }, + "description": "SSE stream of assistant text deltas" }, "401": { "description": "" @@ -70979,30 +71693,30 @@ { "bearer_auth": [] } + ], + "summary": "Send a user message; stream the assistant reply as Server-Sent Events.", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/conversations/{public_id}/pending-actions": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "List all pending actions for a conversation (most-recently-proposed first).", "operationId": "list_pending_actions", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "public_id", - "in": "path", "description": "Conversation public id", + "in": "path", + "name": "public_id", "required": true, "schema": { "type": "string" @@ -71011,17 +71725,17 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/PendingActionResponse" - } + }, + "type": "array" } } - } + }, + "description": "" }, "401": { "description": "" @@ -71037,29 +71751,29 @@ { "bearer_auth": [] } + ], + "summary": "List all pending actions for a conversation (most-recently-proposed first).", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/pending-actions/{action_public_id}": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "Get a single pending action by its public id (scoped to the project).", "operationId": "get_pending_action", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "action_public_id", "in": "path", + "name": "action_public_id", "required": true, "schema": { "type": "string" @@ -71068,14 +71782,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PendingActionResponse" } } - } + }, + "description": "" }, "401": { "description": "" @@ -71091,29 +71805,29 @@ { "bearer_auth": [] } + ], + "summary": "Get a single pending action by its public id (scoped to the project).", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/pending-actions/{action_public_id}/confirm": { "post": { - "tags": [ - "AI Chat" - ], - "summary": "Confirm a proposed AI action: validate permission, atomically claim, execute,\npersist outcome. The execution uses the CONFIRMING user's auth \u2014 never the model's.", "operationId": "confirm_pending_action", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "action_public_id", "in": "path", + "name": "action_public_id", "required": true, "schema": { "type": "string" @@ -71122,14 +71836,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PendingActionResponse" } } - } + }, + "description": "" }, "401": { "description": "" @@ -71151,29 +71865,29 @@ { "bearer_auth": [] } + ], + "summary": "Confirm a proposed AI action: validate permission, atomically claim, execute,\npersist outcome. The execution uses the CONFIRMING user's auth — never the model's.", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/pending-actions/{action_public_id}/reject": { "post": { - "tags": [ - "AI Chat" - ], - "summary": "Reject a proposed AI action (no execution). Status transitions to \"rejected\".", "operationId": "reject_pending_action", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "action_public_id", "in": "path", + "name": "action_public_id", "required": true, "schema": { "type": "string" @@ -71182,14 +71896,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PendingActionResponse" } } - } + }, + "description": "" }, "401": { "description": "" @@ -71208,38 +71922,38 @@ { "bearer_auth": [] } + ], + "summary": "Reject a proposed AI action (no execution). Status transitions to \"rejected\".", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/ai/readiness": { "get": { - "tags": [ - "AI Chat" - ], - "summary": "Report which AI prerequisites this project satisfies.", - "description": "Read-only and cheap, so the UI can decide up front whether to show a working\nentry point, an onboarding path, or nothing \u2014 instead of letting the user\nclick something that fails with a 409 they can't act on.", + "description": "Read-only and cheap, so the UI can decide up front whether to show a working\nentry point, an onboarding path, or nothing — instead of letting the user\nclick something that fails with a 409 they can't act on.", "operationId": "get_chat_readiness", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Which AI prerequisites are met", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatReadinessResponse" } } - } + }, + "description": "Which AI prerequisites are met" }, "401": { "description": "Unauthorized" @@ -71255,31 +71969,31 @@ { "bearer_auth": [] } + ], + "summary": "Report which AI prerequisites this project satisfies.", + "tags": [ + "AI Chat" ] } }, "/projects/{project_id}/alarms": { "get": { - "tags": [ - "Alarms" - ], - "summary": "List alarms for a project with optional filters.", "operationId": "listProjectAlarms", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "alarm_type", - "in": "query", "description": "Filter by alarm type (e.g. `container_restart`, `outage`).", + "in": "query", + "name": "alarm_type", "required": false, "schema": { "type": [ @@ -71289,9 +72003,9 @@ } }, { - "name": "status", - "in": "query", "description": "Filter by status: `firing`, `acknowledged`, or `resolved`.", + "in": "query", + "name": "status", "required": false, "schema": { "type": [ @@ -71301,9 +72015,9 @@ } }, { - "name": "severity", - "in": "query", "description": "Filter by severity: `info`, `warning`, or `critical`.", + "in": "query", + "name": "severity", "required": false, "schema": { "type": [ @@ -71313,83 +72027,83 @@ } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID.", + "in": "query", + "name": "deployment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "service_id", - "in": "query", "description": "Filter by external service ID.", + "in": "query", + "name": "service_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "page", - "in": "query", "description": "Page number (1-based, default 1).", + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default 20, max 100).", + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } } ], "responses": { "200": { - "description": "Paginated list of alarms", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlarmListResponse" } } - } + }, + "description": "Paginated list of alarms" }, "401": { "description": "Unauthorized" @@ -71405,38 +72119,38 @@ { "bearer_auth": [] } + ], + "summary": "List alarms for a project with optional filters.", + "tags": [ + "Alarms" ] } }, "/projects/{project_id}/alarms/summary": { "get": { - "tags": [ - "Alarms" - ], - "summary": "Get alarm counts by status/severity/type for a project (dashboard summary widget).", "operationId": "getProjectAlarmsSummary", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Alarm summary counts", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlarmSummaryResponse" } } - } + }, + "description": "Alarm summary counts" }, "401": { "description": "Unauthorized" @@ -71452,35 +72166,35 @@ { "bearer_auth": [] } + ], + "summary": "Get alarm counts by status/severity/type for a project (dashboard summary widget).", + "tags": [ + "Alarms" ] } }, "/projects/{project_id}/alarms/{alarm_id}/acknowledge": { "post": { - "tags": [ - "Alarms" - ], - "summary": "Acknowledge a firing alarm (marks it as seen but not resolved).", "operationId": "acknowledgeAlarm", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "alarm_id", - "in": "path", "description": "Alarm ID", + "in": "path", + "name": "alarm_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71505,35 +72219,35 @@ { "bearer_auth": [] } + ], + "summary": "Acknowledge a firing alarm (marks it as seen but not resolved).", + "tags": [ + "Alarms" ] } }, "/projects/{project_id}/alarms/{alarm_id}/resolve": { "post": { - "tags": [ - "Alarms" - ], - "summary": "Resolve an alarm.", "operationId": "resolveAlarm", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "alarm_id", - "in": "path", "description": "Alarm ID", + "in": "path", + "name": "alarm_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71558,25 +72272,25 @@ { "bearer_auth": [] } + ], + "summary": "Resolve an alarm.", + "tags": [ + "Alarms" ] } }, "/projects/{project_id}/autofixer/analyze": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Start an autofixer analysis run for the given error group.\nCreates the run record immediately and spawns analysis in the background.", "operationId": "start_analysis", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71592,14 +72306,14 @@ }, "responses": { "202": { - "description": "Analysis started; returns run_id for streaming", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AutofixerRunResponse" } } - } + }, + "description": "Analysis started; returns run_id for streaming" }, "400": { "description": "Validation error" @@ -71618,48 +72332,48 @@ { "bearer_auth": [] } + ], + "summary": "Start an autofixer analysis run for the given error group.\nCreates the run record immediately and spawns analysis in the background.", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}": { "get": { - "tags": [ - "Autofixer" - ], - "summary": "Get a single autofixer run with its logs.", "operationId": "get_run", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Run with logs", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AutofixerRunWithLogsResponse" } } - } + }, + "description": "Run with logs" }, "401": { "description": "Unauthorized" @@ -71678,35 +72392,35 @@ { "bearer_auth": [] } + ], + "summary": "Get a single autofixer run with its logs.", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/add-context": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Append a user message to the run's context field.", "operationId": "add_context", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71741,35 +72455,35 @@ { "bearer_auth": [] } + ], + "summary": "Append a user message to the run's context field.", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/cancel": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Cancel an autofixer run and clean up the work directory.", "operationId": "cancel", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71797,48 +72511,48 @@ { "bearer_auth": [] } + ], + "summary": "Cancel an autofixer run and clean up the work directory.", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/create-pr": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Push the fix branch and create a pull request.\nRequires phase == \"fix_ready\".", "operationId": "create_pr", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "201": { - "description": "PR created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatePrResponse" } } - } + }, + "description": "PR created" }, "400": { "description": "Run not in fix_ready phase" @@ -71860,35 +72574,35 @@ { "bearer_auth": [] } + ], + "summary": "Push the fix branch and create a pull request.\nRequires phase == \"fix_ready\".", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/fix": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Transition from analysis to fix phase.\nRequires phase == \"analyzed\".", "operationId": "start_fix", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71916,35 +72630,35 @@ { "bearer_auth": [] } + ], + "summary": "Transition from analysis to fix phase.\nRequires phase == \"analyzed\".", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/re-analyze": { "post": { - "tags": [ - "Autofixer" - ], - "summary": "Continue the conversation with user feedback.\nUses the same Claude session (--continue) in the existing work directory.\nRequires phase == \"analyzed\".", "operationId": "re_analyze", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -71972,44 +72686,44 @@ { "bearer_auth": [] } + ], + "summary": "Continue the conversation with user feedback.\nUses the same Claude session (--continue) in the existing work directory.\nRequires phase == \"analyzed\".", + "tags": [ + "Autofixer" ] } }, "/projects/{project_id}/autofixer/runs/{run_id}/stream": { "get": { - "tags": [ - "Agents" - ], - "summary": "SSE endpoint: streams run log events in real-time.\nPolls every 500 ms. Keeps the connection open through \"analyzed\" and \"fix_ready\"\nwaiting states; closes only on terminal statuses.", "operationId": "stream_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "run_id", - "in": "path", "description": "Autofixer run ID", + "in": "path", + "name": "run_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Server-Sent Events stream of autofixer run logs and status updates", "content": { "text/event-stream": {} - } + }, + "description": "Server-Sent Events stream of autofixer run logs and status updates" }, "401": { "description": "Unauthorized" @@ -72025,25 +72739,25 @@ { "bearer_auth": [] } + ], + "summary": "SSE endpoint: streams run log events in real-time.\nPolls every 500 ms. Keeps the connection open through \"analyzed\" and \"fix_ready\"\nwaiting states; closes only on terminal statuses.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/automatic-deploy": { "post": { - "tags": [ - "Projects" - ], - "summary": "Update automatic deployment setting for a project", "operationId": "update_automatic_deploy", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -72059,14 +72773,14 @@ }, "responses": { "200": { - "description": "Automatic deployment setting updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Automatic deployment setting updated successfully" }, "401": { "description": "Unauthorized" @@ -72085,38 +72799,38 @@ { "bearer_auth": [] } + ], + "summary": "Update automatic deployment setting for a project", + "tags": [ + "Projects" ] } }, "/projects/{project_id}/custom-domains": { "get": { - "tags": [ - "Custom Domains" - ], - "summary": "List all custom domains for a project", "operationId": "list_custom_domains_for_project", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Custom domains retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListCustomDomainsResponse" } } - } + }, + "description": "Custom domains retrieved successfully" }, "401": { "description": "Unauthorized" @@ -72129,23 +72843,23 @@ { "bearer_auth": [] } + ], + "summary": "List all custom domains for a project", + "tags": [ + "Custom Domains" ] }, "post": { - "tags": [ - "Custom Domains" - ], - "summary": "Create a custom domain for a project", "operationId": "create_custom_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -72161,14 +72875,14 @@ }, "responses": { "201": { - "description": "Custom domain created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDomainResponse" } } - } + }, + "description": "Custom domain created successfully" }, "400": { "description": "Invalid input" @@ -72187,48 +72901,41 @@ { "bearer_auth": [] } + ], + "summary": "Create a custom domain for a project", + "tags": [ + "Custom Domains" ] } }, "/projects/{project_id}/custom-domains/{domain_id}": { - "get": { - "tags": [ - "Custom Domains" - ], - "summary": "Get a custom domain by ID", - "operationId": "get_custom_domain", + "delete": { + "operationId": "delete_custom_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain_id", - "in": "path", "description": "Custom domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Custom domain retrieved successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CustomDomainResponse" - } - } - } + "204": { + "description": "Custom domain deleted successfully" }, "401": { "description": "Unauthorized" @@ -72244,59 +72951,46 @@ { "bearer_auth": [] } - ] - }, - "put": { + ], + "summary": "Delete a custom domain", "tags": [ "Custom Domains" - ], - "summary": "Update a custom domain", - "operationId": "update_custom_domain", + ] + }, + "get": { + "operationId": "get_custom_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain_id", - "in": "path", "description": "Custom domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Custom domain updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDomainResponse" } } - } - }, - "400": { - "description": "Invalid input" + }, + "description": "Custom domain retrieved successfully" }, "401": { "description": "Unauthorized" @@ -72312,39 +73006,59 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Get a custom domain by ID", "tags": [ "Custom Domains" - ], - "summary": "Delete a custom domain", - "operationId": "delete_custom_domain", + ] + }, + "put": { + "operationId": "update_custom_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain_id", - "in": "path", "description": "Custom domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "Custom domain deleted successfully" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomDomainResponse" + } + } + }, + "description": "Custom domain updated successfully" + }, + "400": { + "description": "Invalid input" }, "401": { "description": "Unauthorized" @@ -72360,58 +73074,58 @@ { "bearer_auth": [] } + ], + "summary": "Update a custom domain", + "tags": [ + "Custom Domains" ] } }, "/projects/{project_id}/custom-domains/{domain_id}/link-certificate/{certificate_id}": { "post": { - "tags": [ - "Custom Domains" - ], - "summary": "Link a custom domain to a certificate", "operationId": "link_custom_domain_to_certificate", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain_id", - "in": "path", "description": "Custom domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "certificate_id", - "in": "path", "description": "Certificate ID", + "in": "path", + "name": "certificate_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Custom domain linked to certificate successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDomainResponse" } } - } + }, + "description": "Custom domain linked to certificate successfully" }, "401": { "description": "Unauthorized" @@ -72427,25 +73141,25 @@ { "bearer_auth": [] } + ], + "summary": "Link a custom domain to a certificate", + "tags": [ + "Custom Domains" ] } }, "/projects/{project_id}/deployment-config": { "patch": { - "tags": [ - "Projects" - ], - "summary": "Update deployment configuration for a project", "operationId": "update_project_deployment_config", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -72461,14 +73175,14 @@ }, "responses": { "200": { - "description": "Deployment configuration updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Deployment configuration updated successfully" }, "400": { "description": "Invalid deployment configuration" @@ -72490,60 +73204,60 @@ { "bearer_auth": [] } + ], + "summary": "Update deployment configuration for a project", + "tags": [ + "Projects" ] } }, "/projects/{project_id}/deployment-tokens": { "get": { - "tags": [ - "Deployment Tokens" - ], - "summary": "List all deployment tokens for a project", "operationId": "list_deployment_tokens", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of deployment tokens", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentTokenListResponse" } } - } + }, + "description": "List of deployment tokens" }, "401": { "description": "Unauthorized" @@ -72559,23 +73273,23 @@ { "bearer_auth": [] } + ], + "summary": "List all deployment tokens for a project", + "tags": [ + "Deployment Tokens" ] }, "post": { - "tags": [ - "Deployment Tokens" - ], - "summary": "Create a new deployment token for a project", "operationId": "create_deployment_token", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -72591,14 +73305,14 @@ }, "responses": { "201": { - "description": "Deployment token created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateDeploymentTokenResponse" } } - } + }, + "description": "Deployment token created successfully" }, "400": { "description": "Invalid request" @@ -72620,48 +73334,41 @@ { "bearer_auth": [] } + ], + "summary": "Create a new deployment token for a project", + "tags": [ + "Deployment Tokens" ] } }, "/projects/{project_id}/deployment-tokens/{token_id}": { - "get": { - "tags": [ - "Deployment Tokens" - ], - "summary": "Get a specific deployment token", - "operationId": "get_deployment_token", + "delete": { + "operationId": "delete_deployment_token", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "token_id", - "in": "path", "description": "Deployment token ID", + "in": "path", + "name": "token_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Deployment token details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeploymentTokenResponse" - } - } - } + "204": { + "description": "Deployment token deleted successfully" }, "401": { "description": "Unauthorized" @@ -72680,39 +73387,46 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Deployment Tokens" ], "summary": "Delete a deployment token", - "operationId": "delete_deployment_token", + "tags": [ + "Deployment Tokens" + ] + }, + "get": { + "operationId": "get_deployment_token", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "token_id", - "in": "path", "description": "Deployment token ID", + "in": "path", + "name": "token_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Deployment token deleted successfully" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeploymentTokenResponse" + } + } + }, + "description": "Deployment token details" }, "401": { "description": "Unauthorized" @@ -72731,33 +73445,33 @@ { "bearer_auth": [] } + ], + "summary": "Get a specific deployment token", + "tags": [ + "Deployment Tokens" ] }, "patch": { - "tags": [ - "Deployment Tokens" - ], - "summary": "Update a deployment token", "operationId": "update_deployment_token", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "token_id", - "in": "path", "description": "Deployment token ID", + "in": "path", + "name": "token_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -72773,14 +73487,14 @@ }, "responses": { "200": { - "description": "Deployment token updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentTokenResponse" } } - } + }, + "description": "Deployment token updated successfully" }, "400": { "description": "Invalid request" @@ -72805,48 +73519,48 @@ { "bearer_auth": [] } + ], + "summary": "Update a deployment token", + "tags": [ + "Deployment Tokens" ] } }, "/projects/{project_id}/deployment-tokens/{token_id}/rotate": { "post": { - "tags": [ - "Deployment Tokens" - ], - "summary": "Rotate a deployment token, invalidating its old secret and issuing a new one", "operationId": "rotate_deployment_token", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "token_id", - "in": "path", "description": "Deployment token ID", + "in": "path", + "name": "token_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deployment token rotated successfully; the response contains the new plaintext token, shown only once", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateDeploymentTokenResponse" } } - } + }, + "description": "Deployment token rotated successfully; the response contains the new plaintext token, shown only once" }, "401": { "description": "Unauthorized" @@ -72865,48 +73579,48 @@ { "bearer_auth": [] } + ], + "summary": "Rotate a deployment token, invalidating its old secret and issuing a new one", + "tags": [ + "Deployment Tokens" ] } }, "/projects/{project_id}/deployments/{deployment_id}": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get a specific deployment by ID for a project (identified by ID or slug)", "operationId": "get_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deployment details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentResponse" } } - } + }, + "description": "Deployment details" }, "404": { "description": "Project or deployment not found" @@ -72914,48 +73628,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get a specific deployment by ID for a project (identified by ID or slug)", + "tags": [ + "Deployments" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/cancel": { "post": { - "tags": [ - "Projects" - ], - "summary": "Cancel a deployment", "operationId": "cancel_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deployment cancelled successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentStateResponse" } } - } + }, + "description": "Deployment cancelled successfully" }, "400": { "description": "Deployment cannot be cancelled (already completed, failed, or cancelled)" @@ -72966,49 +73680,49 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Cancel a deployment", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/container-logs": { "get": { - "tags": [ - "Deployments" - ], - "summary": "List the captured (historical) container-log dumps for a deployment.", - "description": "Container runtime logs are normally only available live from the running\ncontainer. When a deployment is superseded its containers are torn down and\nthose logs would be lost \u2014 so just before teardown we capture each\ncontainer's logs to durable storage. This endpoint lists what was captured\nfor a given (often older) deployment, so a user can read the logs of a\ncontainer that no longer exists.", + "description": "Container runtime logs are normally only available live from the running\ncontainer. When a deployment is superseded its containers are torn down and\nthose logs would be lost — so just before teardown we capture each\ncontainer's logs to durable storage. This endpoint lists what was captured\nfor a given (often older) deployment, so a user can read the logs of a\ncontainer that no longer exists.", "operationId": "list_deployment_container_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Captured container logs for the deployment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentContainerLogsListResponse" } } - } + }, + "description": "Captured container logs for the deployment" }, "404": { "description": "Deployment not found in this project" @@ -73021,58 +73735,58 @@ { "bearer_token": [] } + ], + "summary": "List the captured (historical) container-log dumps for a deployment.", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/container-logs/{log_id}": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get the captured text content of a single historical container-log dump.", "operationId": "get_deployment_container_log_content", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "log_id", - "in": "path", "description": "Captured log ID", + "in": "path", + "name": "log_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Captured container log content", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentContainerLogContentResponse" } } - } + }, + "description": "Captured container log content" }, "404": { "description": "Captured log not found in this project" @@ -73085,49 +73799,49 @@ { "bearer_token": [] } + ], + "summary": "Get the captured text content of a single historical container-log dump.", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/jobs": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get jobs for a specific deployment", "description": "Returns all jobs (workflow tasks) for a deployment, ordered by execution order.\nThis replaces the old deployment stages endpoint.", "operationId": "get_deployment_jobs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Jobs retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentJobsResponse" } } - } + }, + "description": "Jobs retrieved successfully" }, "404": { "description": "Deployment not found" @@ -73135,41 +73849,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get jobs for a specific deployment", + "tags": [ + "Deployments" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/jobs/{job_id}/logs": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get logs for a specific deployment job", "operationId": "get_deployment_job_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "job_id", - "in": "path", "description": "Job ID", + "in": "path", + "name": "job_id", "required": true, "schema": { "type": "string" @@ -73178,14 +73892,14 @@ ], "responses": { "200": { - "description": "Job logs retrieved successfully", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Job logs retrieved successfully" }, "404": { "description": "Job or logs not found" @@ -73198,42 +73912,42 @@ { "bearer_token": [] } + ], + "summary": "Get logs for a specific deployment job", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/jobs/{job_id}/logs/tail": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Tail logs for a specific deployment job in real-time via WebSocket", "description": "**WebSocket Streaming**: Logs are sent as raw text, one line per WebSocket message.\n\n**Authentication**: Requires authentication via session cookie (browser clients)\nor API key (API clients). For browser-based WebSocket connections, ensure the user\nis logged in - the browser automatically includes session cookies in the WebSocket\nupgrade request.\n\n**API Client Authentication**: Include API key in Authorization header:\n```text\nAuthorization: Bearer tk_your_api_key_here\n```", "operationId": "tail_deployment_job_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "job_id", - "in": "path", "description": "Job ID", + "in": "path", + "name": "job_id", "required": true, "schema": { "type": "string" @@ -73255,29 +73969,29 @@ { "bearer_token": [] } + ], + "summary": "Tail logs for a specific deployment job in real-time via WebSocket", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/operations": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get all operations for a deployment", "operationId": "get_deployment_operations", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", "in": "path", + "name": "deployment_id", "required": true, "schema": { "type": "string" @@ -73286,14 +74000,14 @@ ], "responses": { "200": { - "description": "List of operations", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperationResultsResponse" } } - } + }, + "description": "List of operations" }, "401": { "description": "Unauthorized" @@ -73312,27 +74026,27 @@ { "bearer_auth": [] } + ], + "summary": "Get all operations for a deployment", + "tags": [ + "Deployments" ] }, "post": { - "tags": [ - "Deployments" - ], - "summary": "Execute a deployment operation (deploy, mark_complete, take_screenshot)", "operationId": "execute_deployment_operation", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", "in": "path", + "name": "deployment_id", "required": true, "schema": { "type": "string" @@ -73351,14 +74065,14 @@ }, "responses": { "202": { - "description": "Operation executed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperationResultResponse" } } - } + }, + "description": "Operation executed" }, "400": { "description": "Invalid operation" @@ -73380,37 +74094,37 @@ { "bearer_auth": [] } + ], + "summary": "Execute a deployment operation (deploy, mark_complete, take_screenshot)", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/operations/{operation_type}": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get the status of a specific operation type", "operationId": "get_deployment_operation_status", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", "in": "path", + "name": "deployment_id", "required": true, "schema": { "type": "string" } }, { - "name": "operation_type", "in": "path", + "name": "operation_type", "required": true, "schema": { "type": "string" @@ -73419,14 +74133,14 @@ ], "responses": { "200": { - "description": "Operation status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperationResultResponse" } } - } + }, + "description": "Operation status" }, "401": { "description": "Unauthorized" @@ -73445,48 +74159,48 @@ { "bearer_auth": [] } + ], + "summary": "Get the status of a specific operation type", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/deployments/{deployment_id}/pause": { "post": { - "tags": [ - "Projects" - ], - "summary": "Pause a deployment", "operationId": "pause_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deployment paused successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentStateResponse" } } - } + }, + "description": "Deployment paused successfully" }, "404": { "description": "Project or deployment not found" @@ -73494,36 +74208,36 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Pause a deployment", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/promote": { "post": { - "tags": [ - "Deployments" - ], - "summary": "Promote a deployment to another environment", "description": "Creates a new deployment in the target environment using the source deployment's\nDocker image. Useful for promoting a validated preview/staging deployment to production.", "operationId": "promote_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Source deployment ID to promote", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73539,14 +74253,14 @@ }, "responses": { "200": { - "description": "Promotion initiated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentResponse" } } - } + }, + "description": "Promotion initiated successfully" }, "400": { "description": "Invalid deployment state for promotion" @@ -73557,48 +74271,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Promote a deployment to another environment", + "tags": [ + "Deployments" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/resume": { "post": { - "tags": [ - "Projects" - ], - "summary": "Resume a deployment", "operationId": "resume_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Deployment resumed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentStateResponse" } } - } + }, + "description": "Deployment resumed successfully" }, "404": { "description": "Project or deployment not found" @@ -73606,47 +74320,48 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Resume a deployment", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/rollback": { "post": { - "tags": [ - "Projects" - ], "operationId": "rollback_to_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID to rollback to", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Rollback initiated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeploymentResponse" } } - } + }, + "description": "Rollback initiated successfully" }, "404": { "description": "Project or deployment not found" @@ -73654,35 +74369,34 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/deployments/{deployment_id}/teardown": { "delete": { - "tags": [ - "Projects" - ], - "summary": "Teardown a specific deployment", "operationId": "teardown_deployment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "path", "description": "Deployment ID", + "in": "path", + "name": "deployment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73696,39 +74410,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Teardown a specific deployment", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/dsns": { "get": { - "tags": [], - "summary": "List all DSNs for a project", "operationId": "list_dsns", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of DSNs", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectDSNResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of DSNs" }, "401": { "description": "Unauthorized" @@ -73741,21 +74457,21 @@ { "bearer_auth": [] } - ] + ], + "summary": "List all DSNs for a project", + "tags": [] }, "post": { - "tags": [], - "summary": "Create a new DSN for a project", "operationId": "create_dsn", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73771,14 +74487,14 @@ }, "responses": { "201": { - "description": "DSN created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectDSNResponse" } } - } + }, + "description": "DSN created" }, "401": { "description": "Unauthorized" @@ -73794,23 +74510,23 @@ { "bearer_auth": [] } - ] + ], + "summary": "Create a new DSN for a project", + "tags": [] } }, "/projects/{project_id}/dsns/get-or-create": { "post": { - "tags": [], - "summary": "Get or create DSN for a project/environment/deployment combination", "operationId": "get_or_create_dsn", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73826,14 +74542,14 @@ }, "responses": { "200": { - "description": "DSN retrieved or created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectDSNResponse" } } - } + }, + "description": "DSN retrieved or created" }, "401": { "description": "Unauthorized" @@ -73849,33 +74565,33 @@ { "bearer_auth": [] } - ] + ], + "summary": "Get or create DSN for a project/environment/deployment combination", + "tags": [] } }, "/projects/{project_id}/dsns/{dsn_id}/regenerate": { "post": { - "tags": [], - "summary": "Regenerate DSN keys (rotate keys)", "operationId": "regenerate_dsn", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "dsn_id", - "in": "path", "description": "DSN ID", + "in": "path", + "name": "dsn_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73891,14 +74607,14 @@ }, "responses": { "200": { - "description": "DSN keys regenerated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectDSNResponse" } } - } + }, + "description": "DSN keys regenerated" }, "401": { "description": "Unauthorized" @@ -73914,33 +74630,33 @@ { "bearer_auth": [] } - ] + ], + "summary": "Regenerate DSN keys (rotate keys)", + "tags": [] } }, "/projects/{project_id}/dsns/{dsn_id}/revoke": { "post": { - "tags": [], - "summary": "Revoke (deactivate) a DSN", "operationId": "revoke_dsn", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "dsn_id", - "in": "path", "description": "DSN ID", + "in": "path", + "name": "dsn_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -73962,51 +74678,49 @@ { "bearer_auth": [] } - ] + ], + "summary": "Revoke (deactivate) a DSN", + "tags": [] } }, "/projects/{project_id}/env-vars": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get environment variables for a project, optionally filtered by environment", "operationId": "get_environment_variables", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment ID to filter by", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of environment variables", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EnvironmentVariableResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of environment variables" }, "404": { "description": "Project not found" @@ -74014,23 +74728,23 @@ "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "Get environment variables for a project, optionally filtered by environment", "tags": [ "Projects" - ], - "summary": "Create a new environment variable", + ] + }, + "post": { "operationId": "create_environment_variable", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74046,14 +74760,14 @@ }, "responses": { "201": { - "description": "Environment variables created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentVariableResponse" } } - } + }, + "description": "Environment variables created successfully" }, "400": { "description": "Invalid input" @@ -74064,52 +74778,52 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Create a new environment variable", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/env-vars/resolved": { "get": { - "tags": [ - "Projects" - ], - "summary": "Resolved env vars for a project (manual + integration-sourced, merged).", "description": "Returns the effective set of environment variables a deployment would see,\ncombining manually-defined vars with those contributed by linked external\nservices (Postgres, Redis, S3, etc.). Each entry is tagged with its source\nso the UI can render an integration icon, and manual entries that shadow an\nintegration key carry a reference to the integration they override.\n\nValues are always returned as a masked preview. Use the per-key reveal\nendpoint for plaintext (audit-logged).", "operationId": "get_resolved_environment_variables", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment ID to filter manual vars by", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Resolved environment variables", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ResolvedEnvVarResponse" - } + }, + "type": "array" } } - } + }, + "description": "Resolved environment variables" }, "404": { "description": "Project not found" @@ -74117,78 +74831,78 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Resolved env vars for a project (manual + integration-sourced, merged).", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/env-vars/resolved/{key}/value": { "get": { - "tags": [ - "Projects" - ], - "summary": "Reveal the plaintext value of a resolved environment variable.", - "description": "Mirrors `GET /projects/{id}/env-vars/{key}/value` but handles keys sourced\nfrom linked integrations (which are not stored in the `env_vars` table).\nResolution order mirrors the merged view:\n\n1. Manual env var with this key \u2014 this endpoint reads the manual store when\n the key exists there, then writes its own reveal audit event so callers\n can safely use one endpoint regardless of source.\n2. Integration env var supplied by a linked external service.\n\nReturns 404 when neither a manual var nor an integration produces the key.", + "description": "Mirrors `GET /projects/{id}/env-vars/{key}/value` but handles keys sourced\nfrom linked integrations (which are not stored in the `env_vars` table).\nResolution order mirrors the merged view:\n\n1. Manual env var with this key — this endpoint reads the manual store when\n the key exists there, then writes its own reveal audit event so callers\n can safely use one endpoint regardless of source.\n2. Integration env var supplied by a linked external service.\n\nReturns 404 when neither a manual var nor an integration produces the key.", "operationId": "get_resolved_environment_variable_value", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Environment variable key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "var_id", - "in": "query", "description": "Exact manual environment-variable row ID", + "in": "query", + "name": "var_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "service_id", - "in": "query", "description": "Integration service ID shown by the resolved list", + "in": "query", + "name": "service_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Resolved environment variable value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentVariableValueResponse" } } - } + }, + "description": "Resolved environment variable value" }, "403": { "description": "Plaintext secret access is not permitted" @@ -74202,67 +74916,67 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Reveal the plaintext value of a resolved environment variable.", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/env-vars/{key}/value": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get environment variable value by key", "operationId": "get_environment_variable_value", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Environment variable key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "var_id", - "in": "query", "description": "Exact environment-variable row ID", + "in": "query", + "name": "var_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Environment variable value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentVariableValueResponse" } } - } + }, + "description": "Environment variable value" }, "403": { "description": "Plaintext secret access is not permitted" @@ -74276,35 +74990,75 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get environment variable value by key", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/env-vars/{var_id}": { - "put": { + "delete": { + "operationId": "delete_environment_variable", + "parameters": [ + { + "description": "Project ID or slug", + "in": "path", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Environment variable ID", + "in": "path", + "name": "var_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Environment variable deleted successfully" + }, + "404": { + "description": "Project or variable not found" + }, + "500": { + "description": "Internal server error" + } + }, + "summary": "Delete an environment variable", "tags": [ "Projects" - ], - "summary": "Update an environment variable", + ] + }, + "put": { "operationId": "update_environment_variable", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "var_id", - "in": "path", "description": "Environment variable ID", + "in": "path", + "name": "var_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74320,14 +75074,14 @@ }, "responses": { "200": { - "description": "Environment variables updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentVariableResponse" } } - } + }, + "description": "Environment variables updated successfully" }, "400": { "description": "Invalid input" @@ -74338,81 +75092,41 @@ "500": { "description": "Internal server error" } - } - }, - "delete": { + }, + "summary": "Update an environment variable", "tags": [ "Projects" - ], - "summary": "Delete an environment variable", - "operationId": "delete_environment_variable", - "parameters": [ - { - "name": "project_id", - "in": "path", - "description": "Project ID or slug", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "var_id", - "in": "path", - "description": "Environment variable ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Environment variable deleted successfully" - }, - "404": { - "description": "Project or variable not found" - }, - "500": { - "description": "Internal server error" - } - } + ] } }, "/projects/{project_id}/environments": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get all environments for a project", "operationId": "get_environments", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of environments", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EnvironmentResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of environments" }, "404": { "description": "Project not found" @@ -74420,23 +75134,23 @@ "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "Get all environments for a project", "tags": [ "Projects" - ], - "summary": "Create a new environment for a project", + ] + }, + "post": { "operationId": "create_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74452,14 +75166,14 @@ }, "responses": { "201": { - "description": "Environment created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentResponse" } } - } + }, + "description": "Environment created successfully" }, "400": { "description": "Invalid input" @@ -74470,146 +75184,147 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Create a new environment for a project", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}": { - "get": { - "tags": [ - "Projects" - ], - "summary": "Get a specific environment by ID or slug", - "operationId": "get_environment", + "delete": { + "description": "Permanently deletes an environment and all related data. Cannot delete:\n- Production environments (name = \"Production\")\n\nWarning: This action is permanent and cannot be undone.\nActive deployments are automatically cancelled before deletion.", + "operationId": "delete_environment", "parameters": [ { - "name": "project_id", + "description": "Project ID", "in": "path", - "description": "Project ID or slug", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", + "description": "Environment ID", "in": "path", - "description": "Environment ID or slug", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Environment details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EnvironmentResponse" - } - } - } + "204": { + "description": "Environment permanently deleted" + }, + "400": { + "description": "Cannot delete production environment" }, "404": { "description": "Project or environment not found" }, + "428": { + "description": "Recent MFA verification required" + }, "500": { "description": "Internal server error" } - } - }, - "delete": { + }, + "summary": "Delete an environment permanently", "tags": [ "Projects" - ], - "summary": "Delete an environment permanently", - "description": "Permanently deletes an environment and all related data. Cannot delete:\n- Production environments (name = \"Production\")\n\nWarning: This action is permanent and cannot be undone.\nActive deployments are automatically cancelled before deletion.", - "operationId": "delete_environment", + ] + }, + "get": { + "operationId": "get_environment", "parameters": [ { - "name": "project_id", + "description": "Project ID or slug", "in": "path", - "description": "Project ID", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", + "description": "Environment ID or slug", "in": "path", - "description": "Environment ID", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Environment permanently deleted" - }, - "400": { - "description": "Cannot delete production environment" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnvironmentResponse" + } + } + }, + "description": "Environment details" }, "404": { "description": "Project or environment not found" }, - "428": { - "description": "Recent MFA verification required" - }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get a specific environment by ID or slug", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/crons": { "get": { - "tags": [ - "Crons" - ], "operationId": "get_environment_crons", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of cron jobs", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/CronInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of cron jobs" }, "401": { "description": "Unauthorized" @@ -74617,57 +75332,57 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Crons" + ] } }, "/projects/{project_id}/environments/{env_id}/crons/{cron_id}": { "get": { - "tags": [ - "Crons" - ], "operationId": "get_cron_by_id", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "cron_id", - "in": "path", "description": "Cron Job ID", + "in": "path", + "name": "cron_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Cron job details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CronInfo" } } - } + }, + "description": "Cron job details" }, "401": { "description": "Unauthorized" @@ -74678,80 +75393,80 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Crons" + ] } }, "/projects/{project_id}/environments/{env_id}/crons/{cron_id}/executions": { "get": { - "tags": [ - "Crons" - ], "operationId": "get_cron_executions", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "cron_id", - "in": "path", "description": "Cron Job ID", + "in": "path", + "name": "cron_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page (default: 20)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "List of cron job executions", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/CronExecutionInfo" - } + }, + "type": "array" } } - } + }, + "description": "List of cron job executions" }, "401": { "description": "Unauthorized" @@ -74762,51 +75477,50 @@ "500": { "description": "Internal server error" } - } + }, + "tags": [ + "Crons" + ] } }, "/projects/{project_id}/environments/{env_id}/domains": { "get": { - "tags": [ - "Projects" - ], - "summary": "Get all environment domains for a specific environment", "operationId": "get_environment_domains", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of environment domains", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EnvironmentDomainResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of environment domains" }, "404": { "description": "Project or environment not found" @@ -74814,33 +75528,33 @@ "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "Get all environment domains for a specific environment", "tags": [ "Projects" - ], - "summary": "Add a new environment domain", + ] + }, + "post": { "operationId": "add_environment_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74856,14 +75570,14 @@ }, "responses": { "201": { - "description": "Domain added successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentDomainResponse" } } - } + }, + "description": "Domain added successfully" }, "400": { "description": "Invalid input" @@ -74874,45 +75588,45 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Add a new environment domain", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/domains/{domain_id}": { "delete": { - "tags": [ - "Projects" - ], - "summary": "Delete an environment domain", "operationId": "delete_environment_domain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "domain_id", - "in": "path", "description": "Domain ID", + "in": "path", + "name": "domain_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74926,35 +75640,35 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Delete an environment domain", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/settings": { "put": { - "tags": [ - "Projects" - ], - "summary": "Update environment settings", "operationId": "update_environment_settings", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -74970,14 +75684,14 @@ }, "responses": { "200": { - "description": "Environment settings updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentResponse" } } - } + }, + "description": "Environment settings updated successfully" }, "404": { "description": "Project or environment not found" @@ -74985,49 +75699,49 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Update environment settings", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/sleep": { "post": { - "tags": [ - "Environments" - ], - "summary": "Sleep an on-demand environment", "description": "Manually put an on-demand environment to sleep. Stops containers and sets\n`sleeping = true`. If no OnDemandWaker is available, falls back to DB flag only.", "operationId": "sleep_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Environment put to sleep", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentResponse" } } - } + }, + "description": "Environment put to sleep" }, "400": { "description": "On-demand not enabled for this environment" @@ -75041,36 +75755,36 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Sleep an on-demand environment", + "tags": [ + "Environments" + ] } }, "/projects/{project_id}/environments/{env_id}/subdomain": { "patch": { - "tags": [ - "Projects" - ], - "summary": "Rename the auto-managed subdomain for an environment.", - "description": "Replaces the environment's previous subdomain entirely \u2014 the old\nhostname stops resolving once the proxy reloads its route table.\nCustom domains attached to the environment are unaffected.", + "description": "Replaces the environment's previous subdomain entirely — the old\nhostname stops resolving once the proxy reloads its route table.\nCustom domains attached to the environment are unaffected.", "operationId": "update_environment_subdomain", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -75086,14 +75800,14 @@ }, "responses": { "200": { - "description": "Subdomain updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentResponse" } } - } + }, + "description": "Subdomain updated successfully" }, "400": { "description": "Invalid subdomain or conflict with another environment" @@ -75104,35 +75818,35 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Rename the auto-managed subdomain for an environment.", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/teardown": { "delete": { - "tags": [ - "Projects" - ], - "summary": "Teardown an environment and all its active deployments", "operationId": "teardown_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID or slug", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID or slug", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -75146,49 +75860,49 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Teardown an environment and all its active deployments", + "tags": [ + "Projects" + ] } }, "/projects/{project_id}/environments/{env_id}/wake": { "post": { - "tags": [ - "Environments" - ], - "summary": "Wake a sleeping on-demand environment", "description": "Manually wake an environment that has been put to sleep by the on-demand\nidle timeout. Starts containers, waits for health checks, then sets\n`sleeping = false`. If no OnDemandWaker is available (proxy not running\nin same process), falls back to setting the DB flag only.", "operationId": "wake_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "env_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "env_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Environment woken up", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnvironmentResponse" } } - } + }, + "description": "Environment woken up" }, "400": { "description": "On-demand not enabled for this environment" @@ -75202,88 +75916,88 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Wake a sleeping on-demand environment", + "tags": [ + "Environments" + ] } }, "/projects/{project_id}/environments/{environment_id}/container-logs": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get logs for a container in an environment via WebSocket", "operationId": "get_container_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for logs", + "in": "query", + "name": "start_date", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "end_date", - "in": "query", "description": "End date for logs", + "in": "query", + "name": "end_date", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tail", - "in": "query", "description": "Number of lines to tail (or 'all')", + "in": "query", + "name": "tail", "required": false, "schema": { "type": "string" } }, { - "name": "container_name", - "in": "query", "description": "Optional container name (defaults to first/primary container)", + "in": "query", + "name": "container_name", "required": false, "schema": { "type": "string" } }, { - "name": "timestamps", - "in": "query", "description": "Include timestamps in log output (default: false)", + "in": "query", + "name": "timestamps", "required": false, "schema": { "type": "boolean" } }, { - "name": "follow", - "in": "query", "description": "Follow log output in real-time (default: true)", + "in": "query", + "name": "follow", "required": false, "schema": { "type": "boolean" @@ -75308,48 +76022,48 @@ { "bearer_auth": [] } + ], + "summary": "Get logs for a container in an environment via WebSocket", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/containers": { "get": { - "tags": [ - "Deployments" - ], - "summary": "List all containers for an environment", "operationId": "list_containers", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of containers", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerListResponse" } } - } + }, + "description": "List of containers" }, "400": { "description": "Not a server-type project" @@ -75365,41 +76079,41 @@ { "bearer_auth": [] } + ], + "summary": "List all containers for an environment", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}": { "get": { - "tags": [ - "Containers" - ], - "summary": "Get detailed information about a specific container", "operationId": "get_container_detail", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" @@ -75408,14 +76122,14 @@ ], "responses": { "200": { - "description": "Container details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerDetailResponse" } } - } + }, + "description": "Container details" }, "404": { "description": "Container not found" @@ -75428,49 +76142,50 @@ { "bearer_auth": [] } + ], + "summary": "Get detailed information about a specific container", + "tags": [ + "Containers" ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/environment/{variable_name}": { "get": { - "tags": [ - "Containers" - ], "operationId": "get_container_environment_variable", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" } }, { - "name": "variable_name", - "in": "path", "description": "Environment variable name", + "in": "path", + "name": "variable_name", "required": true, "schema": { "type": "string" @@ -75479,14 +76194,14 @@ ], "responses": { "200": { - "description": "Environment variable value", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerEnvironmentVariableValueResponse" } } - } + }, + "description": "Environment variable value" }, "403": { "description": "Plaintext secret access is not permitted" @@ -75502,88 +76217,87 @@ { "bearer_auth": [] } + ], + "tags": [ + "Containers" ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/logs": { "get": { - "tags": [ - "Deployments" - ], - "summary": "Get logs for a specific container by container ID via WebSocket", "operationId": "get_container_logs_by_id", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" } }, { - "name": "start_date", - "in": "query", "description": "Start date for logs", + "in": "query", + "name": "start_date", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "end_date", - "in": "query", "description": "End date for logs", + "in": "query", + "name": "end_date", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } }, { - "name": "tail", - "in": "query", "description": "Number of lines to tail (or 'all')", + "in": "query", + "name": "tail", "required": false, "schema": { "type": "string" } }, { - "name": "timestamps", - "in": "query", "description": "Include timestamps in log output (default: false)", + "in": "query", + "name": "timestamps", "required": false, "schema": { "type": "boolean" } }, { - "name": "follow", - "in": "query", "description": "Follow log output in real-time (default: true)", + "in": "query", + "name": "follow", "required": false, "schema": { "type": "boolean" @@ -75608,41 +76322,41 @@ { "bearer_auth": [] } + ], + "summary": "Get logs for a specific container by container ID via WebSocket", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/metrics": { "get": { - "tags": [ - "Containers" - ], - "summary": "Get metrics/stats for a specific container", "operationId": "get_container_metrics", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" @@ -75651,14 +76365,14 @@ ], "responses": { "200": { - "description": "Container metrics retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerMetricsResponse" } } - } + }, + "description": "Container metrics retrieved successfully" }, "404": { "description": "Container not found" @@ -75666,60 +76380,60 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get metrics/stats for a specific container", + "tags": [ + "Containers" + ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/metrics/history": { "get": { - "tags": [ - "Containers" - ], - "summary": "Fetch a time-series range for a single container resource metric\n(recorded by the container health monitor every ~30s).", "description": "Useful metric names: `container.cpu_percent`,\n`container.cpu_utilization_percent`, `container.memory_used_bytes`,\n`container.memory_percent`, `container.network_rx_bytes_delta`,\n`container.network_tx_bytes_delta`.", "operationId": "ContainerMetricsGetHistory", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" } }, { - "name": "metric", - "in": "query", "description": "Dotted metric name, e.g. `container.cpu_percent` or\n`container.memory_used_bytes`.", + "in": "query", + "name": "metric", "required": true, "schema": { "type": "string" } }, { - "name": "range", - "in": "query", "description": "Time window: `1h`, `6h`, `24h`, or `7d` (defaults to `1h`).", + "in": "query", + "name": "range", "required": false, "schema": { "type": "string" @@ -75728,17 +76442,17 @@ ], "responses": { "200": { - "description": "Metric time series data points", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ContainerMetricHistoryPoint" - } + }, + "type": "array" } } - } + }, + "description": "Metric time series data points" }, "401": { "description": "Unauthorized" @@ -75757,55 +76471,55 @@ { "bearer_auth": [] } + ], + "summary": "Fetch a time-series range for a single container resource metric\n(recorded by the container health monitor every ~30s).", + "tags": [ + "Containers" ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/metrics/stream": { "get": { - "tags": [ - "Containers" - ], - "summary": "Stream container metrics via Server-Sent Events (SSE)", "operationId": "stream_container_metrics", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" } }, { - "name": "interval", - "in": "query", "description": "Update interval in milliseconds (default: 1000)", + "in": "query", + "name": "interval", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], @@ -75819,41 +76533,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Stream container metrics via Server-Sent Events (SSE)", + "tags": [ + "Containers" + ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/restart": { "post": { - "tags": [ - "Containers" - ], - "summary": "Restart a container", "operationId": "restart_container", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" @@ -75862,14 +76576,14 @@ ], "responses": { "200": { - "description": "Container restarted successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerActionResponse" } } - } + }, + "description": "Container restarted successfully" }, "404": { "description": "Container not found" @@ -75877,41 +76591,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Restart a container", + "tags": [ + "Containers" + ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/start": { "post": { - "tags": [ - "Containers" - ], - "summary": "Start a container", "operationId": "start_container", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" @@ -75920,14 +76634,14 @@ ], "responses": { "200": { - "description": "Container started successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerActionResponse" } } - } + }, + "description": "Container started successfully" }, "404": { "description": "Container not found" @@ -75935,41 +76649,41 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Start a container", + "tags": [ + "Containers" + ] } }, "/projects/{project_id}/environments/{environment_id}/containers/{container_id}/stop": { "post": { - "tags": [ - "Containers" - ], - "summary": "Stop a specific container", "operationId": "stop_container", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "container_id", - "in": "path", "description": "Container ID", + "in": "path", + "name": "container_id", "required": true, "schema": { "type": "string" @@ -75978,14 +76692,14 @@ ], "responses": { "200": { - "description": "Container stopped successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContainerActionResponse" } } - } + }, + "description": "Container stopped successfully" }, "404": { "description": "Container not found" @@ -75993,34 +76707,34 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Stop a specific container", + "tags": [ + "Containers" + ] } }, "/projects/{project_id}/environments/{environment_id}/deploy/image": { "post": { - "tags": [ - "Deployments" - ], - "summary": "Deploy from an external Docker image", "description": "Triggers a deployment using a pre-built Docker image from an external registry.\nThe image will be pulled and deployed to the specified environment.", "operationId": "deploy_from_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76036,14 +76750,14 @@ }, "responses": { "202": { - "description": "Deployment started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoteDeploymentResponse" } } - } + }, + "description": "Deployment started" }, "400": { "description": "Invalid request" @@ -76065,22 +76779,22 @@ { "bearer_auth": [] } + ], + "summary": "Deploy from an external Docker image", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/deploy/image-upload": { "post": { - "tags": [ - "Deployments" - ], - "summary": "Deploy from an uploaded Docker image tarball", "description": "Uploads a Docker image tarball (from `docker save`) and deploys it directly.\nThe image is imported using `docker load` and then deployed to the specified environment.\nThis is useful when you want to deploy an image without pushing to a registry first.\n\nThe uploaded file should be a tarball created by `docker save myimage:tag > image.tar`\nor `docker save myimage:tag | gzip > image.tar.gz` (gzip compressed tarballs are also supported).", "operationId": "deploy_from_image_upload", "parameters": [ { - "name": "tag", - "in": "query", "description": "Tag to apply to the imported image (e.g., \"myapp:v1.0\")\nIf not provided, a unique tag will be generated", + "in": "query", + "name": "tag", "required": false, "schema": { "type": [ @@ -76090,9 +76804,9 @@ } }, { - "name": "health_check_path", - "in": "query", "description": "Optional HTTP health-check path override (e.g. \"/api/healthz\").\nMust start with '/'. When omitted, defaults to \"/\".", + "in": "query", + "name": "health_check_path", "required": false, "schema": { "type": [ @@ -76102,34 +76816,34 @@ } }, { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "202": { - "description": "Image imported and deployment started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoteDeploymentResponse" } } - } + }, + "description": "Image imported and deployment started" }, "400": { "description": "Invalid request or unsupported format" @@ -76154,33 +76868,33 @@ { "bearer_auth": [] } + ], + "summary": "Deploy from an uploaded Docker image tarball", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/deploy/source": { "post": { - "tags": [ - "Deployments" - ], - "summary": "Upload source code and immediately start a preset-based deployment.", "operationId": "deploy_from_uploaded_source", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76196,14 +76910,14 @@ }, "responses": { "202": { - "description": "Source deployment started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoteDeploymentResponse" } } - } + }, + "description": "Source deployment started" }, "400": { "description": "Invalid source archive" @@ -76216,34 +76930,34 @@ { "bearer_auth": [] } + ], + "summary": "Upload source code and immediately start a preset-based deployment.", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/environments/{environment_id}/deploy/static": { "post": { - "tags": [ - "Deployments" - ], - "summary": "Deploy from an uploaded static bundle", "description": "Triggers a deployment using a previously uploaded static file bundle.", "operationId": "deploy_from_static", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76259,14 +76973,14 @@ }, "responses": { "202": { - "description": "Deployment started", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoteDeploymentResponse" } } - } + }, + "description": "Deployment started" }, "400": { "description": "Invalid request" @@ -76288,62 +77002,62 @@ { "bearer_auth": [] } + ], + "summary": "Deploy from an uploaded static bundle", + "tags": [ + "Deployments" ] } }, "/projects/{project_id}/error-alert-rules": { "get": { - "tags": [ - "error-alert-rules" - ], - "summary": "List all alert rules for a project", "operationId": "list_alert_rules", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of alert rules", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/AlertRuleResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of alert rules" }, "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "List all alert rules for a project", "tags": [ "error-alert-rules" - ], - "summary": "Create a new alert rule", + ] + }, + "post": { "operationId": "create_alert_rule", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76359,14 +77073,14 @@ }, "responses": { "201": { - "description": "Alert rule created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertRuleResponse" } } - } + }, + "description": "Alert rule created" }, "400": { "description": "Validation error" @@ -76374,48 +77088,88 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Create a new alert rule", + "tags": [ + "error-alert-rules" + ] } }, "/projects/{project_id}/error-alert-rules/{rule_id}": { - "get": { + "delete": { + "operationId": "delete_alert_rule", + "parameters": [ + { + "description": "Project ID", + "in": "path", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Alert rule ID", + "in": "path", + "name": "rule_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Alert rule deleted" + }, + "404": { + "description": "Alert rule not found" + }, + "500": { + "description": "Internal server error" + } + }, + "summary": "Delete an alert rule", "tags": [ "error-alert-rules" - ], - "summary": "Get a specific alert rule", + ] + }, + "get": { "operationId": "get_alert_rule", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "rule_id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "rule_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Alert rule details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertRuleResponse" } } - } + }, + "description": "Alert rule details" }, "404": { "description": "Alert rule not found" @@ -76423,33 +77177,33 @@ "500": { "description": "Internal server error" } - } - }, - "put": { + }, + "summary": "Get a specific alert rule", "tags": [ "error-alert-rules" - ], - "summary": "Update an existing alert rule", + ] + }, + "put": { "operationId": "update_alert_rule", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "rule_id", - "in": "path", "description": "Alert rule ID", + "in": "path", + "name": "rule_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76465,14 +77219,14 @@ }, "responses": { "200": { - "description": "Alert rule updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertRuleResponse" } } - } + }, + "description": "Alert rule updated" }, "400": { "description": "Validation error" @@ -76483,100 +77237,60 @@ "500": { "description": "Internal server error" } - } - }, - "delete": { + }, + "summary": "Update an existing alert rule", "tags": [ "error-alert-rules" - ], - "summary": "Delete an alert rule", - "operationId": "delete_alert_rule", - "parameters": [ - { - "name": "project_id", - "in": "path", - "description": "Project ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "rule_id", - "in": "path", - "description": "Alert rule ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Alert rule deleted" - }, - "404": { - "description": "Alert rule not found" - }, - "500": { - "description": "Internal server error" - } - } + ] } }, "/projects/{project_id}/error-dashboard-stats": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Get error dashboard statistics", "operationId": "get_error_dashboard_stats", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", "in": "query", + "name": "start_time", "required": true, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "end_time", "in": "query", + "name": "end_time", "required": true, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "environment_id", "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "compare_to_previous", "in": "query", + "name": "compare_to_previous", "required": false, "schema": { "type": [ @@ -76588,62 +77302,62 @@ ], "responses": { "200": { - "description": "Error dashboard statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorDashboardStatsResponse" } } - } + }, + "description": "Error dashboard statistics" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get error dashboard statistics", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-groups": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "List error groups for a project", "operationId": "list_error_groups", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "status", "in": "query", + "name": "status", "required": false, "schema": { "type": [ @@ -76653,44 +77367,44 @@ } }, { - "name": "environment_id", "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_date", "in": "query", + "name": "start_date", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } }, { - "name": "end_date", "in": "query", + "name": "end_date", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -76700,8 +77414,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": "string" @@ -76710,60 +77424,60 @@ ], "responses": { "200": { - "description": "Paginated list of error groups", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedErrorGroupsResponse" } } - } + }, + "description": "Paginated list of error groups" }, "500": { "description": "Internal server error" } - } + }, + "summary": "List error groups for a project", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-groups/{group_id}": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Get a specific error group", "operationId": "get_error_group", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "group_id", - "in": "path", "description": "Error group ID", + "in": "path", + "name": "group_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Error group details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorGroupResponse" } } - } + }, + "description": "Error group details" }, "404": { "description": "Error group not found" @@ -76771,33 +77485,33 @@ "500": { "description": "Internal server error" } - } - }, - "put": { + }, + "summary": "Get a specific error group", "tags": [ "error-tracking" - ], - "summary": "Update error group status", + ] + }, + "put": { "operationId": "update_error_group", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "group_id", - "in": "path", "description": "Error group ID", + "in": "path", + "name": "group_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -76821,68 +77535,68 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Update error group status", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-groups/{group_id}/events": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "List error events for a specific group", "operationId": "list_error_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "group_id", - "in": "path", "description": "Error group ID", + "in": "path", + "name": "group_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Paginated list of error events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedErrorEventsResponse" } } - } + }, + "description": "Paginated list of error events" }, "404": { "description": "Error group not found" @@ -76890,58 +77604,58 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "List error events for a specific group", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-groups/{group_id}/events/{event_id}": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Get a specific error event", "operationId": "get_error_event", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "group_id", - "in": "path", "description": "Error group ID", + "in": "path", + "name": "group_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "event_id", - "in": "path", "description": "Error event ID", + "in": "path", + "name": "event_id", "required": true, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "Error event details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEventResponse" } } - } + }, + "description": "Error event details" }, "404": { "description": "Event not found" @@ -76949,85 +77663,85 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Get a specific error event", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-stats": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Get error statistics for a project", "operationId": "get_error_stats", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Error statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorGroupStatsResponse" } } - } + }, + "description": "Error statistics" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get error statistics for a project", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/error-time-series": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Get error time series data for charts", "operationId": "get_error_time_series", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_time", "in": "query", + "name": "start_time", "required": true, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "end_time", "in": "query", + "name": "end_time", "required": true, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "bucket", - "in": "query", "description": "Time bucket size (e.g., \"1h\", \"15m\", \"1d\", \"1 hour\", \"30 minutes\")", + "in": "query", + "name": "bucket", "required": false, "schema": { "type": "string" @@ -77036,93 +77750,93 @@ ], "responses": { "200": { - "description": "Error time series data", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ErrorTimeSeriesDataResponse" - } + }, + "type": "array" } } - } + }, + "description": "Error time series data" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Get error time series data for charts", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/events": { "get": { - "tags": [ - "Events" - ], - "summary": "Get event counts with filtering", "operationId": "get_events_count", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for filtering events", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering events", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of events to return (default: 20, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "custom_events_only", - "in": "query", "description": "Only return custom events, excluding system events like page_view, page_leave, heartbeat (default: true)", + "in": "query", + "name": "custom_events_only", "required": false, "schema": { "type": "boolean" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors (default: events)", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" @@ -77131,17 +77845,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved event counts", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventCount" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved event counts" }, "400": { "description": "Bad request" @@ -77157,59 +77871,59 @@ { "bearer_auth": [] } + ], + "summary": "Get event counts with filtering", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/breakdown": { "get": { - "tags": [ - "Events" - ], - "summary": "Get event type breakdown", "operationId": "get_event_type_breakdown", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for filtering events", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering events", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors (default: events)", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" @@ -77218,17 +77932,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved event type breakdown", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventTypeBreakdown" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved event type breakdown" }, "400": { "description": "Bad request" @@ -77244,26 +77958,26 @@ { "bearer_auth": [] } + ], + "summary": "Get event type breakdown", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/ingest": { "post": { - "tags": [ - "Events" - ], - "summary": "Record an analytics event via the console API with explicit project ID.", - "description": "The app backend forwards the user's encrypted Temps cookies, so visitor/session\nidentity is resolved automatically by middleware. No geolocation or user-agent\nenrichment is performed \u2014 this is a lightweight server-side ingestion path.", + "description": "The app backend forwards the user's encrypted Temps cookies, so visitor/session\nidentity is resolved automatically by middleware. No geolocation or user-agent\nenrichment is performed — this is a lightweight server-side ingestion path.", "operationId": "record_console_event", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -77298,151 +78012,160 @@ { "bearer_auth": [] } + ], + "summary": "Record an analytics event via the console API with explicit project ID.", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/properties/breakdown": { "get": { - "tags": [ - "Events" - ], - "summary": "Get property breakdown by grouping events by a column", "operationId": "get_property_breakdown", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "group_by", - "in": "query", "description": "Column to group by (channel, device_type, browser, etc.)", + "in": "query", + "name": "group_by", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "event_name", - "in": "query", "description": "Filter by event name", + "in": "query", + "name": "event_name", "required": false, "schema": { "type": "string" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors - default: events", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Maximum number of results (default: 20, max: 100)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "filter_country", + "description": "Include crawler/bot traffic (default: false)", "in": "query", + "name": "include_crawlers", + "required": false, + "schema": { + "type": "boolean" + } + }, + { "description": "Filter by country (for region/city drill-downs)", + "in": "query", + "name": "filter_country", "required": false, "schema": { "type": "string" } }, { - "name": "filter_region", - "in": "query", "description": "Filter by region (for city drill-downs)", + "in": "query", + "name": "filter_region", "required": false, "schema": { "type": "string" } }, { - "name": "filter_browser", - "in": "query", "description": "Filter by browser name (for version drill-downs)", + "in": "query", + "name": "filter_browser", "required": false, "schema": { "type": "string" } }, { - "name": "filter_os", - "in": "query", "description": "Filter by OS name (for version drill-downs)", + "in": "query", + "name": "filter_os", "required": false, "schema": { "type": "string" } }, { - "name": "filter_channel", - "in": "query", "description": "Filter by channel name (for channel drill-downs)", + "in": "query", + "name": "filter_channel", "required": false, "schema": { "type": "string" } }, { - "name": "filter_referrer", - "in": "query", "description": "Filter by referrer hostname (for referrer drill-downs)", + "in": "query", + "name": "filter_referrer", "required": false, "schema": { "type": "string" @@ -77451,14 +78174,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved property breakdown", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PropertyBreakdownResponse" } } - } + }, + "description": "Successfully retrieved property breakdown" }, "400": { "description": "Bad request" @@ -77474,112 +78197,121 @@ { "bearer_auth": [] } + ], + "summary": "Get property breakdown by grouping events by a column", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/properties/timeline": { "get": { - "tags": [ - "Events" - ], - "summary": "Get property timeline by grouping events by a column over time", "operationId": "get_property_timeline", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "group_by", - "in": "query", "description": "Column to group by (channel, device_type, browser, etc.)", + "in": "query", + "name": "group_by", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "event_name", - "in": "query", "description": "Filter by event name", + "in": "query", + "name": "event_name", "required": false, "schema": { "type": "string" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors - default: events", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" } }, { - "name": "bucket_size", - "in": "query", "description": "Time bucket: hour, day, week, month (default: auto-detect)", + "in": "query", + "name": "bucket_size", "required": false, "schema": { "type": "string" } + }, + { + "description": "Include crawler/bot traffic (default: false)", + "in": "query", + "name": "include_crawlers", + "required": false, + "schema": { + "type": "boolean" + } } ], "responses": { "200": { - "description": "Successfully retrieved property timeline", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PropertyTimelineResponse" } } - } + }, + "description": "Successfully retrieved property timeline" }, "400": { "description": "Bad request" @@ -77595,77 +78327,77 @@ { "bearer_auth": [] } + ], + "summary": "Get property timeline by grouping events by a column over time", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/timeline": { "get": { - "tags": [ - "Events" - ], - "summary": "Get events timeline", "operationId": "get_events_timeline", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for filtering events", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering events", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "event_name", - "in": "query", "description": "Filter by specific event name", + "in": "query", + "name": "event_name", "required": false, "schema": { "type": "string" } }, { - "name": "bucket_size", - "in": "query", "description": "Bucket size: hour, day, or week (auto-detected if not specified)", + "in": "query", + "name": "bucket_size", "required": false, "schema": { "type": "string" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events, sessions, or visitors (default: events)", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" @@ -77674,17 +78406,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved events timeline", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventTimeline" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved events timeline" }, "400": { "description": "Bad request" @@ -77700,60 +78432,60 @@ { "bearer_auth": [] } + ], + "summary": "Get events timeline", + "tags": [ + "Events" ] } }, "/projects/{project_id}/events/unique": { "get": { - "tags": [ - "Funnels" - ], - "summary": "Get all unique/distinct event types for a project (paginated)", "operationId": "get_unique_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default: 50, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Unique event types retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EventTypesResponse" } } - } + }, + "description": "Unique event types retrieved successfully" }, "401": { "description": "Unauthorized" @@ -77766,60 +78498,60 @@ { "bearer_auth": [] } + ], + "summary": "Get all unique/distinct event types for a project (paginated)", + "tags": [ + "Funnels" ] } }, "/projects/{project_id}/external-images": { "get": { - "tags": [ - "External Images" - ], - "summary": "List external images for a project", "operationId": "list_remote_external_images", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default: 20)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of external images", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedExternalImagesResponse" } } - } + }, + "description": "List of external images" }, "401": { "description": "Unauthorized" @@ -77835,23 +78567,23 @@ { "bearer_auth": [] } + ], + "summary": "List external images for a project", + "tags": [ + "External Images" ] }, "post": { - "tags": [ - "External Images" - ], - "summary": "Register an external Docker image", "description": "Registers an external Docker image reference without triggering a deployment.\nThe image can be deployed later using the deploy/image endpoint.", "operationId": "register_external_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -77867,14 +78599,14 @@ }, "responses": { "201": { - "description": "Image registered successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImageResponse" } } - } + }, + "description": "Image registered successfully" }, "400": { "description": "Invalid request" @@ -77896,46 +78628,39 @@ { "bearer_auth": [] } + ], + "summary": "Register an external Docker image", + "tags": [ + "External Images" ] } }, "/projects/{project_id}/external-images/{image_id}": { - "get": { - "tags": [ - "External Images" - ], - "summary": "Get details of a specific external image", - "operationId": "get_remote_external_image", + "delete": { + "operationId": "delete_external_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "image_id", "in": "path", + "name": "image_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Image details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExternalImageResponse" - } - } - } + "204": { + "description": "Image deleted" }, "401": { "description": "Unauthorized" @@ -77954,37 +78679,44 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "External Images" ], "summary": "Delete an external image", - "operationId": "delete_external_image", + "tags": [ + "External Images" + ] + }, + "get": { + "operationId": "get_remote_external_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "image_id", "in": "path", + "name": "image_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Image deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalImageResponse" + } + } + }, + "description": "Image details" }, "401": { "description": "Unauthorized" @@ -78003,74 +78735,75 @@ { "bearer_auth": [] } + ], + "summary": "Get details of a specific external image", + "tags": [ + "External Images" ] } }, "/projects/{project_id}/flags": { "get": { - "tags": [ - "Feature Flags" - ], "operationId": "list_flags", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "include_archived", - "in": "query", "description": "Include archived flags. Defaults to false.", + "in": "query", + "name": "include_archived", "required": false, "schema": { "type": "boolean" } }, { - "name": "page", - "in": "query", "description": "1-indexed page number. Defaults to 1.", + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "page_size", - "in": "query", "description": "Items per page. Defaults to 20, capped at 100.", + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } } ], "responses": { "200": { - "description": "Flags listed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagListResponse" } } - } + }, + "description": "Flags listed" }, "401": { "description": "Unauthorized" @@ -78086,22 +78819,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "Feature Flags" ] }, "post": { - "tags": [ - "Feature Flags" - ], "operationId": "create_flag", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -78117,14 +78850,14 @@ }, "responses": { "201": { - "description": "Flag created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagResponse" } } - } + }, + "description": "Flag created" }, "400": { "description": "Validation error" @@ -78146,30 +78879,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Feature Flags" ] } }, "/projects/{project_id}/flags/{key}": { - "get": { - "tags": [ - "Feature Flags" - ], - "operationId": "get_flag", + "delete": { + "operationId": "archive_flag", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Flag key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" @@ -78178,14 +78911,14 @@ ], "responses": { "200": { - "description": "Flag retrieved", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FlagResponse" + "$ref": "#/components/schemas/ArchiveFlagResponse" } } - } + }, + "description": "Flag archived" }, "401": { "description": "Unauthorized" @@ -78204,28 +78937,28 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Feature Flags" - ], - "operationId": "archive_flag", + ] + }, + "get": { + "operationId": "get_flag", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Flag key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" @@ -78234,14 +78967,14 @@ ], "responses": { "200": { - "description": "Flag archived", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchiveFlagResponse" + "$ref": "#/components/schemas/FlagResponse" } } - } + }, + "description": "Flag retrieved" }, "401": { "description": "Unauthorized" @@ -78260,28 +78993,28 @@ { "bearer_auth": [] } + ], + "tags": [ + "Feature Flags" ] }, "patch": { - "tags": [ - "Feature Flags" - ], "operationId": "update_flag", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Flag key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" @@ -78300,14 +79033,14 @@ }, "responses": { "200": { - "description": "Flag updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagResponse" } } - } + }, + "description": "Flag updated" }, "400": { "description": "Validation error" @@ -78329,44 +79062,43 @@ { "bearer_auth": [] } + ], + "tags": [ + "Feature Flags" ] } }, "/projects/{project_id}/flags/{key}/environments/{environment_id}": { "put": { - "tags": [ - "Feature Flags" - ], - "summary": "Set a flag's value in one environment, and/or flip its kill switch.", "operationId": "set_flag_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Flag key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "path", "description": "Environment ID", + "in": "path", + "name": "environment_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -78382,14 +79114,14 @@ }, "responses": { "200": { - "description": "Environment value set", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagEnvironmentResponse" } } - } + }, + "description": "Environment value set" }, "400": { "description": "Validation error" @@ -78411,32 +79143,32 @@ { "bearer_auth": [] } + ], + "summary": "Set a flag's value in one environment, and/or flip its kill switch.", + "tags": [ + "Feature Flags" ] } }, "/projects/{project_id}/flags/{key}/restore": { "post": { - "tags": [ - "Feature Flags" - ], - "summary": "Bring an archived flag back.", "description": "Archiving is otherwise one-way: the key stays reserved so the flag cannot\neven be re-created under the same name, which makes an accidental archive\nunrecoverable through the API.", "operationId": "restore_flag", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "key", - "in": "path", "description": "Flag key", + "in": "path", + "name": "key", "required": true, "schema": { "type": "string" @@ -78445,14 +79177,14 @@ ], "responses": { "200": { - "description": "Flag restored", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FlagResponse" } } - } + }, + "description": "Flag restored" }, "401": { "description": "Unauthorized" @@ -78471,41 +79203,41 @@ { "bearer_auth": [] } + ], + "summary": "Bring an archived flag back.", + "tags": [ + "Feature Flags" ] } }, "/projects/{project_id}/funnels": { "get": { - "tags": [ - "Funnels" - ], - "summary": "List all funnels for a project", "operationId": "list_funnels", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Funnels retrieved successfully", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/FunnelResponse" - } + }, + "type": "array" } } - } + }, + "description": "Funnels retrieved successfully" }, "401": { "description": "Unauthorized" @@ -78518,23 +79250,23 @@ { "bearer_auth": [] } + ], + "summary": "List all funnels for a project", + "tags": [ + "Funnels" ] }, "post": { - "tags": [ - "Funnels" - ], - "summary": "Create a new funnel", "operationId": "create_funnel", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -78550,14 +79282,14 @@ }, "responses": { "201": { - "description": "Funnel created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateFunnelResponse" } } - } + }, + "description": "Funnel created successfully" }, "400": { "description": "Bad request" @@ -78573,25 +79305,25 @@ { "bearer_auth": [] } + ], + "summary": "Create a new funnel", + "tags": [ + "Funnels" ] } }, "/projects/{project_id}/funnels/preview": { "post": { - "tags": [ - "Funnels" - ], - "summary": "Preview funnel metrics without creating the funnel", "operationId": "preview_funnel_metrics", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -78607,14 +79339,14 @@ }, "responses": { "200": { - "description": "Funnel metrics preview", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FunnelMetricsResponse" } } - } + }, + "description": "Funnel metrics preview" }, "400": { "description": "Bad request" @@ -78630,54 +79362,41 @@ { "bearer_auth": [] } + ], + "summary": "Preview funnel metrics without creating the funnel", + "tags": [ + "Funnels" ] } }, "/projects/{project_id}/funnels/{funnel_id}": { - "put": { - "tags": [ - "Funnels" - ], - "summary": "Update a funnel", - "operationId": "update_funnel", + "delete": { + "operationId": "delete_funnel", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "funnel_id", - "in": "path", "description": "Funnel ID", + "in": "path", + "name": "funnel_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateFunnelRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Funnel updated successfully" - }, - "400": { - "description": "Bad request" + "description": "Funnel deleted successfully" }, "401": { "description": "Unauthorized" @@ -78693,39 +79412,52 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Funnels" ], "summary": "Delete a funnel", - "operationId": "delete_funnel", + "tags": [ + "Funnels" + ] + }, + "put": { + "operationId": "update_funnel", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "funnel_id", - "in": "path", "description": "Funnel ID", + "in": "path", + "name": "funnel_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateFunnelRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "Funnel deleted successfully" + "description": "Funnel updated successfully" + }, + "400": { + "description": "Bad request" }, "401": { "description": "Unauthorized" @@ -78741,69 +79473,69 @@ { "bearer_auth": [] } + ], + "summary": "Update a funnel", + "tags": [ + "Funnels" ] } }, "/projects/{project_id}/funnels/{funnel_id}/metrics": { "get": { - "tags": [ - "Funnels" - ], - "summary": "Get funnel metrics", "operationId": "get_funnel_metrics", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "funnel_id", - "in": "path", "description": "Funnel ID", + "in": "path", + "name": "funnel_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID filter", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "country_code", - "in": "query", "description": "Country code filter", + "in": "query", + "name": "country_code", "required": false, "schema": { "type": "string" } }, { - "name": "start_date", - "in": "query", "description": "Start date filter (ISO 8601)", + "in": "query", + "name": "start_date", "required": false, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date filter (ISO 8601)", + "in": "query", + "name": "end_date", "required": false, "schema": { "type": "string" @@ -78812,14 +79544,14 @@ ], "responses": { "200": { - "description": "Funnel metrics retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FunnelMetricsResponse" } } - } + }, + "description": "Funnel metrics retrieved successfully" }, "400": { "description": "Bad request" @@ -78838,25 +79570,25 @@ { "bearer_auth": [] } + ], + "summary": "Get funnel metrics", + "tags": [ + "Funnels" ] } }, "/projects/{project_id}/git": { "post": { - "tags": [ - "Projects" - ], - "summary": "Update git settings for a project", "operationId": "update_git_settings", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -78872,14 +79604,14 @@ }, "responses": { "200": { - "description": "Git settings updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Git settings updated successfully" }, "400": { "description": "Invalid git configuration or branch does not exist" @@ -78901,39 +79633,39 @@ { "bearer_auth": [] } + ], + "summary": "Update git settings for a project", + "tags": [ + "Projects" ] } }, "/projects/{project_id}/gitlab/reinstall-webhook": { "post": { - "tags": [ - "Projects" - ], - "summary": "Reinstall the GitLab webhook for a project", "description": "Removes the existing webhook (if any) and installs a fresh one.\nUse this when a webhook has been manually deleted on the GitLab side\nand automatic deployments have stopped working.", "operationId": "reinstall_gitlab_webhook", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Webhook reinstalled", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReinstallWebhookResponse" } } - } + }, + "description": "Webhook reinstalled" }, "400": { "description": "Project is not connected to a GitLab repository" @@ -78955,74 +79687,74 @@ { "bearer_auth": [] } + ], + "summary": "Reinstall the GitLab webhook for a project", + "tags": [ + "Projects" ] } }, "/projects/{project_id}/has-error-groups": { "get": { - "tags": [ - "error-tracking" - ], - "summary": "Check if project has any error groups", "operationId": "has_error_groups", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Error groups existence check", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HasErrorGroupsResponse" } } - } + }, + "description": "Error groups existence check" }, "500": { "description": "Internal server error" } - } + }, + "summary": "Check if project has any error groups", + "tags": [ + "error-tracking" + ] } }, "/projects/{project_id}/has-events": { "get": { - "tags": [ - "Events" - ], - "summary": "Check if project has any analytics events", "operationId": "has_analytics_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully checked for events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HasEventsResponse" } } - } + }, + "description": "Successfully checked for events" }, "401": { "description": "Unauthorized" @@ -79035,59 +79767,59 @@ { "bearer_auth": [] } + ], + "summary": "Check if project has any analytics events", + "tags": [ + "Events" ] } }, "/projects/{project_id}/hourly-visits": { "get": { - "tags": [ - "Events" - ], - "summary": "Get hourly visits", "operationId": "get_hourly_visits", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date for filtering visits", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering visits", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "aggregation_level", - "in": "query", "description": "Aggregation level: events (page views), sessions (unique sessions), or visitors (unique visitors) - default: events", + "in": "query", + "name": "aggregation_level", "required": false, "schema": { "type": "string" @@ -79096,17 +79828,17 @@ ], "responses": { "200": { - "description": "Successfully retrieved hourly visits", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventTimeline" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved hourly visits" }, "400": { "description": "Bad request" @@ -79122,40 +79854,40 @@ { "bearer_auth": [] } + ], + "summary": "Get hourly visits", + "tags": [ + "Events" ] } }, "/projects/{project_id}/images": { "get": { - "tags": [ - "External Images" - ], - "summary": "List all external images for a project", "operationId": "list_external_images", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of external images", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/PushedExternalImageResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of external images" }, "401": { "description": "Unauthorized" @@ -79171,24 +79903,24 @@ { "bearer_auth": [] } + ], + "summary": "List all external images for a project", + "tags": [ + "External Images" ] } }, "/projects/{project_id}/images/push": { "post": { - "tags": [ - "External Images" - ], - "summary": "Push an external Docker image", "operationId": "push_external_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -79204,14 +79936,14 @@ }, "responses": { "201": { - "description": "Image pushed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PushedExternalImageResponse" } } - } + }, + "description": "Image pushed successfully" }, "400": { "description": "Invalid request" @@ -79230,29 +79962,29 @@ { "bearer_auth": [] } + ], + "summary": "Push an external Docker image", + "tags": [ + "External Images" ] } }, "/projects/{project_id}/images/{image_id}": { "get": { - "tags": [ - "External Images" - ], - "summary": "Get details of a specific external image", "operationId": "get_external_image", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "image_id", "in": "path", + "name": "image_id", "required": true, "schema": { "type": "string" @@ -79261,14 +79993,14 @@ ], "responses": { "200": { - "description": "Image details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PushedExternalImageResponse" } } - } + }, + "description": "Image details" }, "401": { "description": "Unauthorized" @@ -79287,66 +80019,66 @@ { "bearer_auth": [] } + ], + "summary": "Get details of a specific external image", + "tags": [ + "External Images" ] } }, "/projects/{project_id}/incidents": { "get": { - "tags": [ - "Status Page" - ], - "summary": "List incidents for a project", "operationId": "list_incidents", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "status", - "in": "query", "description": "Filter by status", + "in": "query", + "name": "status", "required": false, "schema": { "type": "string" } }, { - "name": "page", - "in": "query", "description": "Page number", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], @@ -79368,23 +80100,23 @@ { "bearer_auth": [] } + ], + "summary": "List incidents for a project", + "tags": [ + "Status Page" ] }, "post": { - "tags": [ - "Status Page" - ], - "summary": "Create a new incident", "operationId": "create_incident", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -79400,14 +80132,14 @@ }, "responses": { "201": { - "description": "Incident created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" } } - } + }, + "description": "Incident created successfully" }, "400": { "description": "Invalid request" @@ -79426,59 +80158,59 @@ { "bearer_auth": [] } + ], + "summary": "Create a new incident", + "tags": [ + "Status Page" ] } }, "/projects/{project_id}/incidents/bucketed": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get bucketed incident data for a project", "operationId": "get_bucketed_incidents", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "interval", - "in": "query", "description": "Bucket interval: '5min', 'hourly', or 'daily' (default: hourly)", + "in": "query", + "name": "interval", "required": false, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601) (default: 7 days ago)", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": "string" } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601) (default: now)", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": "string" @@ -79487,14 +80219,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved bucketed incident data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentBucketedResponse" } } - } + }, + "description": "Successfully retrieved bucketed incident data" }, "400": { "description": "Invalid parameters" @@ -79513,25 +80245,25 @@ { "bearer_auth": [] } + ], + "summary": "Get bucketed incident data for a project", + "tags": [ + "Status Page" ] } }, "/projects/{project_id}/logs": { "delete": { - "tags": [ - "Logs" - ], - "summary": "Purge all logs for a project before a given timestamp", "operationId": "purge_project_logs", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -79550,81 +80282,82 @@ "description": "Purge completed" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Purge all logs for a project before a given timestamp", + "tags": [ + "Logs" ] } }, "/projects/{project_id}/mcp-servers": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_mcps", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListMcpsResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -79634,22 +80367,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "post": { - "tags": [ - "Agents" - ], "operationId": "create_mcp", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -79665,14 +80398,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -79682,30 +80415,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/mcp-servers/{slug}": { - "get": { - "tags": [ - "Agents" - ], - "operationId": "get_mcp", + "delete": { + "operationId": "delete_mcp", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -79713,15 +80446,8 @@ } ], "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/McpDefinitionResponse" - } - } - } + "204": { + "description": "MCP server deleted" }, "401": { "description": "Unauthorized" @@ -79734,54 +80460,44 @@ { "bearer_auth": [] } - ] - }, - "put": { + ], "tags": [ "Agents" - ], - "operationId": "update_mcp", + ] + }, + "get": { + "operationId": "get_mcp", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMcpRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -79794,37 +80510,54 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Agents" - ], - "operationId": "delete_mcp", + ] + }, + "put": { + "operationId": "update_mcp", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMcpRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "MCP server deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/McpDefinitionResponse" + } + } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -79837,39 +80570,39 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/mcp-servers/{slug}/config/{field}": { "get": { - "tags": [ - "Agents" - ], "operationId": "reveal_mcp_config", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } }, { - "name": "field", - "in": "path", "description": "Sensitive field path, such as url or env.API_TOKEN", + "in": "path", + "name": "field", "required": true, "schema": { "type": "string" @@ -79878,14 +80611,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SensitiveMcpConfigValueResponse" } } - } + }, + "description": "" }, "400": { "description": "Field is not revealable" @@ -79907,51 +80640,50 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/monitors": { "get": { - "tags": [ - "Status Page" - ], - "summary": "List monitors for a project", "operationId": "list_monitors", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved monitors", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/MonitorResponse" - } + }, + "type": "array" } } - } + }, + "description": "Successfully retrieved monitors" }, "401": { "description": "Unauthorized" @@ -79967,23 +80699,23 @@ { "bearer_auth": [] } + ], + "summary": "List monitors for a project", + "tags": [ + "Status Page" ] }, "post": { - "tags": [ - "Status Page" - ], - "summary": "Create a new monitor", "operationId": "create_monitor", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -79999,14 +80731,14 @@ }, "responses": { "201": { - "description": "Monitor created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MonitorResponse" } } - } + }, + "description": "Monitor created successfully" }, "400": { "description": "Invalid request" @@ -80025,99 +80757,99 @@ { "bearer_auth": [] } + ], + "summary": "Create a new monitor", + "tags": [ + "Status Page" ] } }, "/projects/{project_id}/observe/events": { "get": { - "tags": [ - "Observability" - ], - "summary": "List a merged page of observability events for a project.", - "description": "Each row carries everything the side panel needs to render \u2014 no\nfollow-up fetch is required for the common case. Heavy fields\n(stacktraces, headers, span attributes) are truncated server-side and\nexpose a `*_truncated` flag; clients fetch the full row from the\n`/full` endpoint only when the user explicitly clicks \"Show full\".", + "description": "Each row carries everything the side panel needs to render — no\nfollow-up fetch is required for the common case. Heavy fields\n(stacktraces, headers, span attributes) are truncated server-side and\nexpose a `*_truncated` flag; clients fetch the full row from the\n`/full` endpoint only when the user explicitly clicks \"Show full\".", "operationId": "observability_list_events", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "kinds", - "in": "query", "description": "Comma-separated kinds: `log,request,span,error,revenue`. Empty or\nmissing returns every kind.", + "in": "query", + "name": "kinds", "required": false, "schema": { "type": "string" } }, { - "name": "from", - "in": "query", "description": "Inclusive lower bound on event timestamp (ISO 8601, `Z` suffix).", + "in": "query", + "name": "from", "required": false, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "to", - "in": "query", "description": "Inclusive upper bound on event timestamp.", + "in": "query", + "name": "to", "required": false, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } }, { - "name": "deployment_id", "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "search", - "in": "query", "description": "Free-text substring matched against per-kind summary fields\n(request path / error class / revenue event_type).", + "in": "query", + "name": "search", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Page size (default 50, max 200).", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "hide_bots", - "in": "query", "description": "When `true`, exclude bot/crawler request rows. When `false`, only\ninclude bot rows. Omitted means \"include everything\" (default).\nOnly affects the `Request` kind.", + "in": "query", + "name": "hide_bots", "required": false, "schema": { "type": "boolean" @@ -80126,191 +80858,191 @@ ], "responses": { "200": { - "description": "Merged event page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EventsResponse" } } - } + }, + "description": "Merged event page" }, "400": { - "description": "Invalid filter (kinds, time range, \u2026)", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Invalid filter (kinds, time range, …)" }, "401": { - "description": "Unauthorized", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List a merged page of observability events for a project.", + "tags": [ + "Observability" ] } }, "/projects/{project_id}/observe/events/{kind}/{event_id}/full": { "get": { - "tags": [ - "Observability" - ], - "summary": "Fetch the un-truncated form of one event by `(kind, id)`. Side panel\n\"Show full\" action calls this \u2014 the list response carries truncated\npreviews + a `*_truncated` flag to let the UI decide whether to fetch.", "operationId": "observability_full_event", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "kind", - "in": "path", "description": "Event kind discriminator", + "in": "path", + "name": "kind", "required": true, "schema": { "$ref": "#/components/schemas/EventKind" } }, { - "name": "event_id", - "in": "path", "description": "Per-kind identity: request_id for requests, `{trace_id}:{span_id}` for spans, serial id for errors/revenue", + "in": "path", + "name": "event_id", "required": true, "schema": { "type": "string" } }, { - "name": "ts", - "in": "query", "description": "The row's event timestamp as returned by the list endpoint. Optional,\nbut strongly recommended: it bounds the lookup to the storage\npartitions/chunks around that instant instead of scanning the whole\nretention window.", + "in": "query", + "name": "ts", "required": false, "schema": { - "type": "string", - "format": "date-time" + "format": "date-time", + "type": "string" } } ], "responses": { "200": { - "description": "Full row", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FullEvent" } } - } + }, + "description": "Full row" }, "401": { - "description": "Unauthorized", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Event not found in project", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Event not found in project" }, "500": { - "description": "Internal server error", "content": { "text/plain": { "schema": { "type": "string" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Fetch the un-truncated form of one event by `(kind, id)`. Side panel\n\"Show full\" action calls this — the list response carries truncated\npreviews + a `*_truncated` flag to let the UI decide whether to fetch.", + "tags": [ + "Observability" ] } }, "/projects/{project_id}/releases/{release}/source-files": { - "get": { - "tags": [ - "source-maps" - ], - "summary": "List uploaded source files for a release (metadata only).", - "operationId": "list_source_files", + "delete": { + "operationId": "delete_release_source_files", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80319,14 +81051,14 @@ ], "responses": { "200": { - "description": "List of source files", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SourceFileListResponse" + "$ref": "#/components/schemas/DeleteResponse" } } - } + }, + "description": "Source files deleted" }, "401": { "description": "Unauthorized" @@ -80339,30 +81071,29 @@ { "bearer_auth": [] } - ] - }, - "post": { + ], + "summary": "Delete all uploaded source files for a release.", "tags": [ "source-maps" - ], - "summary": "Upload a raw source file for a release (native symbolication).", - "description": "Accepts a multipart form with:\n- `file`: the source file bytes (required)\n- `file_path`: the path of the file as it appears in stack frames (required;\n derived from the uploaded filename if omitted). Normalized with the `~`\n prefix convention, matching source-map storage.\n\nRequires the project's `error_source_context_enabled` toggle to be on.\nUpserts on (project, release, file_path).", - "operationId": "upload_source_file", + ] + }, + "get": { + "operationId": "list_source_files", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80370,59 +81101,51 @@ } ], "responses": { - "201": { - "description": "Source file uploaded", + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SourceFileResponse" + "$ref": "#/components/schemas/SourceFileListResponse" } } - } - }, - "400": { - "description": "Missing fields" + }, + "description": "List of source files" }, "401": { "description": "Unauthorized" }, "403": { "description": "Insufficient permissions" - }, - "409": { - "description": "Source context disabled for project" - }, - "413": { - "description": "Source file too large" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "List uploaded source files for a release (metadata only).", "tags": [ "source-maps" - ], - "summary": "Delete all uploaded source files for a release.", - "operationId": "delete_release_source_files", + ] + }, + "post": { + "description": "Accepts a multipart form with:\n- `file`: the source file bytes (required)\n- `file_path`: the path of the file as it appears in stack frames (required;\n derived from the uploaded filename if omitted). Normalized with the `~`\n prefix convention, matching source-map storage.\n\nRequires the project's `error_source_context_enabled` toggle to be on.\nUpserts on (project, release, file_path).", + "operationId": "upload_source_file", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80430,52 +81153,61 @@ } ], "responses": { - "200": { - "description": "Source files deleted", + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteResponse" + "$ref": "#/components/schemas/SourceFileResponse" } } - } + }, + "description": "Source file uploaded" + }, + "400": { + "description": "Missing fields" }, "401": { "description": "Unauthorized" }, "403": { "description": "Insufficient permissions" + }, + "409": { + "description": "Source context disabled for project" + }, + "413": { + "description": "Source file too large" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Upload a raw source file for a release (native symbolication).", + "tags": [ + "source-maps" ] } }, "/projects/{project_id}/releases/{release}/source-maps": { - "get": { - "tags": [ - "source-maps" - ], - "summary": "List all source maps for a specific release", - "operationId": "list_source_maps", + "delete": { + "operationId": "delete_release_source_maps", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80484,14 +81216,14 @@ ], "responses": { "200": { - "description": "List of source maps", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SourceMapListResponse" + "$ref": "#/components/schemas/DeleteResponse" } } - } + }, + "description": "Source maps deleted" }, "401": { "description": "Unauthorized" @@ -80504,30 +81236,29 @@ { "bearer_auth": [] } - ] - }, - "post": { + ], + "summary": "Delete all source maps for a specific release", "tags": [ "source-maps" - ], - "summary": "Upload a source map for a release.", - "description": "Accepts a multipart form with:\n- `file`: The .map file (required)\n- `file_path`: The URL path of the minified file as it appears in stack traces (required).\n Uses the ~ prefix convention (e.g., \"~/assets/main.js\").\n If a full URL is provided, it will be normalized automatically.\n- `dist`: Optional distribution identifier\n\nIf a source map already exists for the same (project, release, file_path), it is replaced.", - "operationId": "upload_source_map", + ] + }, + "get": { + "operationId": "list_source_maps", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80535,56 +81266,51 @@ } ], "responses": { - "201": { - "description": "Source map uploaded", + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SourceMapResponse" + "$ref": "#/components/schemas/SourceMapListResponse" } } - } - }, - "400": { - "description": "Invalid source map or missing fields" + }, + "description": "List of source maps" }, "401": { "description": "Unauthorized" }, "403": { "description": "Insufficient permissions" - }, - "413": { - "description": "Source map too large" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "List all source maps for a specific release", "tags": [ "source-maps" - ], - "summary": "Delete all source maps for a specific release", - "operationId": "delete_release_source_maps", + ] + }, + "post": { + "description": "Accepts a multipart form with:\n- `file`: The .map file (required)\n- `file_path`: The URL path of the minified file as it appears in stack traces (required).\n Uses the ~ prefix convention (e.g., \"~/assets/main.js\").\n If a full URL is provided, it will be normalized automatically.\n- `dist`: Optional distribution identifier\n\nIf a source map already exists for the same (project, release, file_path), it is replaced.", + "operationId": "upload_source_map", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "release", - "in": "path", "description": "Release version", + "in": "path", + "name": "release", "required": true, "schema": { "type": "string" @@ -80592,124 +81318,130 @@ } ], "responses": { - "200": { - "description": "Source maps deleted", + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteResponse" + "$ref": "#/components/schemas/SourceMapResponse" } } - } + }, + "description": "Source map uploaded" + }, + "400": { + "description": "Invalid source map or missing fields" }, "401": { "description": "Unauthorized" }, "403": { "description": "Insufficient permissions" + }, + "413": { + "description": "Source map too large" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Upload a source map for a release.", + "tags": [ + "source-maps" ] } }, "/projects/{project_id}/revenue/events": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Recent ingested events for the activity feed.", "operationId": "revenue_recent_events", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/RecentEventResponse" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Recent ingested events for the activity feed.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations": { "get": { - "tags": [ - "Revenue" - ], - "summary": "List revenue integrations for a project.", "operationId": "revenue_list_integrations", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/IntegrationResponse" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List revenue integrations for a project.", + "tags": [ + "Revenue" ] }, "post": { - "tags": [ - "Revenue" - ], - "summary": "Create a new revenue integration. Response contains the generated\nwebhook path that the user must paste into their provider's dashboard.", "operationId": "revenue_create_integration", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -80725,14 +81457,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IntegrationResponse" } } - } + }, + "description": "" }, "400": { "description": "Validation error" @@ -80745,33 +81477,33 @@ { "bearer_auth": [] } + ], + "summary": "Create a new revenue integration. Response contains the generated\nwebhook path that the user must paste into their provider's dashboard.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}": { "delete": { - "tags": [ - "Revenue" - ], - "summary": "Delete a revenue integration (permanent \u2014 use rotate_token to refresh\ncredentials without breaking history).", "operationId": "revenue_delete_integration", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -80784,33 +81516,33 @@ { "bearer_auth": [] } + ], + "summary": "Delete a revenue integration (permanent — use rotate_token to refresh\ncredentials without breaking history).", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}/config": { "post": { - "tags": [ - "Revenue" - ], - "summary": "Replace the typed provider config on an integration. Passing `null`\nclears the config back to the accept-everything default. The config's\nprovider tag must match the integration's provider.", "operationId": "revenue_update_config", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -80826,14 +81558,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IntegrationResponse" } } - } + }, + "description": "" }, "400": { "description": "Validation error" @@ -80846,46 +81578,46 @@ { "bearer_auth": [] } + ], + "summary": "Replace the typed provider config on an integration. Passing `null`\nclears the config back to the accept-everything default. The config's\nprovider tag must match the integration's provider.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}/import/invoices": { "post": { - "tags": [ - "Revenue" - ], - "summary": "Import a Stripe invoices CSV export. Each paid invoice becomes an\n`invoice.paid` event so historical MRR/charge totals populate the\ntimeseries. Ingestion is idempotent: re-uploading the same file is a\nno-op.", "operationId": "revenue_import_invoices_csv", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ImportOutcomeResponse" } } - } + }, + "description": "" }, "400": { "description": "Malformed CSV or wrong provider" @@ -80901,46 +81633,46 @@ { "bearer_auth": [] } + ], + "summary": "Import a Stripe invoices CSV export. Each paid invoice becomes an\n`invoice.paid` event so historical MRR/charge totals populate the\ntimeseries. Ingestion is idempotent: re-uploading the same file is a\nno-op.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}/import/subscriptions": { "post": { - "tags": [ - "Revenue" - ], - "summary": "Import a Stripe subscriptions CSV export. Use this to backfill MRR /\nactive subscriptions when migrating from Stripe without providing\nAPI keys. Webhooks remain the source of truth for live updates \u2014\nCSV rows never overwrite newer webhook state.", "operationId": "revenue_import_subscriptions_csv", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ImportOutcomeResponse" } } - } + }, + "description": "" }, "400": { "description": "Malformed CSV or wrong provider" @@ -80956,79 +81688,79 @@ { "bearer_auth": [] } + ], + "summary": "Import a Stripe subscriptions CSV export. Use this to backfill MRR /\nactive subscriptions when migrating from Stripe without providing\nAPI keys. Webhooks remain the source of truth for live updates —\nCSV rows never overwrite newer webhook state.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}/rotate-token": { "post": { - "tags": [ - "Revenue" - ], - "summary": "Rotate the webhook path token. Returns the new integration state \u2014\nthe user must paste the new URL into their provider's dashboard.", "operationId": "revenue_rotate_token", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IntegrationResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Rotate the webhook path token. Returns the new integration state —\nthe user must paste the new URL into their provider's dashboard.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/integrations/{integration_id}/update-secret": { "post": { - "tags": [ - "Revenue" - ], - "summary": "Replace the stored signing secret without rotating the webhook URL.\nUse this after rotating the secret in the provider's dashboard.", "operationId": "revenue_update_secret", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "integration_id", "in": "path", + "name": "integration_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81044,14 +81776,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IntegrationResponse" } } - } + }, + "description": "" }, "400": { "description": "Validation error" @@ -81064,168 +81796,168 @@ { "bearer_auth": [] } + ], + "summary": "Replace the stored signing secret without rotating the webhook URL.\nUse this after rotating the secret in the provider's dashboard.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/metrics/customers": { "get": { - "tags": [ - "Revenue" - ], - "summary": "New + churned customers per bucket.", "operationId": "revenue_metrics_customers", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/CustomerMovementResponse" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "New + churned customers per bucket.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/metrics/mrr": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Bucketed MRR timeseries for the revenue chart.", "operationId": "revenue_metrics_mrr", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/MrrBucketResponse" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Bucketed MRR timeseries for the revenue chart.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/revenue/metrics/summary": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Current MRR / ARR / churn / ARPU for a project, in one currency.", "operationId": "revenue_metrics_summary", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MetricsSummaryResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Current MRR / ARR / churn / ARPU for a project, in one currency.", + "tags": [ + "Revenue" ] } }, "/projects/{project_id}/secrets": { "get": { - "tags": [ - "Secrets" - ], - "summary": "List project secrets (metadata only \u2014 values never returned).", "operationId": "listProjectSecrets", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Optional environment filter", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of secrets (metadata only, no values)", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectSecretResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of secrets (metadata only, no values)" }, "404": { "description": "Project not found" @@ -81233,23 +81965,23 @@ "500": { "description": "Internal server error" } - } - }, - "post": { + }, + "summary": "List project secrets (metadata only — values never returned).", "tags": [ "Secrets" - ], - "summary": "Create a new secret. The value is encrypted before storage and will be\nmounted as a file at `/run/secrets/` on the next deployment.\nThe plaintext value is NOT returned \u2014 the response carries only metadata.", + ] + }, + "post": { "operationId": "createProjectSecret", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81265,14 +81997,14 @@ }, "responses": { "201": { - "description": "Secret created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectSecretResponse" } } - } + }, + "description": "Secret created" }, "400": { "description": "Invalid key or value too large" @@ -81283,35 +82015,75 @@ "500": { "description": "Internal server error" } - } + }, + "summary": "Create a new secret. The value is encrypted before storage and will be\nmounted as a file at `/run/secrets/` on the next deployment.\nThe plaintext value is NOT returned — the response carries only metadata.", + "tags": [ + "Secrets" + ] } }, "/projects/{project_id}/secrets/{secret_id}": { - "put": { + "delete": { + "operationId": "deleteProjectSecret", + "parameters": [ + { + "description": "Project ID", + "in": "path", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Secret ID", + "in": "path", + "name": "secret_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "204": { + "description": "Secret deleted" + }, + "404": { + "description": "Secret not found" + }, + "500": { + "description": "Internal server error" + } + }, + "summary": "Delete a project secret. Running containers keep their mounted secret files\nuntil they are redeployed.", "tags": [ "Secrets" - ], - "summary": "Update a project secret. Value rotation requires a redeploy to take effect \u2014\nrunning containers keep their currently-mounted values until the next\ndeployment.", + ] + }, + "put": { "operationId": "updateProjectSecret", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "secret_id", - "in": "path", "description": "Secret ID", + "in": "path", + "name": "secret_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81327,14 +82099,14 @@ }, "responses": { "200": { - "description": "Secret updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectSecretResponse" } } - } + }, + "description": "Secret updated" }, "400": { "description": "Value too large" @@ -81345,65 +82117,25 @@ "500": { "description": "Internal server error" } - } - }, - "delete": { + }, + "summary": "Update a project secret. Value rotation requires a redeploy to take effect —\nrunning containers keep their currently-mounted values until the next\ndeployment.", "tags": [ "Secrets" - ], - "summary": "Delete a project secret. Running containers keep their mounted secret files\nuntil they are redeployed.", - "operationId": "deleteProjectSecret", - "parameters": [ - { - "name": "project_id", - "in": "path", - "description": "Project ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "secret_id", - "in": "path", - "description": "Secret ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "204": { - "description": "Secret deleted" - }, - "404": { - "description": "Secret not found" - }, - "500": { - "description": "Internal server error" - } - } + ] } }, "/projects/{project_id}/settings": { "post": { - "tags": [ - "Projects" - ], - "summary": "Update project settings", "operationId": "update_project_settings", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81419,14 +82151,14 @@ }, "responses": { "200": { - "description": "Project settings updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectResponse" } } - } + }, + "description": "Project settings updated successfully" }, "401": { "description": "Unauthorized" @@ -81445,37 +82177,38 @@ { "bearer_auth": [] } + ], + "summary": "Update project settings", + "tags": [ + "Projects" ] } }, "/projects/{project_id}/skills": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_skills", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListSkillsResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -81485,22 +82218,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "post": { - "tags": [ - "Agents" - ], "operationId": "create_skill", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81516,14 +82249,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -81533,25 +82266,24 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/projects/{project_id}/skills/upload": { "post": { - "tags": [ - "Agents" - ], - "summary": "Upload a skill with an archive (tar.gz) \u2014 project-scoped.", "operationId": "upload_skill", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81567,14 +82299,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -81584,30 +82316,74 @@ { "bearer_auth": [] } + ], + "summary": "Upload a skill with an archive (tar.gz) — project-scoped.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/skills/{slug}": { - "get": { + "delete": { + "operationId": "delete_skill", + "parameters": [ + { + "description": "Project ID", + "in": "path", + "name": "project_id", + "required": true, + "schema": { + "format": "int32", + "type": "integer" + } + }, + { + "description": "Skill slug", + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Skill deleted" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Skill not found" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "Agents" - ], + ] + }, + "get": { "operationId": "get_skill", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -81616,14 +82392,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -81636,28 +82412,28 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "put": { - "tags": [ - "Agents" - ], "operationId": "update_skill", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -81676,14 +82452,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -81696,74 +82472,30 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Agents" - ], - "operationId": "delete_skill", - "parameters": [ - { - "name": "project_id", - "in": "path", - "description": "Project ID", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "slug", - "in": "path", - "description": "Skill slug", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Skill deleted" - }, - "401": { - "description": "Unauthorized" - }, - "404": { - "description": "Skill not found" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/projects/{project_id}/skills/{slug}/archive": { "get": { - "tags": [ - "Agents" - ], - "summary": "Download a skill's archive (tar.gz) \u2014 project-scoped.", "operationId": "download_skill_archive", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -81772,10 +82504,10 @@ ], "responses": { "200": { - "description": "Skill archive tar.gz", "content": { "application/gzip": {} - } + }, + "description": "Skill archive tar.gz" }, "401": { "description": "Unauthorized" @@ -81788,38 +82520,38 @@ { "bearer_auth": [] } + ], + "summary": "Download a skill's archive (tar.gz) — project-scoped.", + "tags": [ + "Agents" ] } }, "/projects/{project_id}/source-map-releases": { "get": { - "tags": [ - "source-maps" - ], - "summary": "List all releases that have source maps for a project", "operationId": "list_releases", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of releases", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReleaseListResponse" } } - } + }, + "description": "List of releases" }, "401": { "description": "Unauthorized" @@ -81832,35 +82564,35 @@ { "bearer_auth": [] } + ], + "summary": "List all releases that have source maps for a project", + "tags": [ + "source-maps" ] } }, "/projects/{project_id}/source-maps/{source_map_id}": { "delete": { - "tags": [ - "source-maps" - ], - "summary": "Delete a specific source map by ID", "operationId": "delete_source_map", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "source_map_id", - "in": "path", "description": "Source map ID", + "in": "path", + "name": "source_map_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -81882,60 +82614,60 @@ { "bearer_auth": [] } + ], + "summary": "Delete a specific source map by ID", + "tags": [ + "source-maps" ] } }, "/projects/{project_id}/static-bundles": { "get": { - "tags": [ - "Static Bundles" - ], - "summary": "List static bundles for a project", "operationId": "list_static_bundles", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default: 20)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of static bundles", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedStaticBundlesResponse" } } - } + }, + "description": "List of static bundles" }, "401": { "description": "Unauthorized" @@ -81951,46 +82683,39 @@ { "bearer_auth": [] } + ], + "summary": "List static bundles for a project", + "tags": [ + "Static Bundles" ] } }, "/projects/{project_id}/static-bundles/{bundle_id}": { - "get": { - "tags": [ - "Static Bundles" - ], - "summary": "Get details of a specific static bundle", - "operationId": "get_static_bundle", + "delete": { + "operationId": "delete_static_bundle", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "bundle_id", "in": "path", + "name": "bundle_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Bundle details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StaticBundleResponse" - } - } - } + "204": { + "description": "Bundle deleted" }, "401": { "description": "Unauthorized" @@ -82009,37 +82734,44 @@ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Static Bundles" ], "summary": "Delete a static bundle", - "operationId": "delete_static_bundle", + "tags": [ + "Static Bundles" + ] + }, + "get": { + "operationId": "get_static_bundle", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "bundle_id", "in": "path", + "name": "bundle_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Bundle deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StaticBundleResponse" + } + } + }, + "description": "Bundle details" }, "401": { "description": "Unauthorized" @@ -82058,48 +82790,48 @@ { "bearer_auth": [] } + ], + "summary": "Get details of a specific static bundle", + "tags": [ + "Static Bundles" ] } }, "/projects/{project_id}/status": { "get": { - "tags": [ - "Status Page" - ], - "summary": "Get status page overview", "operationId": "get_status_overview", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved status overview", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusPageOverview" } } - } + }, + "description": "Successfully retrieved status overview" }, "401": { "description": "Unauthorized" @@ -82115,69 +82847,69 @@ { "bearer_auth": [] } + ], + "summary": "Get status page overview", + "tags": [ + "Status Page" ] } }, "/projects/{project_id}/unique-counts": { "get": { - "tags": [ - "Events" - ], - "summary": "Get unique counts over time frame", "operationId": "get_unique_counts", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "start_date", - "in": "query", "description": "Start date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "start_date", "required": true, "schema": { "type": "string" } }, { - "name": "end_date", - "in": "query", "description": "End date in '%Y-%m-%d %H:%M:%S' format", + "in": "query", + "name": "end_date", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "metric", - "in": "query", "description": "Metric to count: 'sessions' (unique sessions), 'visitors' (unique visitors), 'returning_visitors' (visitors seen before the range), or 'page_views' (total page views) (default: 'sessions')", + "in": "query", + "name": "metric", "required": true, "schema": { "type": "string" @@ -82186,14 +82918,14 @@ ], "responses": { "200": { - "description": "Successfully retrieved count", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UniqueCountsResponse" } } - } + }, + "description": "Successfully retrieved count" }, "400": { "description": "Bad request" @@ -82209,38 +82941,48 @@ { "bearer_auth": [] } + ], + "summary": "Get unique counts over time frame", + "tags": [ + "Events" ] } }, "/projects/{project_id}/upload/static": { "post": { - "tags": [ - "Static Bundles" - ], - "summary": "Upload a static bundle for later deployment", "description": "Uploads a tar.gz or zip file containing static assets. The bundle can be\ndeployed later using the deploy/static endpoint.", "operationId": "upload_static_bundle", "parameters": [ { - "name": "project_id", "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/SourceArchiveUpload" + } + } + }, + "required": true + }, "responses": { "201": { - "description": "Bundle uploaded successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StaticBundleResponse" } } - } + }, + "description": "Bundle uploaded successfully" }, "400": { "description": "Invalid request or unsupported format" @@ -82265,114 +83007,115 @@ { "bearer_auth": [] } + ], + "summary": "Upload a static bundle for later deployment", + "tags": [ + "Static Bundles" ] } }, "/projects/{project_id}/vulnerability-scans": { "get": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "list_project_scans", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of vulnerability scans", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ScanResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of vulnerability scans" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] }, "post": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "trigger_scan", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -82388,271 +83131,270 @@ }, "responses": { "202": { - "description": "Scan triggered successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TriggerScanResponse" } } - } + }, + "description": "Scan triggered successfully" }, "400": { - "description": "Invalid request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid request" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/projects/{project_id}/vulnerability-scans/environments": { "get": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "get_latest_scans_per_environment", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Latest scans per environment for current deployments", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ScanResponse" - } + }, + "type": "array" } } - } + }, + "description": "Latest scans per environment for current deployments" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/projects/{project_id}/vulnerability-scans/latest": { "get": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "get_latest_scan", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Latest scan for project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScanResponse" } } - } + }, + "description": "Latest scan for project" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "No scans found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "No scans found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/projects/{project_id}/webhooks": { "get": { - "tags": [ - "Webhooks" - ], - "summary": "List all webhooks for a project", "operationId": "list_webhooks", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-indexed)", + "example": 1, + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 1 + ] + } }, { - "name": "page_size", - "in": "query", "description": "Number of items per page (max 100)", + "example": 20, + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 - }, - "example": 20 + ] + } }, { - "name": "sort_by", "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -82662,8 +83404,8 @@ } }, { - "name": "sort_order", "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -82675,17 +83417,17 @@ ], "responses": { "200": { - "description": "List of webhooks", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/WebhookResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of webhooks" }, "401": { "description": "Unauthorized" @@ -82701,23 +83443,23 @@ { "bearer_auth": [] } + ], + "summary": "List all webhooks for a project", + "tags": [ + "Webhooks" ] }, "post": { - "tags": [ - "Webhooks" - ], - "summary": "Create a new webhook", "operationId": "create_webhook", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -82733,14 +83475,14 @@ }, "responses": { "201": { - "description": "Webhook created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookResponse" } } - } + }, + "description": "Webhook created" }, "400": { "description": "Invalid request" @@ -82759,48 +83501,41 @@ { "bearer_auth": [] } + ], + "summary": "Create a new webhook", + "tags": [ + "Webhooks" ] } }, "/projects/{project_id}/webhooks/{webhook_id}": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "Get a specific webhook", - "operationId": "get_webhook", + "delete": { + "operationId": "delete_webhook", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Webhook details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WebhookResponse" - } - } - } + "204": { + "description": "Webhook deleted" }, "401": { "description": "Unauthorized" @@ -82819,59 +83554,46 @@ { "bearer_auth": [] } - ] - }, - "put": { + ], + "summary": "Delete a webhook", "tags": [ "Webhooks" - ], - "summary": "Update a webhook", - "operationId": "update_webhook", + ] + }, + "get": { + "operationId": "get_webhook", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWebhookRequestBody" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Webhook updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookResponse" } } - } - }, - "400": { - "description": "Invalid request" + }, + "description": "Webhook details" }, "401": { "description": "Unauthorized" @@ -82890,39 +83612,59 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], + "summary": "Get a specific webhook", "tags": [ "Webhooks" - ], - "summary": "Delete a webhook", - "operationId": "delete_webhook", + ] + }, + "put": { + "operationId": "update_webhook", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookRequestBody" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "Webhook deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebhookResponse" + } + } + }, + "description": "Webhook updated" + }, + "400": { + "description": "Invalid request" }, "401": { "description": "Unauthorized" @@ -82941,62 +83683,62 @@ { "bearer_auth": [] } + ], + "summary": "Update a webhook", + "tags": [ + "Webhooks" ] } }, "/projects/{project_id}/webhooks/{webhook_id}/deliveries": { "get": { - "tags": [ - "Webhook Deliveries" - ], - "summary": "List webhook deliveries", "operationId": "list_deliveries", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "limit", - "in": "query", "description": "Number of deliveries to return (default: 50)", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List of deliveries", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/WebhookDeliveryResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of deliveries" }, "401": { "description": "Unauthorized" @@ -83012,58 +83754,58 @@ { "bearer_auth": [] } + ], + "summary": "List webhook deliveries", + "tags": [ + "Webhook Deliveries" ] } }, "/projects/{project_id}/webhooks/{webhook_id}/deliveries/{delivery_id}": { "get": { - "tags": [ - "Webhook Deliveries" - ], - "summary": "Get a specific webhook delivery by ID", "operationId": "get_delivery", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "delivery_id", - "in": "path", "description": "Delivery ID", + "in": "path", + "name": "delivery_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Delivery details including full payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookDeliveryResponse" } } - } + }, + "description": "Delivery details including full payload" }, "401": { "description": "Unauthorized" @@ -83082,58 +83824,58 @@ { "bearer_auth": [] } + ], + "summary": "Get a specific webhook delivery by ID", + "tags": [ + "Webhook Deliveries" ] } }, "/projects/{project_id}/webhooks/{webhook_id}/deliveries/{delivery_id}/retry": { "post": { - "tags": [ - "Webhook Deliveries" - ], - "summary": "Retry a failed delivery", "operationId": "retry_delivery", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "webhook_id", - "in": "path", "description": "Webhook ID", + "in": "path", + "name": "webhook_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "delivery_id", - "in": "path", "description": "Delivery ID", + "in": "path", + "name": "delivery_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Delivery retried", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookDeliveryResponse" } } - } + }, + "description": "Delivery retried" }, "401": { "description": "Unauthorized" @@ -83152,24 +83894,25 @@ { "bearer_auth": [] } + ], + "summary": "Retry a failed delivery", + "tags": [ + "Webhook Deliveries" ] } }, "/projects/{project_id}/workflows/dry-run": { "post": { - "tags": [ - "Workflows" - ], "operationId": "workflow_dry_run", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -83185,14 +83928,14 @@ }, "responses": { "202": { - "description": "Ephemeral run created and queued", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentRunResponse" } } - } + }, + "description": "Ephemeral run created and queued" }, "400": { "description": "Validation error (bad YAML, oversized payload, capped limits exceeded)" @@ -83214,112 +83957,111 @@ { "bearer_auth": [] } + ], + "tags": [ + "Workflows" ] } }, "/proxy-logs": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get proxy logs with optional filters and pagination", "operationId": "get_proxy_logs", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "session_id", - "in": "query", "description": "Filter by session ID", + "in": "query", + "name": "session_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "visitor_id", - "in": "query", "description": "Filter by visitor ID", + "in": "query", + "name": "visitor_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_date", + "description": "Start date for filtering (ISO 8601 format).\n\n**Defaults to 1 hour before `end_date` (or before now) when omitted.**\nThe listing is always time-bounded: an unbounded query would have to\nconsider the entire retention window — 100M+ rows on a busy deployment —\nto return a single page. Pass an explicit `start_date` to widen the\nwindow, up to the configured retention horizon.\n\nThe maximum span between `start_date` and `end_date` is 7 days when\n`project_id` is omitted, or 30 days when a single `project_id` is set —\na project-scoped query is bounded by that project's own row count\nrather than the whole deployment's. A wider request is rejected with a\n400 naming the applicable cap.", "in": "query", - "description": "Start date for filtering (ISO 8601 format).\n\n**Defaults to 1 hour before `end_date` (or before now) when omitted.**\nThe listing is always time-bounded: an unbounded query would have to\nconsider the entire retention window \u2014 100M+ rows on a busy deployment \u2014\nto return a single page. Pass an explicit `start_date` to widen the\nwindow, up to the configured retention horizon.\n\nThe maximum span between `start_date` and `end_date` is 7 days when\n`project_id` is omitted, or 30 days when a single `project_id` is set \u2014\na project-scoped query is bounded by that project's own row count\nrather than the whole deployment's. A wider request is rejected with a\n400 naming the applicable cap.", + "name": "start_date", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } }, { - "name": "end_date", - "in": "query", "description": "End date for filtering (ISO 8601 format). Defaults to now.", + "in": "query", + "name": "end_date", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } }, { - "name": "method", - "in": "query", "description": "Filter by HTTP method (GET, POST, etc.)", + "in": "query", + "name": "method", "required": false, "schema": { "type": [ @@ -83329,9 +84071,9 @@ } }, { - "name": "host", - "in": "query", "description": "Filter by host header", + "in": "query", + "name": "host", "required": false, "schema": { "type": [ @@ -83341,9 +84083,9 @@ } }, { - "name": "path", - "in": "query", "description": "Filter by path (supports partial match)", + "in": "query", + "name": "path", "required": false, "schema": { "type": [ @@ -83353,9 +84095,9 @@ } }, { - "name": "client_ip", - "in": "query", "description": "Filter by client IP address", + "in": "query", + "name": "client_ip", "required": false, "schema": { "type": [ @@ -83365,48 +84107,48 @@ } }, { - "name": "status_code", - "in": "query", "description": "Filter by HTTP status code", + "in": "query", + "name": "status_code", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "response_time_min", - "in": "query", "description": "Filter by minimum response time in ms", + "in": "query", + "name": "response_time_min", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "response_time_max", - "in": "query", "description": "Filter by maximum response time in ms", + "in": "query", + "name": "response_time_max", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "routing_status", - "in": "query", "description": "Filter by routing status (routed, no_project, error, pending)", + "in": "query", + "name": "routing_status", "required": false, "schema": { "type": [ @@ -83416,9 +84158,9 @@ } }, { - "name": "request_source", - "in": "query", "description": "Filter by request source (proxy, api, console, cli)", + "in": "query", + "name": "request_source", "required": false, "schema": { "type": [ @@ -83428,9 +84170,9 @@ } }, { - "name": "is_system_request", - "in": "query", "description": "Filter by system request flag", + "in": "query", + "name": "is_system_request", "required": false, "schema": { "type": [ @@ -83440,9 +84182,9 @@ } }, { - "name": "user_agent", - "in": "query", "description": "Filter by user agent string (partial match)", + "in": "query", + "name": "user_agent", "required": false, "schema": { "type": [ @@ -83452,9 +84194,9 @@ } }, { - "name": "browser", - "in": "query", "description": "Filter by browser name", + "in": "query", + "name": "browser", "required": false, "schema": { "type": [ @@ -83464,9 +84206,9 @@ } }, { - "name": "operating_system", - "in": "query", "description": "Filter by operating system", + "in": "query", + "name": "operating_system", "required": false, "schema": { "type": [ @@ -83476,9 +84218,9 @@ } }, { - "name": "device_type", - "in": "query", "description": "Filter by device type (mobile, desktop, tablet)", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": [ @@ -83488,9 +84230,9 @@ } }, { - "name": "is_bot", - "in": "query", "description": "Filter by bot detection", + "in": "query", + "name": "is_bot", "required": false, "schema": { "type": [ @@ -83500,9 +84242,9 @@ } }, { - "name": "exclude_bots", - "in": "query", "description": "When `true`, exclude rows flagged as bots while KEEPING rows whose\n`is_bot` is NULL (older rows without detection metadata). This is the\ntri-state complement of `is_bot=false`, which matches only rows\nexplicitly detected as non-bots. `false`/omitted is a no-op.", + "in": "query", + "name": "exclude_bots", "required": false, "schema": { "type": [ @@ -83512,9 +84254,9 @@ } }, { - "name": "bot_name", - "in": "query", "description": "Filter by bot name", + "in": "query", + "name": "bot_name", "required": false, "schema": { "type": [ @@ -83524,9 +84266,9 @@ } }, { - "name": "ai_provider", - "in": "query", "description": "Filter by AI provider (e.g. `OpenAI`, `Anthropic`, `Perplexity`). Matches\nthe canonical provider returned by the AI agent detector.", + "in": "query", + "name": "ai_provider", "required": false, "schema": { "type": [ @@ -83536,9 +84278,9 @@ } }, { - "name": "ai_agent", - "in": "query", "description": "Filter by AI agent name (e.g. `GPTBot`, `ChatGPT-User`). Equivalent to\nfiltering `bot_name` against a known AI taxonomy.", + "in": "query", + "name": "ai_agent", "required": false, "schema": { "type": [ @@ -83548,9 +84290,9 @@ } }, { - "name": "is_ai_agent", - "in": "query", "description": "When `true`, only return requests classified as known AI agents\n(regardless of provider/agent). Mutually compatible with the above.", + "in": "query", + "name": "is_ai_agent", "required": false, "schema": { "type": [ @@ -83560,61 +84302,61 @@ } }, { - "name": "request_size_min", - "in": "query", "description": "Filter by minimum request size in bytes", + "in": "query", + "name": "request_size_min", "required": false, "schema": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } }, { - "name": "request_size_max", - "in": "query", "description": "Filter by maximum request size in bytes", + "in": "query", + "name": "request_size_max", "required": false, "schema": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } }, { - "name": "response_size_min", - "in": "query", "description": "Filter by minimum response size in bytes", + "in": "query", + "name": "response_size_min", "required": false, "schema": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } }, { - "name": "response_size_max", - "in": "query", "description": "Filter by maximum response size in bytes", + "in": "query", + "name": "response_size_max", "required": false, "schema": { + "format": "int64", "type": [ "integer", "null" - ], - "format": "int64" + ] } }, { - "name": "cache_status", - "in": "query", "description": "Filter by cache status", + "in": "query", + "name": "cache_status", "required": false, "schema": { "type": [ @@ -83624,9 +84366,9 @@ } }, { - "name": "container_id", - "in": "query", "description": "Filter by container ID", + "in": "query", + "name": "container_id", "required": false, "schema": { "type": [ @@ -83636,9 +84378,9 @@ } }, { - "name": "upstream_host", - "in": "query", "description": "Filter by upstream host", + "in": "query", + "name": "upstream_host", "required": false, "schema": { "type": [ @@ -83648,9 +84390,9 @@ } }, { - "name": "has_error", - "in": "query", "description": "Filter by presence of error message", + "in": "query", + "name": "has_error", "required": false, "schema": { "type": [ @@ -83660,37 +84402,37 @@ } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "sort_by", - "in": "query", "description": "Sort by field (default: timestamp)", + "in": "query", + "name": "sort_by", "required": false, "schema": { "type": [ @@ -83700,9 +84442,9 @@ } }, { - "name": "sort_order", - "in": "query", "description": "Sort order (asc or desc, default: desc)", + "in": "query", + "name": "sort_order", "required": false, "schema": { "type": [ @@ -83714,412 +84456,412 @@ ], "responses": { "200": { - "description": "List of proxy logs", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProxyLogsPaginatedResponse" } } - } + }, + "description": "List of proxy logs" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get proxy logs with optional filters and pagination", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/ai-agents/known": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "List every AI agent the detector knows how to classify.", "description": "Returned in the same order as the internal taxonomy so the UI can use it as\na stable dropdown.", "operationId": "list_known_ai_agents", "responses": { "200": { - "description": "Known AI agents", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KnownAiAgentsResponse" } } - } + }, + "description": "Known AI agents" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List every AI agent the detector knows how to classify.", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/request/{request_id}": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get a proxy log by request ID (for tracing)", "operationId": "get_proxy_log_by_request_id", "parameters": [ { - "name": "request_id", - "in": "path", "description": "Request ID from pingora", + "in": "path", + "name": "request_id", "required": true, "schema": { "type": "string" } }, { - "name": "timestamp", + "description": "Event time of the log row (ISO 8601). When provided, the lookup is\nbounded to the hypertable chunks around this instant instead of\nscanning (and decompressing) the whole retention window. The list\nendpoint already returns this value per row — always pass it when\nnavigating from a list.", "in": "query", - "description": "Event time of the log row (ISO 8601). When provided, the lookup is\nbounded to the hypertable chunks around this instant instead of\nscanning (and decompressing) the whole retention window. The list\nendpoint already returns this value per row \u2014 always pass it when\nnavigating from a list.", + "name": "timestamp", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } } ], "responses": { "200": { - "description": "Proxy log found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProxyLogResponse" } } - } + }, + "description": "Proxy log found" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Proxy log not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Proxy log not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get a proxy log by request ID (for tracing)", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/ai-agent-pages": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get the top pages accessed by a specific AI agent over a time window.", "description": "Returns page paths ranked by request count, scoped to a single canonical\nagent name (e.g. `ChatGPT-User`). Use `GET /proxy-logs/ai-agents/known` to\nlist all valid agent names. Unknown agent names return an empty items array.", "operationId": "get_ai_agent_pages", "parameters": [ { - "name": "agent", - "in": "query", "description": "Canonical agent name to filter by (e.g. `ChatGPT-User`, `ClaudeBot`).\nMust be a name returned by `GET /proxy-logs/ai-agents/known`.", + "in": "query", + "name": "agent", "required": true, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Filter by project ID.", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601). Defaults to `end_time - 7d`.", + "example": "2026-05-22T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-22T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601). Defaults to now.", + "example": "2026-05-29T00:00:00Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-29T00:00:00Z" + } }, { - "name": "limit", - "in": "query", "description": "Maximum rows to return. Capped at 100 server-side.", + "in": "query", + "name": "limit", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } } ], "responses": { "200": { - "description": "Pages breakdown for the requested agent", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiAgentPagesResponse" } } - } + }, + "description": "Pages breakdown for the requested agent" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get the top pages accessed by a specific AI agent over a time window.", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/ai-agents": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get the per-AI-agent breakdown for a project over a time window.", "operationId": "get_ai_agent_breakdown", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID (recommended for per-project analytics).", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601). Defaults to `end_time - 7d`.", + "example": "2026-05-22T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-22T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601). Defaults to now.", + "example": "2026-05-29T00:00:00Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-29T00:00:00Z" + } }, { - "name": "limit", - "in": "query", "description": "Maximum rows to return. Capped at 100 server-side.", + "in": "query", + "name": "limit", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "path", + "description": "Optional exact path filter. Only used by the AI pages breakdown — when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", "in": "query", - "description": "Optional exact path filter. Only used by the AI pages breakdown \u2014 when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", + "name": "path", "required": false, "schema": { "type": [ @@ -84131,288 +84873,288 @@ ], "responses": { "200": { - "description": "AI agent breakdown", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiAgentBreakdownResponse" } } - } + }, + "description": "AI agent breakdown" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get the per-AI-agent breakdown for a project over a time window.", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/ai-agents/timeline": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Time-bucketed AI-agent request volume, split by provider or agent.", "description": "Powers the \"AI agents over time\" stacked chart. Same data source as the AI\nagent breakdown (request logs), just bucketed.", "operationId": "get_ai_agent_timeline", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID.", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601). Defaults to `end_time - 7d`.", + "example": "2026-05-22T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-22T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601). Defaults to now.", + "example": "2026-05-29T00:00:00Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-29T00:00:00Z" + } }, { - "name": "group_by", - "in": "query", "description": "Grouping dimension: `provider` (default) or `agent`.", + "example": "provider", + "in": "query", + "name": "group_by", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "provider" + } }, { - "name": "bucket", - "in": "query", "description": "Bucket interval override (e.g. `1 hour`, `1 day`). Auto-selected from the\nwindow width when omitted.", + "example": "1 hour", + "in": "query", + "name": "bucket", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "1 hour" + } } ], "responses": { "200": { - "description": "AI agent timeline", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiAgentTimelineResponse" } } - } + }, + "description": "AI agent timeline" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Time-bucketed AI-agent request volume, split by provider or agent.", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/ai-pages": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get the top pages crawled by AI agents over a time window.", "operationId": "get_ai_page_breakdown", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID (recommended for per-project analytics).", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601). Defaults to `end_time - 7d`.", + "example": "2026-05-22T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-22T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601). Defaults to now.", + "example": "2026-05-29T00:00:00Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-29T00:00:00Z" + } }, { - "name": "limit", - "in": "query", "description": "Maximum rows to return. Capped at 100 server-side.", + "in": "query", + "name": "limit", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "path", + "description": "Optional exact path filter. Only used by the AI pages breakdown — when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", "in": "query", - "description": "Optional exact path filter. Only used by the AI pages breakdown \u2014 when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", + "name": "path", "required": false, "schema": { "type": [ @@ -84424,141 +85166,141 @@ ], "responses": { "200": { - "description": "AI page breakdown", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiPageBreakdownResponse" } } - } + }, + "description": "AI page breakdown" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get the top pages crawled by AI agents over a time window.", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/ai-status": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "HTTP status-class breakdown for AI-agent traffic \u2014 are bots being served\n(2xx) or hitting broken/blocked pages (4xx/5xx)?", "operationId": "get_ai_status_breakdown", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter by project ID (recommended for per-project analytics).", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID.", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601). Defaults to `end_time - 7d`.", + "example": "2026-05-22T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-22T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601). Defaults to now.", + "example": "2026-05-29T00:00:00Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2026-05-29T00:00:00Z" + } }, { - "name": "limit", - "in": "query", "description": "Maximum rows to return. Capped at 100 server-side.", + "in": "query", + "name": "limit", "required": false, "schema": { + "format": "int64", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int64", - "minimum": 0 + ] } }, { - "name": "path", + "description": "Optional exact path filter. Only used by the AI pages breakdown — when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", "in": "query", - "description": "Optional exact path filter. Only used by the AI pages breakdown \u2014 when\nset, returns the single matching page so callers can ask \"how many AI\nagents hit this page?\".", + "name": "path", "required": false, "schema": { "type": [ @@ -84570,110 +85312,110 @@ ], "responses": { "200": { - "description": "AI status breakdown", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiStatusBreakdownResponse" } } - } + }, + "description": "AI status breakdown" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "HTTP status-class breakdown for AI-agent traffic — are bots being served\n(2xx) or hitting broken/blocked pages (4xx/5xx)?", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/projects-health": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get health summaries for multiple projects (last 1 hour)", "operationId": "get_projects_health", "parameters": [ { - "name": "project_ids", - "in": "query", "description": "Comma-separated list of project IDs", + "in": "query", + "name": "project_ids", "required": true, "schema": { "type": "string" } }, { - "name": "start_time", - "in": "query", "description": "Optional start time (ISO 8601). Defaults to `end_time - 1h`.", + "example": "2025-10-23T00:00:00Z", + "in": "query", + "name": "start_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2025-10-23T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "Optional end time (ISO 8601). Defaults to now.", + "example": "2025-10-23T23:59:59Z", + "in": "query", + "name": "end_time", "required": false, "schema": { "type": [ "string", "null" ] - }, - "example": "2025-10-23T23:59:59Z" + } }, { - "name": "is_bot", - "in": "query", "description": "Filter by bot detection. Pass `false` to exclude bots, `true` for bots only.", + "in": "query", + "name": "is_bot", "required": false, "schema": { "type": [ @@ -84685,216 +85427,216 @@ ], "responses": { "200": { - "description": "Health summaries per project", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProjectsHealthResponse" } } - } + }, + "description": "Health summaries per project" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get health summaries for multiple projects (last 1 hour)", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/time-buckets": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get time-bucketed statistics with optional filters", "operationId": "get_time_bucket_stats", "parameters": [ { - "name": "start_time", - "in": "query", "description": "Start time (ISO 8601 format)", + "example": "2025-10-23T00:00:00Z", + "in": "query", + "name": "start_time", "required": true, "schema": { "type": "string" - }, - "example": "2025-10-23T00:00:00Z" + } }, { - "name": "end_time", - "in": "query", "description": "End time (ISO 8601 format)", + "example": "2025-10-23T23:59:59Z", + "in": "query", + "name": "end_time", "required": true, "schema": { "type": "string" - }, - "example": "2025-10-23T23:59:59Z" + } }, { - "name": "bucket_interval", - "in": "query", "description": "Bucket interval (e.g., \"1 hour\", \"1 day\", \"5 minutes\")", + "in": "query", + "name": "bucket_interval", "required": false, "schema": { "type": "string" } }, { - "name": "method", - "in": "query", "description": "Filter by HTTP method", + "in": "query", + "name": "method", "required": false, "schema": { "type": "string" } }, { - "name": "client_ip", - "in": "query", "description": "Filter by client IP", + "in": "query", + "name": "client_ip", "required": false, "schema": { "type": "string" } }, { - "name": "project_id", - "in": "query", "description": "Filter by project ID", + "in": "query", + "name": "project_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "host", - "in": "query", "description": "Filter by host", + "in": "query", + "name": "host", "required": false, "schema": { "type": "string" } }, { - "name": "status_code", - "in": "query", "description": "Filter by status code", + "in": "query", + "name": "status_code", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "status_code_class", - "in": "query", "description": "Filter by status code class (e.g. \"2xx\", \"3xx\", \"4xx\", \"5xx\")", + "in": "query", + "name": "status_code_class", "required": false, "schema": { "type": "string" } }, { - "name": "routing_status", - "in": "query", "description": "Filter by routing status", + "in": "query", + "name": "routing_status", "required": false, "schema": { "type": "string" } }, { - "name": "request_source", - "in": "query", "description": "Filter by request source", + "in": "query", + "name": "request_source", "required": false, "schema": { "type": "string" } }, { - "name": "is_bot", - "in": "query", "description": "Filter by bot detection", + "in": "query", + "name": "is_bot", "required": false, "schema": { "type": "boolean" } }, { - "name": "device_type", - "in": "query", "description": "Filter by device type", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": "string" } }, { - "name": "has_project", - "in": "query", "description": "When true, only count requests that matched a project\n(project_id IS NOT NULL). Makes chart totals line up with the\nper-project health cards.", + "in": "query", + "name": "has_project", "required": false, "schema": { "type": "boolean" @@ -84903,75 +85645,75 @@ ], "responses": { "200": { - "description": "Time-bucketed statistics", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimeBucketStatsResponse" } } - } + }, + "description": "Time-bucketed statistics" }, "400": { - "description": "Invalid parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Invalid parameters" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get time-bucketed statistics with optional filters", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/stats/today": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get today's request count with optional filters", "operationId": "get_today_stats", "parameters": [ { - "name": "method", - "in": "query", "description": "Filter by HTTP method", + "in": "query", + "name": "method", "required": false, "schema": { "type": [ @@ -84981,9 +85723,9 @@ } }, { - "name": "client_ip", - "in": "query", "description": "Filter by client IP", + "in": "query", + "name": "client_ip", "required": false, "schema": { "type": [ @@ -84993,48 +85735,48 @@ } }, { - "name": "project_id", - "in": "query", "description": "Filter by project ID", + "in": "query", + "name": "project_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "deployment_id", - "in": "query", "description": "Filter by deployment ID", + "in": "query", + "name": "deployment_id", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "host", - "in": "query", "description": "Filter by host", + "in": "query", + "name": "host", "required": false, "schema": { "type": [ @@ -85044,22 +85786,22 @@ } }, { - "name": "status_code", - "in": "query", "description": "Filter by status code", + "in": "query", + "name": "status_code", "required": false, "schema": { + "format": "int32", "type": [ "integer", "null" - ], - "format": "int32" + ] } }, { - "name": "status_code_class", - "in": "query", "description": "Filter by status code class (e.g. \"2xx\", \"3xx\", \"4xx\", \"5xx\")", + "in": "query", + "name": "status_code_class", "required": false, "schema": { "type": [ @@ -85069,9 +85811,9 @@ } }, { - "name": "routing_status", - "in": "query", "description": "Filter by routing status", + "in": "query", + "name": "routing_status", "required": false, "schema": { "type": [ @@ -85081,9 +85823,9 @@ } }, { - "name": "request_source", - "in": "query", "description": "Filter by request source", + "in": "query", + "name": "request_source", "required": false, "schema": { "type": [ @@ -85093,9 +85835,9 @@ } }, { - "name": "is_bot", - "in": "query", "description": "Filter by bot detection", + "in": "query", + "name": "is_bot", "required": false, "schema": { "type": [ @@ -85105,9 +85847,9 @@ } }, { - "name": "device_type", - "in": "query", "description": "Filter by device type", + "in": "query", + "name": "device_type", "required": false, "schema": { "type": [ @@ -85119,250 +85861,250 @@ ], "responses": { "200": { - "description": "Today's request count", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TodayStatsResponse" } } - } + }, + "description": "Today's request count" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get today's request count with optional filters", + "tags": [ + "Proxy Logs" ] } }, "/proxy-logs/{id}": { "get": { - "tags": [ - "Proxy Logs" - ], - "summary": "Get a single proxy log by ID", "operationId": "get_proxy_log_by_id", "parameters": [ { - "name": "id", - "in": "path", "description": "Proxy log ID", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "timestamp", + "description": "Event time of the log row (ISO 8601). When provided, the lookup is\nbounded to the hypertable chunks around this instant instead of\nscanning (and decompressing) the whole retention window. The list\nendpoint already returns this value per row — always pass it when\nnavigating from a list.", "in": "query", - "description": "Event time of the log row (ISO 8601). When provided, the lookup is\nbounded to the hypertable chunks around this instant instead of\nscanning (and decompressing) the whole retention window. The list\nendpoint already returns this value per row \u2014 always pass it when\nnavigating from a list.", + "name": "timestamp", "required": false, "schema": { + "format": "date-time", "type": [ "string", "null" - ], - "format": "date-time" + ] } } ], "responses": { "200": { - "description": "Proxy log found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProxyLogResponse" } } - } + }, + "description": "Proxy log found" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Proxy log not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Proxy log not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get a single proxy log by ID", + "tags": [ + "Proxy Logs" ] } }, "/repositories": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "List synced repositories with advanced filtering", "description": "Lists repositories that have been synced to the database with filtering options.\nThis provides fast access to repository metadata with filtering by connection, search, and other criteria.", "operationId": "list_synced_repositories", "parameters": [ { - "name": "page", - "in": "query", "description": "Page number for pagination", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Number of items per page (max 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "sort", - "in": "query", "description": "Sort field (name, created_at, updated_at, stars, watchers, size, issues)", + "in": "query", + "name": "sort", "required": false, "schema": { "type": "string" } }, { - "name": "direction", - "in": "query", "description": "Sort direction (asc, desc)", + "in": "query", + "name": "direction", "required": false, "schema": { "type": "string" } }, { - "name": "search", - "in": "query", "description": "Search term to filter repositories", + "in": "query", + "name": "search", "required": false, "schema": { "type": "string" } }, { - "name": "owner", - "in": "query", "description": "Filter by repository owner", + "in": "query", + "name": "owner", "required": false, "schema": { "type": "string" } }, { - "name": "language", - "in": "query", "description": "Filter by programming language", + "in": "query", + "name": "language", "required": false, "schema": { "type": "string" } }, { - "name": "private", - "in": "query", "description": "Filter by private status (true/false)", + "in": "query", + "name": "private", "required": false, "schema": { "type": "boolean" } }, { - "name": "git_provider_connection_id", - "in": "query", "description": "Filter by git provider connection ID", + "in": "query", + "name": "git_provider_connection_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "List of synced repositories", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryListResponse" } } - } + }, + "description": "List of synced repositories" }, "401": { "description": "Unauthorized" @@ -85375,56 +86117,56 @@ { "bearer_auth": [] } + ], + "summary": "List synced repositories with advanced filtering", + "tags": [ + "Git Providers" ] } }, "/repositories/{owner}/{name}": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get repository by owner and name from any connection", "operationId": "get_repository_by_name", "parameters": [ { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "name", - "in": "path", "description": "Repository name", + "in": "path", + "name": "name", "required": true, "schema": { "type": "string" } }, { - "name": "connection_id", - "in": "query", "description": "Optional specific connection ID to search", + "in": "query", + "name": "connection_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Repository found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryResponse" } } - } + }, + "description": "Repository found" }, "404": { "description": "Repository not found" @@ -85437,30 +86179,30 @@ { "bearer_auth": [] } + ], + "summary": "Get repository by owner and name from any connection", + "tags": [ + "Git Providers" ] } }, "/repositories/{owner}/{name}/all": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get all repositories with same owner/name from all git providers", "operationId": "get_all_repositories_by_name", "parameters": [ { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "name", - "in": "path", "description": "Repository name", + "in": "path", + "name": "name", "required": true, "schema": { "type": "string" @@ -85469,17 +86211,17 @@ ], "responses": { "200": { - "description": "Repositories found from all providers", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/RepositoryResponse" - } + }, + "type": "array" } } - } + }, + "description": "Repositories found from all providers" }, "404": { "description": "No repositories found" @@ -85492,39 +86234,39 @@ { "bearer_auth": [] } + ], + "summary": "Get all repositories with same owner/name from all git providers", + "tags": [ + "Git Providers" ] } }, "/repositories/{owner}/{name}/preset": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get repository preset by owner and name", "operationId": "get_repository_preset_by_name", "parameters": [ { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "name", - "in": "path", "description": "Repository name", + "in": "path", + "name": "name", "required": true, "schema": { "type": "string" } }, { - "name": "branch", - "in": "query", "description": "Git branch to check (defaults to repository's default branch)", + "in": "query", + "name": "branch", "required": false, "schema": { "type": "string" @@ -85533,14 +86275,14 @@ ], "responses": { "200": { - "description": "Repository preset calculated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryPresetResponse" } } - } + }, + "description": "Repository preset calculated successfully" }, "404": { "description": "Repository not found" @@ -85553,49 +86295,49 @@ { "bearer_auth": [] } + ], + "summary": "Get repository preset by owner and name", + "tags": [ + "Git Providers" ] } }, "/repositories/{owner}/{repo}/branches": { "get": { - "tags": [ - "Repositories" - ], - "summary": "Get repository branches", "operationId": "get_repository_branches", "parameters": [ { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "repo", - "in": "path", "description": "Repository name", + "in": "path", + "name": "repo", "required": true, "schema": { "type": "string" } }, { - "name": "connection_id", - "in": "query", "description": "Git provider connection ID (required when multiple connections have the same repo)", + "in": "query", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -85604,14 +86346,14 @@ ], "responses": { "200": { - "description": "List of branches", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BranchListResponse" } } - } + }, + "description": "List of branches" }, "401": { "description": "Unauthorized" @@ -85627,49 +86369,49 @@ { "bearer_auth": [] } + ], + "summary": "Get repository branches", + "tags": [ + "Repositories" ] } }, "/repositories/{owner}/{repo}/tags": { "get": { - "tags": [ - "Repositories" - ], - "summary": "Get repository tags", "operationId": "get_repository_tags", "parameters": [ { - "name": "owner", - "in": "path", "description": "Repository owner", + "in": "path", + "name": "owner", "required": true, "schema": { "type": "string" } }, { - "name": "repo", - "in": "path", "description": "Repository name", + "in": "path", + "name": "repo", "required": true, "schema": { "type": "string" } }, { - "name": "connection_id", - "in": "query", "description": "Git provider connection ID (required when multiple connections have the same repo)", + "in": "query", + "name": "connection_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -85678,14 +86420,14 @@ ], "responses": { "200": { - "description": "List of tags", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TagListResponse" } } - } + }, + "description": "List of tags" }, "401": { "description": "Unauthorized" @@ -85704,30 +86446,31 @@ { "bearer_auth": [] } + ], + "summary": "Get repository tags", + "tags": [ + "Repositories" ] } }, "/repositories/{repository_id}/preset/live": { "get": { - "tags": [ - "Git Providers" - ], "operationId": "get_repository_preset_live", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "branch", - "in": "query", "description": "Git branch to check (defaults to repository's default branch)", + "in": "query", + "name": "branch", "required": false, "schema": { "type": "string" @@ -85736,14 +86479,14 @@ ], "responses": { "200": { - "description": "Repository presets calculated successfully - includes root preset and projects in subdirectories", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryPresetResponse" } } - } + }, + "description": "Repository presets calculated successfully - includes root preset and projects in subdirectories" }, "400": { "description": "Bad request" @@ -85762,38 +86505,37 @@ { "bearer_auth": [] } + ], + "tags": [ + "Git Providers" ] } }, "/repository/{repository_id}": { "get": { - "tags": [ - "Git Providers" - ], - "summary": "Get repository by ID", "operationId": "get_repository_by_id", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Repository found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepositoryResponse" } } - } + }, + "description": "Repository found" }, "404": { "description": "Repository not found" @@ -85806,31 +86548,31 @@ { "bearer_auth": [] } + ], + "summary": "Get repository by ID", + "tags": [ + "Git Providers" ] } }, "/repository/{repository_id}/branches": { "get": { - "tags": [ - "Repositories" - ], - "summary": "Get repository branches by repository ID", "operationId": "get_branches_by_repository_id", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -85839,14 +86581,14 @@ ], "responses": { "200": { - "description": "List of branches", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BranchListResponse" } } - } + }, + "description": "List of branches" }, "401": { "description": "Unauthorized" @@ -85862,61 +86604,61 @@ { "bearer_auth": [] } + ], + "summary": "Get repository branches by repository ID", + "tags": [ + "Repositories" ] } }, "/repository/{repository_id}/commits": { "get": { - "tags": [ - "Repositories" - ], - "summary": "List recent commits for a repository branch", "operationId": "list_commits_by_repository_id", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "branch", - "in": "query", "description": "Branch name to list commits for", + "in": "query", + "name": "branch", "required": true, "schema": { "type": "string" } }, { - "name": "per_page", - "in": "query", "description": "Number of commits to return (default: 20, max: 100)", + "in": "query", + "name": "per_page", "required": false, "schema": { + "format": "int32", + "minimum": 0, "type": [ "integer", "null" - ], - "format": "int32", - "minimum": 0 + ] } } ], "responses": { "200": { - "description": "List of commits", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommitListResponse" } } - } + }, + "description": "List of commits" }, "401": { "description": "Unauthorized" @@ -85932,31 +86674,31 @@ { "bearer_auth": [] } + ], + "summary": "List recent commits for a repository branch", + "tags": [ + "Repositories" ] } }, "/repository/{repository_id}/commits/{commit_sha}": { "get": { - "tags": [ - "Repositories" - ], - "summary": "Check if a commit exists in a repository", "operationId": "check_commit_exists", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "commit_sha", - "in": "path", "description": "Commit SHA to check", + "in": "path", + "name": "commit_sha", "required": true, "schema": { "type": "string" @@ -85965,14 +86707,14 @@ ], "responses": { "200": { - "description": "Commit existence check result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommitExistsResponse" } } - } + }, + "description": "Commit existence check result" }, "400": { "description": "Invalid commit SHA" @@ -85997,31 +86739,31 @@ { "bearer_auth": [] } + ], + "summary": "Check if a commit exists in a repository", + "tags": [ + "Repositories" ] } }, "/repository/{repository_id}/tags": { "get": { - "tags": [ - "Repositories" - ], - "summary": "Get repository tags by repository ID", "operationId": "get_tags_by_repository_id", "parameters": [ { - "name": "repository_id", - "in": "path", "description": "Repository ID", + "in": "path", + "name": "repository_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "fresh", - "in": "query", "description": "Force fetch fresh data, bypassing cache (default: false)", + "in": "query", + "name": "fresh", "required": false, "schema": { "type": "boolean" @@ -86030,14 +86772,14 @@ ], "responses": { "200": { - "description": "List of tags", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TagListResponse" } } - } + }, + "description": "List of tags" }, "401": { "description": "Unauthorized" @@ -86056,172 +86798,172 @@ { "bearer_auth": [] } + ], + "summary": "Get repository tags by repository ID", + "tags": [ + "Repositories" ] } }, "/restore-runs/{id}": { "get": { - "tags": [ - "Restore" - ], "operationId": "get_restore_run", "parameters": [ { - "name": "id", - "in": "path", "description": "Restore run id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Restore run progress", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestoreRunView" } } - } + }, + "description": "Restore run progress" }, "404": { - "description": "Restore run not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Restore run not found" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Restore" ] } }, "/revenue/events": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Org-wide revenue events across every project. Powers the revenue\ntransactions page. Supports filtering by project, date range, and\nevent type.", "operationId": "revenue_global_events", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Filter to a single project", + "in": "query", + "name": "project_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "from", - "in": "query", "description": "Lower bound (inclusive), ISO-8601", + "in": "query", + "name": "from", "required": false, "schema": { "type": "string" } }, { - "name": "to", - "in": "query", "description": "Upper bound (inclusive), ISO-8601", + "in": "query", + "name": "to", "required": false, "schema": { "type": "string" } }, { - "name": "event_types", - "in": "query", "description": "Comma-separated event types (e.g. `invoice.paid,charge.succeeded`)", + "in": "query", + "name": "event_types", "required": false, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", "description": "Max rows, default 100, max 500", + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int64" + "format": "int64", + "type": "integer" } } ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/GlobalRecentEventResponse" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Org-wide revenue events across every project. Powers the revenue\ntransactions page. Supports filtering by project, date range, and\nevent type.", + "tags": [ + "Revenue" ] } }, "/revenue/metrics/global-mrr": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Org-wide MRR total, summed across every project in the install.\nPowers the single-number MRR card on the main dashboard.", "operationId": "revenue_metrics_global_mrr", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GlobalMrrResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Org-wide MRR total, summed across every project in the install.\nPowers the single-number MRR card on the main dashboard.", + "tags": [ + "Revenue" ] } }, "/revenue/metrics/global-summary": { "get": { - "tags": [ - "Revenue" - ], - "summary": "Org-wide revenue summary: MRR, paid cash (30d + all-time), refunds,\nactive subscriptions/customers, and transaction count. Powers the\nheader on the Revenue transactions page.", "operationId": "revenue_metrics_global_summary", "parameters": [ { - "name": "currency", - "in": "query", "description": "ISO-4217 currency code, default USD", + "in": "query", + "name": "currency", "required": false, "schema": { "type": "string" @@ -86230,200 +86972,200 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GlobalRevenueSummaryResponse" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Org-wide revenue summary: MRR, paid cash (30d + all-time), refunds,\nactive subscriptions/customers, and transaction count. Powers the\nheader on the Revenue transactions page.", + "tags": [ + "Revenue" ] } }, "/revenue/providers": { "get": { - "tags": [ - "Revenue" - ], - "summary": "List registered providers (what the UI needs to render the \"Connect\"\ndropdown + its wizard instructions).", "operationId": "revenue_list_providers", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProviderDescriptor" - } + }, + "type": "array" } } - } + }, + "description": "" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "List registered providers (what the UI needs to render the \"Connect\"\ndropdown + its wizard instructions).", + "tags": [ + "Revenue" ] } }, "/session-replays": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get session replays for a project", "operationId": "get_project_session_replays", "parameters": [ { - "name": "project_id", - "in": "query", "description": "Project ID", + "in": "query", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "environment_id", - "in": "query", "description": "Environment ID (optional)", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Session replays retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetProjectSessionReplaysResponse" } } - } + }, + "description": "Session replays retrieved successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get session replays for a project", + "tags": [ + "Analytics" ] } }, "/sessions/{session_id}/events": { "get": { - "tags": [ - "Events" - ], - "summary": "Get events for a specific session", "operationId": "get_session_events", "parameters": [ { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { "type": "string" } }, { - "name": "environment_id", - "in": "query", "description": "Filter by environment ID", + "in": "query", + "name": "environment_id", "required": false, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Successfully retrieved session events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AnalyticsSessionEventsResponse" } } - } + }, + "description": "Successfully retrieved session events" }, "401": { "description": "Unauthorized" @@ -86439,26 +87181,26 @@ { "bearer_auth": [] } + ], + "summary": "Get events for a specific session", + "tags": [ + "Events" ] } }, "/settings": { "get": { - "tags": [ - "Settings" - ], - "summary": "Get application settings", "operationId": "get_settings", "responses": { "200": { - "description": "Application settings with masked sensitive fields", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AppSettingsResponse" } } - } + }, + "description": "Application settings with masked sensitive fields" }, "401": { "description": "Unauthorized" @@ -86471,13 +87213,13 @@ { "bearer_auth": [] } + ], + "summary": "Get application settings", + "tags": [ + "Settings" ] }, "put": { - "tags": [ - "Settings" - ], - "summary": "Update application settings", "operationId": "update_settings", "requestBody": { "content": { @@ -86491,14 +87233,14 @@ }, "responses": { "200": { - "description": "Settings updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsUpdateResponse" } } - } + }, + "description": "Settings updated successfully" }, "400": { "description": "Bad request - invalid settings" @@ -86514,15 +87256,15 @@ { "bearer_auth": [] } + ], + "summary": "Update application settings", + "tags": [ + "Settings" ] } }, "/settings/agent-token": { "post": { - "tags": [ - "Agents" - ], - "summary": "Save an encrypted AI provider token for use in sandbox containers.", "operationId": "save_agent_token", "requestBody": { "content": { @@ -86536,14 +87278,14 @@ }, "responses": { "200": { - "description": "Token encrypted and persisted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SaveAgentTokenResponse" } } - } + }, + "description": "Token encrypted and persisted" }, "401": { "description": "Unauthorized" @@ -86559,26 +87301,26 @@ { "bearer_auth": [] } + ], + "summary": "Save an encrypted AI provider token for use in sandbox containers.", + "tags": [ + "Agents" ] } }, "/settings/ai-providers": { "get": { - "tags": [ - "Agents" - ], - "summary": "List the AI provider catalog. Includes per-provider \"is a credential\nconfigured?\" so the settings UI can render configured/not-configured\nbadges without leaking the encrypted credential.", "operationId": "list_ai_providers", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProviderCatalogResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -86588,21 +87330,21 @@ { "bearer_auth": [] } + ], + "summary": "List the AI provider catalog. Includes per-provider \"is a credential\nconfigured?\" so the settings UI can render configured/not-configured\nbadges without leaking the encrypted credential.", + "tags": [ + "Agents" ] } }, "/settings/ai-providers/{provider_id}": { "patch": { - "tags": [ - "Agents" - ], - "summary": "Update provider-scoped settings without touching the saved credential.\nToday that means just `default_model`; future per-provider settings\n(base URL overrides, request headers, etc.) can land here too without\nchanging the shape of `save_credential`.", "operationId": "update_ai_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "AI provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { "type": "string" @@ -86621,14 +87363,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateAiProviderResponse" } } - } + }, + "description": "" }, "400": { "description": "Unknown provider" @@ -86641,21 +87383,21 @@ { "bearer_auth": [] } + ], + "summary": "Update provider-scoped settings without touching the saved credential.\nToday that means just `default_model`; future per-provider settings\n(base URL overrides, request headers, etc.) can land here too without\nchanging the shape of `save_credential`.", + "tags": [ + "Agents" ] } }, "/settings/ai-providers/{provider_id}/activate": { "post": { - "tags": [ - "Agents" - ], - "summary": "Activate a provider as the platform-wide default. Refuses to activate a\nprovider that doesn't have a credential saved yet \u2014 the UI enforces the\nsame rule on the button, but we re-check server-side so a stale tab\ncan't bypass it.", "operationId": "activate_ai_provider", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "AI provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { "type": "string" @@ -86664,14 +87406,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActivateProviderResponse" } } - } + }, + "description": "" }, "400": { "description": "Provider not configured" @@ -86684,22 +87426,22 @@ { "bearer_auth": [] } + ], + "summary": "Activate a provider as the platform-wide default. Refuses to activate a\nprovider that doesn't have a credential saved yet — the UI enforces the\nsame rule on the button, but we re-check server-side so a stale tab\ncan't bypass it.", + "tags": [ + "Agents" ] } }, "/settings/ai-providers/{provider_id}/credential": { "post": { - "tags": [ - "Agents" - ], - "summary": "Save (or replace) a provider's credential. The credential is encrypted\nwith `EncryptionService` and stored inside\n`agent_sandbox.providers[provider_id].credentials_encrypted`.", "description": "The plaintext shape depends on the flavor's `credential_format`:\n - `ApiKey` / `OauthToken`: the key/token string.\n - `ConfigFile`: the full file body (e.g. OpenCode's `auth.json`).", "operationId": "save_ai_provider_credential", "parameters": [ { - "name": "provider_id", - "in": "path", "description": "AI provider ID", + "in": "path", + "name": "provider_id", "required": true, "schema": { "type": "string" @@ -86718,14 +87460,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SaveCredentialResponse" } } - } + }, + "description": "" }, "400": { "description": "Validation error" @@ -86738,27 +87480,27 @@ { "bearer_auth": [] } + ], + "summary": "Save (or replace) a provider's credential. The credential is encrypted\nwith `EncryptionService` and stored inside\n`agent_sandbox.providers[provider_id].credentials_encrypted`.", + "tags": [ + "Agents" ] } }, "/settings/disk-status": { "get": { - "tags": [ - "Settings" - ], - "summary": "Get current disk usage for the control-plane server", - "description": "Returns live disk usage for the monitored path along with any disks that\nmeet or exceed the configured alert threshold. Read-only \u2014 does not send\nnotifications. Used by the dashboard to surface a low-disk-space warning.", + "description": "Returns live disk usage for the monitored path along with any disks that\nmeet or exceed the configured alert threshold. Read-only — does not send\nnotifications. Used by the dashboard to surface a low-disk-space warning.", "operationId": "get_disk_status", "responses": { "200": { - "description": "Current disk usage and threshold alerts", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DiskSpaceCheckResult" } } - } + }, + "description": "Current disk usage and threshold alerts" }, "401": { "description": "Unauthorized" @@ -86771,26 +87513,26 @@ { "bearer_auth": [] } + ], + "summary": "Get current disk usage for the control-plane server", + "tags": [ + "Settings" ] } }, "/settings/enrollment-tokens": { "get": { - "tags": [ - "Settings" - ], - "summary": "List currently-valid node enrollment tokens (hashes elided).", "operationId": "list_enrollment_tokens", "responses": { "200": { - "description": "Active enrollment tokens", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EnrollmentTokenListResponse" } } - } + }, + "description": "Active enrollment tokens" }, "401": { "description": "Unauthorized" @@ -86806,13 +87548,13 @@ { "bearer_auth": [] } + ], + "summary": "List currently-valid node enrollment tokens (hashes elided).", + "tags": [ + "Settings" ] }, "post": { - "tags": [ - "Settings" - ], - "summary": "Mint a short-lived, single-use node enrollment token.", "operationId": "mint_enrollment_token", "requestBody": { "content": { @@ -86826,14 +87568,14 @@ }, "responses": { "200": { - "description": "Enrollment token minted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MintEnrollmentTokenResponse" } } - } + }, + "description": "Enrollment token minted" }, "401": { "description": "Unauthorized" @@ -86849,38 +87591,38 @@ { "bearer_auth": [] } + ], + "summary": "Mint a short-lived, single-use node enrollment token.", + "tags": [ + "Settings" ] } }, "/settings/enrollment-tokens/{id}": { "delete": { - "tags": [ - "Settings" - ], - "summary": "Revoke a node enrollment token by id.", "operationId": "revoke_enrollment_token", "parameters": [ { - "name": "id", - "in": "path", "description": "Enrollment token id", + "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Enrollment token revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsUpdateResponse" } } - } + }, + "description": "Enrollment token revoked" }, "401": { "description": "Unauthorized" @@ -86899,27 +87641,27 @@ { "bearer_auth": [] } + ], + "summary": "Revoke a node enrollment token by id.", + "tags": [ + "Settings" ] } }, "/settings/join-token": { "delete": { - "tags": [ - "Settings" - ], - "summary": "Revoke the current join token", "description": "Removes the stored join token hash, allowing any node to register\n(if no other authentication is in place).", "operationId": "revoke_join_token", "responses": { "200": { - "description": "Join token revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SettingsUpdateResponse" } } - } + }, + "description": "Join token revoked" }, "401": { "description": "Unauthorized" @@ -86935,27 +87677,27 @@ { "bearer_auth": [] } + ], + "summary": "Revoke the current join token", + "tags": [ + "Settings" ] } }, "/settings/join-token/generate": { "post": { - "tags": [ - "Settings" - ], - "summary": "Generate a new join token for multi-node cluster registration", "description": "Creates a random 32-byte hex token, stores the SHA-256 hash in settings,\nand returns the plaintext exactly once. If a token already exists, it is replaced.", "operationId": "generate_join_token", "responses": { "200": { - "description": "Join token generated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GenerateJoinTokenResponse" } } - } + }, + "description": "Join token generated" }, "401": { "description": "Unauthorized" @@ -86971,26 +87713,26 @@ { "bearer_auth": [] } + ], + "summary": "Generate a new join token for multi-node cluster registration", + "tags": [ + "Settings" ] } }, "/settings/join-token/status": { "get": { - "tags": [ - "Settings" - ], - "summary": "Check whether a join token is currently configured", "operationId": "get_join_token_status", "responses": { "200": { - "description": "Join token status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JoinTokenStatusResponse" } } - } + }, + "description": "Join token status" }, "401": { "description": "Unauthorized" @@ -87003,25 +87745,26 @@ { "bearer_auth": [] } + ], + "summary": "Check whether a join token is currently configured", + "tags": [ + "Settings" ] } }, "/settings/mcp-servers": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_global_mcps", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListMcpsResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87031,12 +87774,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "post": { - "tags": [ - "Agents" - ], "operationId": "create_global_mcp", "requestBody": { "content": { @@ -87050,14 +87793,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87067,20 +87810,20 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/mcp-servers/{slug}": { - "get": { - "tags": [ - "Agents" - ], - "operationId": "get_global_mcp", + "delete": { + "operationId": "delete_global_mcp", "parameters": [ { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -87088,15 +87831,8 @@ } ], "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/McpDefinitionResponse" - } - } - } + "204": { + "description": "MCP server deleted" }, "401": { "description": "Unauthorized" @@ -87109,44 +87845,34 @@ { "bearer_auth": [] } - ] - }, - "put": { + ], "tags": [ "Agents" - ], - "operationId": "update_global_mcp", + ] + }, + "get": { + "operationId": "get_global_mcp", "parameters": [ { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMcpRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87159,27 +87885,44 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Agents" - ], - "operationId": "delete_global_mcp", + ] + }, + "put": { + "operationId": "update_global_mcp", "parameters": [ { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMcpRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "MCP server deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/McpDefinitionResponse" + } + } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87192,29 +87935,29 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/mcp-servers/{slug}/config/{field}": { "get": { - "tags": [ - "Agents" - ], "operationId": "reveal_global_mcp_config", "parameters": [ { - "name": "slug", - "in": "path", "description": "MCP server slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" } }, { - "name": "field", - "in": "path", "description": "Sensitive field path, such as url or env.API_TOKEN", + "in": "path", + "name": "field", "required": true, "schema": { "type": "string" @@ -87223,14 +87966,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SensitiveMcpConfigValueResponse" } } - } + }, + "description": "" }, "400": { "description": "Field is not revealable" @@ -87252,27 +87995,26 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/routes/refresh": { "post": { - "tags": [ - "Settings" - ], - "summary": "Manually refresh the proxy route table", "description": "Reloads all routes from the database into the in-memory proxy cache.\nUseful as a workaround when routes are out of sync.", "operationId": "refresh_route_table", "responses": { "200": { - "description": "Route table refreshed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteRefreshResponse" } } - } + }, + "description": "Route table refreshed" }, "401": { "description": "Unauthorized" @@ -87288,21 +88030,22 @@ { "bearer_auth": [] } + ], + "summary": "Manually refresh the proxy route table", + "tags": [ + "Settings" ] } }, "/settings/sandbox-rebuild": { "post": { - "tags": [ - "Agents" - ], "operationId": "rebuild_sandbox_image", "responses": { "200": { - "description": "Server-Sent Events stream of rebuild progress; final event `{\"type\":\"done\",\"success\":bool,...}`", "content": { "text/event-stream": {} - } + }, + "description": "Server-Sent Events stream of rebuild progress; final event `{\"type\":\"done\",\"success\":bool,...}`" }, "401": { "description": "Unauthorized" @@ -87315,25 +88058,25 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/sandbox-status": { "get": { - "tags": [ - "Agents" - ], "operationId": "get_global_sandbox_status", "responses": { "200": { - "description": "Global sandbox readiness for the settings page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxStatusResponse" } } - } + }, + "description": "Global sandbox readiness for the settings page" }, "401": { "description": "Unauthorized" @@ -87346,25 +88089,25 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/secrets": { "get": { - "tags": [ - "Secrets" - ], "operationId": "list_secrets", "responses": { "200": { - "description": "List of global agent secrets", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListSecretsResponse" } } - } + }, + "description": "List of global agent secrets" }, "401": { "description": "Unauthorized" @@ -87377,12 +88120,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "Secrets" ] }, "post": { - "tags": [ - "Secrets" - ], "operationId": "upsert_secret", "requestBody": { "content": { @@ -87396,14 +88139,14 @@ }, "responses": { "201": { - "description": "Secret created/updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SecretResponse" } } - } + }, + "description": "Secret created/updated" }, "400": { "description": "Validation error" @@ -87419,20 +88162,20 @@ { "bearer_auth": [] } + ], + "tags": [ + "Secrets" ] } }, "/settings/secrets/{name}": { "delete": { - "tags": [ - "Secrets" - ], "operationId": "delete_secret", "parameters": [ { - "name": "name", - "in": "path", "description": "Secret name", + "in": "path", + "name": "name", "required": true, "schema": { "type": "string" @@ -87457,25 +88200,25 @@ { "bearer_auth": [] } + ], + "tags": [ + "Secrets" ] } }, "/settings/skills": { "get": { - "tags": [ - "Agents" - ], "operationId": "list_global_skills", "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListSkillsResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87485,12 +88228,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "post": { - "tags": [ - "Agents" - ], "operationId": "create_global_skill", "requestBody": { "content": { @@ -87504,14 +88247,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87521,15 +88264,14 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] } }, "/settings/skills/upload": { "post": { - "tags": [ - "Agents" - ], - "summary": "Upload a skill with an archive (tar.gz) \u2014 global.", "operationId": "upload_global_skill", "requestBody": { "content": { @@ -87543,14 +88285,14 @@ }, "responses": { "201": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87560,20 +88302,54 @@ { "bearer_auth": [] } + ], + "summary": "Upload a skill with an archive (tar.gz) — global.", + "tags": [ + "Agents" ] } }, "/settings/skills/{slug}": { - "get": { + "delete": { + "operationId": "delete_global_skill", + "parameters": [ + { + "description": "Skill slug", + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Skill deleted" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Skill not found" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "Agents" - ], + ] + }, + "get": { "operationId": "get_global_skill", "parameters": [ { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -87582,14 +88358,14 @@ ], "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87602,18 +88378,18 @@ { "bearer_auth": [] } + ], + "tags": [ + "Agents" ] }, "put": { - "tags": [ - "Agents" - ], "operationId": "update_global_skill", "parameters": [ { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -87632,14 +88408,14 @@ }, "responses": { "200": { - "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SkillDefinitionResponse" } } - } + }, + "description": "" }, "401": { "description": "Unauthorized" @@ -87652,18 +88428,20 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Agents" - ], - "operationId": "delete_global_skill", + ] + } + }, + "/settings/skills/{slug}/archive": { + "get": { + "operationId": "download_global_skill_archive", "parameters": [ { - "name": "slug", - "in": "path", "description": "Skill slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -87671,79 +88449,136 @@ } ], "responses": { - "204": { - "description": "Skill deleted" + "200": { + "content": { + "application/gzip": {} + }, + "description": "Skill archive tar.gz" }, "401": { "description": "Unauthorized" }, "404": { - "description": "Skill not found" + "description": "Skill not found or has no archive" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Download a skill's archive (tar.gz) — global.", + "tags": [ + "Agents" ] } }, - "/settings/skills/{slug}/archive": { + "/settings/update": { "get": { - "tags": [ - "Agents" - ], - "summary": "Download a skill's archive (tar.gz) \u2014 global.", - "operationId": "download_global_skill_archive", - "parameters": [ + "operationId": "get_update_capability", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCapabilityResponse" + } + } + }, + "description": "Self-update capability for this install" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Insufficient permissions" + } + }, + "security": [ { - "name": "slug", - "in": "path", - "description": "Skill slug", - "required": true, - "schema": { - "type": "string" - } + "bearer_auth": [] } ], + "summary": "Report whether a release update can be applied from the console.", + "tags": [ + "Settings" + ] + }, + "post": { + "description": "Returns as soon as the attempt is accepted: the download and swap run in the\nbackground and the process then exits so its supervisor restarts it on the\nnew binary. Poll `GET /settings/update` for progress — after the restart,\n`last_attempt` carries the outcome.", + "operationId": "start_update", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StartUpdateRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "Skill archive tar.gz", + "202": { "content": { - "application/gzip": {} - } + "application/json": { + "schema": { + "$ref": "#/components/schemas/StartUpdateResponse" + } + } + }, + "description": "Update accepted; the server will restart" }, "401": { "description": "Unauthorized" }, - "404": { - "description": "Skill not found or has no archive" + "403": { + "description": "Insufficient permissions" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "Update unavailable or already running" + }, + "501": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "This process cannot apply updates" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Install a release and restart the server.", + "tags": [ + "Settings" ] } }, "/settings/update-status": { "get": { - "tags": [ - "Settings" - ], - "summary": "Report whether a newer temps release is available for this install.", "operationId": "get_update_status", "responses": { "200": { - "description": "Release update status for this install", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateStatusResponse" } } - } + }, + "description": "Release update status for this install" }, "401": { "description": "Unauthorized" @@ -87756,49 +88591,102 @@ { "bearer_auth": [] } + ], + "summary": "Report whether a newer temps release is available for this install.", + "tags": [ + "Settings" + ] + } + }, + "/settings/update/check": { + "post": { + "operationId": "check_for_update", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReleaseCheckResult" + } + } + }, + "description": "Result of the release check" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Insufficient permissions" + }, + "501": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "This process cannot check for updates" + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + }, + "description": "The release API could not be reached" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "summary": "Ask the release API for the newest version on this install's channel, now,\ninstead of waiting for the background notifier's next pass.", + "tags": [ + "Settings" ] } }, "/teams": { "get": { - "tags": [ - "Teams" - ], "operationId": "list_teams", "parameters": [ { - "name": "page", - "in": "query", "description": "1-indexed page", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "default 20, max 100", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Paginated teams", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TeamListResponse" } } - } + }, + "description": "Paginated teams" }, "401": { "description": "Unauthorized" @@ -87811,12 +88699,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] }, "post": { - "tags": [ - "Teams" - ], "operationId": "create_team", "requestBody": { "content": { @@ -87830,14 +88718,14 @@ }, "responses": { "201": { - "description": "Team created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TeamResponse" } } - } + }, + "description": "Team created" }, "400": { "description": "Validation error" @@ -87853,37 +88741,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/teams/{team_id}": { - "get": { - "tags": [ - "Teams" - ], - "operationId": "get_team", + "delete": { + "operationId": "delete_team", "parameters": [ { - "name": "team_id", - "in": "path", "description": "Team id", + "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Team", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamResponse" - } - } - } + "204": { + "description": "Team deleted" }, "403": { "description": "Insufficient permissions" @@ -87896,28 +88777,35 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Teams" - ], - "operationId": "delete_team", + ] + }, + "get": { + "operationId": "get_team", "parameters": [ { - "name": "team_id", - "in": "path", "description": "Team id", + "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Team deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamResponse" + } + } + }, + "description": "Team" }, "403": { "description": "Insufficient permissions" @@ -87930,22 +88818,22 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] }, "patch": { - "tags": [ - "Teams" - ], "operationId": "update_team", "parameters": [ { - "name": "team_id", - "in": "path", "description": "Team id", + "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -87961,14 +88849,14 @@ }, "responses": { "200": { - "description": "Updated team", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TeamResponse" } } - } + }, + "description": "Updated team" }, "400": { "description": "Validation error" @@ -87984,39 +88872,39 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/teams/{team_id}/members": { "get": { - "tags": [ - "Teams" - ], "operationId": "list_team_members", "parameters": [ { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Members", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/TeamMemberResponse" - } + }, + "type": "array" } } - } + }, + "description": "Members" }, "403": { "description": "Insufficient permissions" @@ -88029,21 +88917,21 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] }, "post": { - "tags": [ - "Teams" - ], "operationId": "add_team_member", "parameters": [ { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88059,14 +88947,14 @@ }, "responses": { "201": { - "description": "Member added", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TeamMemberResponse" } } - } + }, + "description": "Member added" }, "403": { "description": "Insufficient permissions" @@ -88082,32 +88970,32 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/teams/{team_id}/members/{user_id}": { "delete": { - "tags": [ - "Teams" - ], "operationId": "remove_team_member", "parameters": [ { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "user_id", "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88126,30 +89014,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] }, "patch": { - "tags": [ - "Teams" - ], "operationId": "update_team_member_role", "parameters": [ { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "user_id", "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88165,14 +89053,14 @@ }, "responses": { "200": { - "description": "Updated membership", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TeamMemberResponse" } } - } + }, + "description": "Updated membership" }, "403": { "description": "Insufficient permissions" @@ -88185,39 +89073,39 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/teams/{team_id}/projects": { "get": { - "tags": [ - "Teams" - ], "operationId": "list_team_projects", "parameters": [ { - "name": "team_id", "in": "path", + "name": "team_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Projects this team has access to", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/ProjectAccessResponse" - } + }, + "type": "array" } } - } + }, + "description": "Projects this team has access to" }, "403": { "description": "Insufficient permissions" @@ -88230,31 +89118,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Teams" ] } }, "/templates": { "get": { - "tags": [ - "Templates" - ], - "summary": "List all available templates", "description": "Returns a list of all public templates, optionally filtered by tag or featured status.", "operationId": "list_project_templates", "parameters": [ { - "name": "tag", - "in": "query", "description": "Filter templates by tag", + "in": "query", + "name": "tag", "required": false, "schema": { "type": "string" } }, { - "name": "featured", - "in": "query", "description": "Only return featured templates", + "in": "query", + "name": "featured", "required": false, "schema": { "type": "boolean" @@ -88263,14 +89150,14 @@ ], "responses": { "200": { - "description": "List of templates", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListTemplatesResponse" } } - } + }, + "description": "List of templates" }, "401": { "description": "Unauthorized" @@ -88283,27 +89170,27 @@ { "bearer_auth": [] } + ], + "summary": "List all available templates", + "tags": [ + "Templates" ] } }, "/templates/tags": { "get": { - "tags": [ - "Templates" - ], - "summary": "List all available template tags", "description": "Returns a list of all unique tags used by public templates.", "operationId": "list_project_template_tags", "responses": { "200": { - "description": "List of tags", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListTagsResponse" } } - } + }, + "description": "List of tags" }, "401": { "description": "Unauthorized" @@ -88316,22 +89203,22 @@ { "bearer_auth": [] } + ], + "summary": "List all available template tags", + "tags": [ + "Templates" ] } }, "/templates/{slug}": { "get": { - "tags": [ - "Templates" - ], - "summary": "Get a specific template by slug", "description": "Returns detailed information about a single template.", "operationId": "get_project_template", "parameters": [ { - "name": "slug", - "in": "path", "description": "Template slug", + "in": "path", + "name": "slug", "required": true, "schema": { "type": "string" @@ -88340,14 +89227,14 @@ ], "responses": { "200": { - "description": "Template details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TemplateResponse" } } - } + }, + "description": "Template details" }, "401": { "description": "Unauthorized" @@ -88363,25 +89250,26 @@ { "bearer_auth": [] } + ], + "summary": "Get a specific template by slug", + "tags": [ + "Templates" ] } }, "/user/me": { "get": { - "tags": [ - "Authentication" - ], "operationId": "get_current_user", "responses": { "200": { - "description": "Successfully retrieved user information", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" } } - } + }, + "description": "Successfully retrieved user information" }, "401": { "description": "Unauthorized" @@ -88394,20 +89282,20 @@ { "session_token": [] } + ], + "tags": [ + "Authentication" ] } }, "/users": { "get": { - "tags": [ - "Users" - ], "operationId": "list_users", "parameters": [ { - "name": "include_deleted", - "in": "query", "description": "Include deleted users in the response", + "in": "query", + "name": "include_deleted", "required": true, "schema": { "type": "boolean" @@ -88416,17 +89304,17 @@ ], "responses": { "200": { - "description": "List all users with their roles", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/RouteUserWithRoles" - } + }, + "type": "array" } } - } + }, + "description": "List all users with their roles" }, "500": { "description": "Internal server error" @@ -88436,13 +89324,12 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] }, "post": { - "tags": [ - "Users" - ], - "summary": "Create a new user with roles", "operationId": "create_user", "requestBody": { "content": { @@ -88456,14 +89343,14 @@ }, "responses": { "201": { - "description": "User created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteUserWithRoles" } } - } + }, + "description": "User created successfully" }, "400": { "description": "Invalid input" @@ -88476,15 +89363,15 @@ { "bearer_auth": [] } + ], + "summary": "Create a new user with roles", + "tags": [ + "Users" ] } }, "/users/me": { "patch": { - "tags": [ - "Users" - ], - "summary": "Update current user's information", "operationId": "update_self", "requestBody": { "content": { @@ -88498,14 +89385,14 @@ }, "responses": { "200": { - "description": "User updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteUserWithRoles" } } - } + }, + "description": "User updated successfully" }, "400": { "description": "Invalid input" @@ -88521,14 +89408,15 @@ { "bearer_auth": [] } + ], + "summary": "Update current user's information", + "tags": [ + "Users" ] } }, "/users/me/mfa": { "delete": { - "tags": [ - "Users" - ], "operationId": "disable_mfa", "requestBody": { "content": { @@ -88558,29 +89446,32 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/me/mfa/setup": { "post": { - "tags": [ - "Users" - ], "operationId": "setup_mfa", "responses": { "200": { - "description": "MFA setup data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MfaSetupResponse" } } - } + }, + "description": "MFA setup data" }, "401": { "description": "Unauthorized" }, + "409": { + "description": "MFA is already enabled; verify and disable it before re-enrollment" + }, "500": { "description": "Internal server error" } @@ -88589,14 +89480,14 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/me/mfa/verify": { "post": { - "tags": [ - "Users" - ], "operationId": "verify_and_enable_mfa", "requestBody": { "content": { @@ -88626,14 +89517,14 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/me/password": { "post": { - "tags": [ - "Users" - ], "operationId": "change_password_self", "requestBody": { "content": { @@ -88666,25 +89557,24 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/{user_id}": { "delete": { - "tags": [ - "Users" - ], - "summary": "Delete a user", "operationId": "delete_user", "parameters": [ { - "name": "user_id", - "in": "path", "description": "User ID", + "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88709,23 +89599,23 @@ { "bearer_auth": [] } + ], + "summary": "Delete a user", + "tags": [ + "Users" ] }, "patch": { - "tags": [ - "Users" - ], - "summary": "Update user information (admin only)", "operationId": "update_user", "parameters": [ { - "name": "user_id", - "in": "path", "description": "User ID", + "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88741,14 +89631,14 @@ }, "responses": { "200": { - "description": "User updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteUserWithRoles" } } - } + }, + "description": "User updated successfully" }, "400": { "description": "Invalid input" @@ -88770,37 +89660,38 @@ { "bearer_auth": [] } + ], + "summary": "Update user information (admin only)", + "tags": [ + "Users" ] } }, "/users/{user_id}/restore": { "post": { - "tags": [ - "Users" - ], "operationId": "restore_user", "parameters": [ { - "name": "user_id", - "in": "path", "description": "User ID", + "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "User restored successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RouteUserWithRoles" } } - } + }, + "description": "User restored successfully" }, "400": { "description": "User is not deleted" @@ -88822,24 +89713,24 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/{user_id}/roles": { "post": { - "tags": [ - "Users" - ], "operationId": "assign_role", "parameters": [ { - "name": "user_id", - "in": "path", "description": "User ID", + "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -88877,30 +89768,30 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/users/{user_id}/roles/{role_type}": { "delete": { - "tags": [ - "Users" - ], "operationId": "remove_role", "parameters": [ { - "name": "user_id", - "in": "path", "description": "User ID", + "in": "path", + "name": "user_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "role_type", - "in": "path", "description": "Role type to remove", + "in": "path", + "name": "role_type", "required": true, "schema": { "type": "string" @@ -88931,61 +89822,61 @@ { "bearer_auth": [] } + ], + "tags": [ + "Users" ] } }, "/v1/sandboxes": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "list_sandboxes", "parameters": [ { - "name": "page", - "in": "query", "description": "Page (1-indexed)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Items per page (default 20, max 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "List sandboxes", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListSandboxesResponse" } } - } + }, + "description": "List sandboxes" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] }, "post": { - "tags": [ - "Sandboxes" - ], "operationId": "create_sandbox", "requestBody": { "content": { @@ -88999,14 +89890,14 @@ }, "responses": { "201": { - "description": "Sandbox created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Sandbox created" }, "400": { "description": "Validation error" @@ -89022,15 +89913,14 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/rootfs": { "get": { - "tags": [ - "Sandboxes" - ], - "summary": "Inspect rootfs storage: the Firecracker digest-keyed cache (with which\nsandboxes reference each entry) and per-VM disks. Empty on Docker-only\nhosts. Admin/read scope \u2014 this exposes host storage layout.", "operationId": "rootfs_report", "responses": { "200": { @@ -89041,15 +89931,15 @@ { "bearer_auth": [] } + ], + "summary": "Inspect rootfs storage: the Firecracker digest-keyed cache (with which\nsandboxes reference each entry) and per-VM disks. Empty on Docker-only\nhosts. Admin/read scope — this exposes host storage layout.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/rootfs/gc": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Reclaim rootfs cache entries not backing any live sandbox. Idempotent;\nsafe to call any time (live VMs hold their own per-VM disks).", "operationId": "rootfs_gc", "responses": { "200": { @@ -89060,19 +89950,20 @@ { "bearer_auth": [] } + ], + "summary": "Reclaim rootfs cache entries not backing any live sandbox. Idempotent;\nsafe to call any time (live VMs hold their own per-VM disks).", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "get_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89081,14 +89972,14 @@ ], "responses": { "200": { - "description": "Sandbox details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Sandbox details" }, "404": { "description": "Not found" @@ -89098,21 +89989,20 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/cmd": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Run a command inside the sandbox (`@vercel/sandbox`-compatible).", "description": "`wait=false` (default) returns `{ command: {..., exitCode: null} }`\nimmediately once the background task is spawned.\n\n`wait=true` streams `application/x-ndjson`: the first line is the\nrunning envelope, the second is the finished envelope with `exitCode`.", "operationId": "cmd", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89131,14 +90021,14 @@ }, "responses": { "200": { - "description": "Command started (wait=false) or finished (wait=true)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CmdResponse" } } - } + }, + "description": "Command started (wait=false) or finished (wait=true)" }, "404": { "description": "Sandbox not found" @@ -89148,27 +90038,28 @@ { "bearer_auth": [] } + ], + "summary": "Run a command inside the sandbox (`@vercel/sandbox`-compatible).", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/cmd/{cmd_id}": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "get_cmd", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "cmd_id", "in": "path", + "name": "cmd_id", "required": true, "schema": { "type": "string" @@ -89177,14 +90068,14 @@ ], "responses": { "200": { - "description": "Command snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CmdResponse" } } - } + }, + "description": "Command snapshot" }, "404": { "description": "Sandbox or command not found" @@ -89194,28 +90085,27 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/cmd/{cmd_id}/logs": { "get": { - "tags": [ - "Sandboxes" - ], - "summary": "Stream a command's stdout/stderr as `application/x-ndjson`\n(`@vercel/sandbox`-compatible). Each line is either\n`{stream:\"stdout\"|\"stderr\", data:\"...\"}` or\n`{stream:\"error\", data:{code, message}}`.", "operationId": "cmd_logs", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "cmd_id", "in": "path", + "name": "cmd_id", "required": true, "schema": { "type": "string" @@ -89234,19 +90124,20 @@ { "bearer_auth": [] } + ], + "summary": "Stream a command's stdout/stderr as `application/x-ndjson`\n(`@vercel/sandbox`-compatible). Each line is either\n`{stream:\"stdout\"|\"stderr\", data:\"...\"}` or\n`{stream:\"error\", data:{code, message}}`.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/destroy": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "destroy_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89261,37 +90152,37 @@ "description": "Not found" }, "409": { - "description": "Sandbox belongs to an active agent run \u2014 stop the run instead" + "description": "Sandbox belongs to an active agent run — stop the run instead" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/domain": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "domain", "parameters": [ { - "name": "port", - "in": "query", "description": "Port inside the sandbox (1..=65535)", + "in": "query", + "name": "port", "required": true, "schema": { - "type": "integer", "format": "int32", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89300,14 +90191,14 @@ ], "responses": { "200": { - "description": "Preview URL for the port", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxDomainResponse" } } - } + }, + "description": "Preview URL for the port" }, "400": { "description": "Invalid port" @@ -89320,20 +90211,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/events": { "get": { - "tags": [ - "Sandboxes" - ], - "summary": "The operations timeline for a sandbox (lifecycle events only \u2014 never\nshell/exec activity), newest first.", "operationId": "list_events", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89342,33 +90232,34 @@ ], "responses": { "200": { - "description": "Operations timeline", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxEventsResponse" } } - } + }, + "description": "Operations timeline" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "The operations timeline for a sandbox (lifecycle events only — never\nshell/exec activity), newest first.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/exec": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "exec", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89387,14 +90278,14 @@ }, "responses": { "200": { - "description": "Command finished (non-zero exit is NOT an error)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExecResponse" } } - } + }, + "description": "Command finished (non-zero exit is NOT an error)" }, "404": { "description": "Sandbox not found" @@ -89404,19 +90295,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/exec-detached": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "exec_detached", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89435,14 +90326,14 @@ }, "responses": { "202": { - "description": "Command accepted; poll /jobs/{job_id}", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExecDetachedResponse" } } - } + }, + "description": "Command accepted; poll /jobs/{job_id}" }, "404": { "description": "Sandbox not found" @@ -89452,19 +90343,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/extend-timeout": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "extend_timeout", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89483,14 +90374,14 @@ }, "responses": { "200": { - "description": "Timeout extended", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Timeout extended" }, "400": { "description": "Validation error" @@ -89503,19 +90394,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/fs/mkdir": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "mkdir", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89544,28 +90435,28 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/fs/read": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "read_file", "parameters": [ { - "name": "path", - "in": "query", "description": "Absolute file path inside the sandbox", + "in": "query", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89574,14 +90465,14 @@ ], "responses": { "200": { - "description": "File contents (base64)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReadFileResponse" } } - } + }, + "description": "File contents (base64)" }, "400": { "description": "Validation error" @@ -89594,28 +90485,28 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/fs/stat": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "stat_path", "parameters": [ { - "name": "path", - "in": "query", "description": "Absolute path inside the sandbox", + "in": "query", + "name": "path", "required": true, "schema": { "type": "string" } }, { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89624,14 +90515,14 @@ ], "responses": { "200": { - "description": "Stat info (exists=false when missing \u2014 not an error)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatResponse" } } - } + }, + "description": "Stat info (exists=false when missing — not an error)" }, "400": { "description": "Validation error" @@ -89641,21 +90532,20 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/fs/write": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Write a file into the sandbox. Accepts two body shapes \u2014 the SDK\npicks one based on `Content-Type`:", - "description": "- **`application/json`** (temps-native): `{path, contents_b64, mode}`\n \u2014 one file, base64-encoded.\n- **`application/gzip`** (`@vercel/sandbox`): a gzipped tarball of\n one-or-more entries, with the target extract dir carried in the\n `x-cwd` header. The SDK's `writeFile` and `writeFiles` both post\n here; they differ only in how many entries the tarball contains.\n\nWhy merge them on one route: the SDK is hardcoded to\n`POST /fs/write`, so splitting tar uploads onto a separate path would\nforce us to break SDK compat. Instead we dispatch on Content-Type,\npreserve JSON for native callers, and add tar for SDK callers.", + "description": "- **`application/json`** (temps-native): `{path, contents_b64, mode}`\n — one file, base64-encoded.\n- **`application/gzip`** (`@vercel/sandbox`): a gzipped tarball of\n one-or-more entries, with the target extract dir carried in the\n `x-cwd` header. The SDK's `writeFile` and `writeFiles` both post\n here; they differ only in how many entries the tarball contains.\n\nWhy merge them on one route: the SDK is hardcoded to\n`POST /fs/write`, so splitting tar uploads onto a separate path would\nforce us to break SDK compat. Instead we dispatch on Content-Type,\npreserve JSON for native callers, and add tar for SDK callers.", "operationId": "write_file", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89690,20 +90580,20 @@ { "bearer_auth": [] } + ], + "summary": "Write a file into the sandbox. Accepts two body shapes — the SDK\npicks one based on `Content-Type`:", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/fs/write-batch": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Batch-write multiple files in a single request. Mirrors\n`@vercel/sandbox` `writeFiles()`. Semantics are fail-fast: if any\nfile errors, previously-written entries are left in place and the\nerror describes which file broke.", "operationId": "write_files", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89722,14 +90612,14 @@ }, "responses": { "200": { - "description": "All files written", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WriteFilesResponse" } } - } + }, + "description": "All files written" }, "400": { "description": "Validation error or invalid base64" @@ -89742,19 +90632,20 @@ { "bearer_auth": [] } + ], + "summary": "Batch-write multiple files in a single request. Mirrors\n`@vercel/sandbox` `writeFiles()`. Semantics are fail-fast: if any\nfile errors, previously-written entries are left in place and the\nerror describes which file broke.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/jobs": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "list_jobs", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89763,14 +90654,14 @@ ], "responses": { "200": { - "description": "Detached jobs for this sandbox", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ListJobsResponse" } } - } + }, + "description": "Detached jobs for this sandbox" }, "404": { "description": "Sandbox not found" @@ -89780,27 +90671,27 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/jobs/{job_id}": { "get": { - "tags": [ - "Sandboxes" - ], "operationId": "job_status", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "job_id", "in": "path", + "name": "job_id", "required": true, "schema": { "type": "string" @@ -89809,14 +90700,14 @@ ], "responses": { "200": { - "description": "Job status snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusResponse" } } - } + }, + "description": "Job status snapshot" }, "404": { "description": "Sandbox or job not found" @@ -89826,28 +90717,27 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/jobs/{job_id}/kill": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Terminate a detached job. Aborts the server-side tracking task and\nsends SIGTERM (or SIGKILL if `force=true`) to any matching processes\ninside the sandbox container. Returns 204 on success; 404 if the\nsandbox or job is unknown.", "operationId": "kill_job", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "job_id", "in": "path", + "name": "job_id", "required": true, "schema": { "type": "string" @@ -89876,29 +90766,29 @@ { "bearer_auth": [] } + ], + "summary": "Terminate a detached job. Aborts the server-side tracking task and\nsends SIGTERM (or SIGKILL if `force=true`) to any matching processes\ninside the sandbox container. Returns 204 on success; 404 if the\nsandbox or job is unknown.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/jobs/{job_id}/logs": { "get": { - "tags": [ - "Sandboxes" - ], - "summary": "SSE endpoint streaming each stdout/stderr line from a detached job\nas it's produced. Mirrors the `Command.logs()` async iterator shape\non `@vercel/sandbox` \u2014 events carry `{ stream, data }`.", "description": "Late subscribers only see events produced after they connect. The\nJobState snapshot (`GET /jobs/{job_id}`) covers the history.\n\nA \"done\" sentinel event fires when the broadcast channel closes\n(the exec task has exited and dropped the sender), signalling\ncallers they can stop reading.", "operationId": "job_logs", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "job_id", "in": "path", + "name": "job_id", "required": true, "schema": { "type": "string" @@ -89917,19 +90807,20 @@ { "bearer_auth": [] } + ], + "summary": "SSE endpoint streaming each stdout/stderr line from a detached job\nas it's produced. Mirrors the `Command.logs()` async iterator shape\non `@vercel/sandbox` — events carry `{ stream, data }`.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/pause": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "pause_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89938,14 +90829,14 @@ ], "responses": { "200": { - "description": "Sandbox paused (container stopped, state preserved)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Sandbox paused (container stopped, state preserved)" }, "404": { "description": "Not found" @@ -89958,21 +90849,20 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/preview-link": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Mint a shareable link to a sandbox preview.", - "description": "`GET /domain` returns the bare preview URL, which is useless to anyone who\ndoes not already hold the sandbox's preview password \u2014 so sharing a\nprotected preview meant sharing that password, which is the same secret for\nevery recipient and can only be withdrawn by rotating it for all of them.\n\nThis returns the same URL carrying a short-lived, sandbox-scoped grant. The\nrecipient's browser exchanges it for the ordinary preview cookie and lands\non `path`. The grant never reaches the sandbox, so preview application code\ncannot read it and re-share it.\n\nAnyone holding the returned URL can view the preview until it expires;\nthere is no per-link revocation short of rotating the preview password.", + "description": "`GET /domain` returns the bare preview URL, which is useless to anyone who\ndoes not already hold the sandbox's preview password — so sharing a\nprotected preview meant sharing that password, which is the same secret for\nevery recipient and can only be withdrawn by rotating it for all of them.\n\nThis returns the same URL carrying a short-lived, sandbox-scoped grant. The\nrecipient's browser exchanges it for the ordinary preview cookie and lands\non `path`. The grant never reaches the sandbox, so preview application code\ncannot read it and re-share it.\n\nAnyone holding the returned URL can view the preview until it expires;\nthere is no per-link revocation short of rotating the preview password.", "operationId": "sandbox_create_preview_link", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -89991,14 +90881,14 @@ }, "responses": { "200": { - "description": "Shareable preview link", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PreviewShareLinkResponse" } } - } + }, + "description": "Shareable preview link" }, "400": { "description": "Invalid port" @@ -90017,19 +90907,49 @@ { "bearer_auth": [] } + ], + "summary": "Mint a shareable link to a sandbox preview.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/preview-password": { - "put": { + "delete": { + "operationId": "clear_preview_password", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Preview password removed (sandbox is now URL-only protected)" + }, + "404": { + "description": "Sandbox not found" + } + }, + "security": [ + { + "bearer_auth": [] + } + ], "tags": [ "Sandboxes" - ], + ] + }, + "put": { "operationId": "set_preview_password", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90048,14 +90968,14 @@ }, "responses": { "200": { - "description": "Preview password set or rotated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetPreviewPasswordResponse" } } - } + }, + "description": "Preview password set or rotated" }, "400": { "description": "Password too short or too long" @@ -90068,49 +90988,19 @@ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Sandboxes" - ], - "operationId": "clear_preview_password", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "Preview password removed (sandbox is now URL-only protected)" - }, - "404": { - "description": "Sandbox not found" - } - }, - "security": [ - { - "bearer_auth": [] - } ] } }, "/v1/sandboxes/{id}/resize": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Grow a Firecracker sandbox's root disk. Offline resize \u2014 the VM reboots\n(filesystem/data persist) rather than resizing fully live.", "operationId": "resize_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90129,14 +91019,14 @@ }, "responses": { "200": { - "description": "Resized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Resized" }, "400": { "description": "Invalid size or unsupported backend" @@ -90146,19 +91036,20 @@ { "bearer_auth": [] } + ], + "summary": "Grow a Firecracker sandbox's root disk. Offline resize — the VM reboots\n(filesystem/data persist) rather than resizing fully live.", + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/restart": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "restart_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90167,14 +91058,14 @@ ], "responses": { "200": { - "description": "Sandbox container restarted in place", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Sandbox container restarted in place" }, "404": { "description": "Not found" @@ -90187,19 +91078,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/resume": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "resume_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90208,14 +91099,14 @@ ], "responses": { "200": { - "description": "Sandbox resumed; expires_at refreshed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Sandbox resumed; expires_at refreshed" }, "404": { "description": "Not found" @@ -90228,19 +91119,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/source": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "source_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90259,14 +91150,14 @@ }, "responses": { "200": { - "description": "Source content seeded into the sandbox work dir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SandboxResponse" } } - } + }, + "description": "Source content seeded into the sandbox work dir" }, "400": { "description": "Validation error (embedded creds, conflicting fields, etc.)" @@ -90285,19 +91176,19 @@ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/stop": { "post": { - "tags": [ - "Sandboxes" - ], "operationId": "stop_sandbox", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" @@ -90312,35 +91203,34 @@ "description": "Not found" }, "409": { - "description": "Sandbox belongs to an active agent run \u2014 stop the run instead" + "description": "Sandbox belongs to an active agent run — stop the run instead" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Sandboxes" ] } }, "/v1/sandboxes/{id}/{cmd_id}/kill": { "post": { - "tags": [ - "Sandboxes" - ], - "summary": "Kill a running command (`@vercel/sandbox`-compatible). The SDK\ncalls `POST /v1/sandboxes/{id}/{cmdId}/kill` \u2014 note the path has the\ncommand ID directly under the sandbox, NOT under `/jobs/` or `/cmd/`.", "operationId": "cmd_kill", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { "type": "string" } }, { - "name": "cmd_id", "in": "path", + "name": "cmd_id", "required": true, "schema": { "type": "string" @@ -90358,14 +91248,14 @@ }, "responses": { "200": { - "description": "Command killed; returns final snapshot", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CmdResponse" } } - } + }, + "description": "Command killed; returns final snapshot" }, "404": { "description": "Sandbox or command not found" @@ -90375,287 +91265,287 @@ { "bearer_auth": [] } + ], + "summary": "Kill a running command (`@vercel/sandbox`-compatible). The SDK\ncalls `POST /v1/sandboxes/{id}/{cmdId}/kill` — note the path has the\ncommand ID directly under the sandbox, NOT under `/jobs/` or `/cmd/`.", + "tags": [ + "Sandboxes" ] } }, "/visitors/{visitor_id}/session-replays": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get session replays for a visitor", "operationId": "get_visitor_sessions", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (1-based)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "per_page", - "in": "query", "description": "Items per page", + "in": "query", + "name": "per_page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } } ], "responses": { "200": { - "description": "Session replays retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetVisitorSessionsResponse" } } - } + }, + "description": "Session replays retrieved successfully" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get session replays for a visitor", + "tags": [ + "Analytics" ] } }, "/visitors/{visitor_id}/session-replays/{session_id}": { - "get": { - "tags": [ - "Analytics" - ], - "summary": "Get session replay data with visitor info (without events)", - "operationId": "get_session_replay", + "delete": { + "operationId": "delete_session_replay", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], "responses": { "200": { - "description": "Session replay retrieved successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetSessionReplayResponse" - } - } - } + "description": "Session replay deleted successfully" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { - "tags": [ - "Analytics" ], "summary": "Delete a session replay", - "operationId": "delete_session_replay", + "tags": [ + "Analytics" + ] + }, + "get": { + "operationId": "get_session_replay", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "string" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Session replay deleted successfully" + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetSessionReplayResponse" + } + } + }, + "description": "Session replay retrieved successfully" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get session replay data with visitor info (without events)", + "tags": [ + "Analytics" ] } }, "/visitors/{visitor_id}/session-replays/{session_id}/duration": { "put": { - "tags": [ - "Analytics" - ], - "summary": "Update session duration", "operationId": "update_session_duration", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { "type": "string" @@ -90674,171 +91564,171 @@ }, "responses": { "200": { - "description": "Session duration updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateSessionDurationResponse" } } - } + }, + "description": "Session duration updated successfully" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Update session duration", + "tags": [ + "Analytics" ] } }, "/visitors/{visitor_id}/session-replays/{session_id}/events": { "get": { - "tags": [ - "Analytics" - ], - "summary": "Get session replay events (with session and visitor metadata)", "operationId": "get_session_replay_events", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Session replay with events retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SessionReplayWithEventsDto" } } - } + }, + "description": "Session replay with events retrieved successfully" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Get session replay events (with session and visitor metadata)", + "tags": [ + "Analytics" ] }, "post": { - "tags": [ - "Analytics" - ], - "summary": "Add events to an existing session", "operationId": "add_events", "parameters": [ { - "name": "visitor_id", - "in": "path", "description": "Visitor ID", + "in": "path", + "name": "visitor_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "session_id", - "in": "path", "description": "Session ID", + "in": "path", + "name": "session_id", "required": true, "schema": { "type": "string" @@ -90857,261 +91747,262 @@ }, "responses": { "200": { - "description": "Events added successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddEventsResponse" } } - } + }, + "description": "Events added successfully" }, "400": { - "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Bad request" }, "401": { - "description": "Authentication required", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Authentication required" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Session not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Session not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "summary": "Add events to an existing session", + "tags": [ + "Analytics" ] } }, "/vulnerability-scans/{scan_id}": { - "get": { - "tags": [ - "Vulnerability Scans" - ], - "operationId": "get_scan", + "delete": { + "operationId": "delete_scan", "parameters": [ { - "name": "scan_id", - "in": "path", "description": "Scan ID", + "in": "path", + "name": "scan_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "200": { - "description": "Scan details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScanResponse" - } - } - } + "204": { + "description": "Scan deleted" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Scan not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Scan not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } - ] - }, - "delete": { + ], "tags": [ "Vulnerability Scans" - ], - "operationId": "delete_scan", + ] + }, + "get": { + "operationId": "get_scan", "parameters": [ { - "name": "scan_id", - "in": "path", "description": "Scan ID", + "in": "path", + "name": "scan_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { - "204": { - "description": "Scan deleted" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScanResponse" + } + } + }, + "description": "Scan details" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Scan not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Scan not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/vulnerability-scans/{scan_id}/vulnerabilities": { "get": { - "tags": [ - "Vulnerability Scans" - ], "operationId": "get_scan_vulnerabilities", "parameters": [ { - "name": "scan_id", - "in": "path", "description": "Scan ID", + "in": "path", + "name": "scan_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } }, { - "name": "page", - "in": "query", "description": "Page number (default: 1)", + "in": "query", + "name": "page", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "page_size", - "in": "query", "description": "Page size (default: 20, max: 100)", + "in": "query", + "name": "page_size", "required": false, "schema": { - "type": "integer", "format": "int64", - "minimum": 0 + "minimum": 0, + "type": "integer" } }, { - "name": "severity", - "in": "query", "description": "Filter by severity (CRITICAL, HIGH, MEDIUM, LOW)", + "in": "query", + "name": "severity", "required": false, "schema": { "type": "string" @@ -91120,107 +92011,106 @@ ], "responses": { "200": { - "description": "List of vulnerabilities", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/VulnerabilityResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of vulnerabilities" }, "401": { - "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Unauthorized" }, "403": { - "description": "Insufficient permissions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Insufficient permissions" }, "404": { - "description": "Scan not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Scan not found" }, "500": { - "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } - } + }, + "description": "Internal server error" } }, "security": [ { "bearer_auth": [] } + ], + "tags": [ + "Vulnerability Scans" ] } }, "/webhook-event-types": { "get": { - "tags": [ - "Webhooks" - ], - "summary": "List available event types", "operationId": "list_event_types", "responses": { "200": { - "description": "List of available event types", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/EventTypeResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of available event types" } - } + }, + "summary": "List available event types", + "tags": [ + "Webhooks" + ] } }, "/weekly-digest/trigger": { "post": { - "tags": [ - "Notification Preferences" - ], - "summary": "Trigger weekly digest generation manually", "operationId": "trigger_weekly_digest", "responses": { "200": { - "description": "Weekly digest triggered successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TriggerDigestResponse" } } - } + }, + "description": "Weekly digest triggered successfully" }, "500": { "description": "Failed to generate digest" @@ -91230,30 +92120,30 @@ { "bearer_auth": [] } + ], + "summary": "Trigger weekly digest generation manually", + "tags": [ + "Notification Preferences" ] } }, "/x/plugins": { "get": { - "tags": [ - "External Plugins" - ], - "summary": "List all running external plugins and their manifests.", "description": "Requires only a valid session/token (no specific permission) since the\nmanifest drives sidebar navigation rendering for every authenticated\nuser, not just admins.", "operationId": "list_external_plugins", "responses": { "200": { - "description": "List of all running external plugins", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/PluginManifest" - } + }, + "type": "array" } } - } + }, + "description": "List of all running external plugins" }, "401": { "description": "Unauthorized" @@ -91263,27 +92153,27 @@ { "bearer_auth": [] } + ], + "summary": "List all running external plugins and their manifests.", + "tags": [ + "External Plugins" ] } }, "/x/plugins/reload": { "post": { - "tags": [ - "External Plugins" - ], - "summary": "Reload all external plugins.", "description": "Stops all running plugin processes, re-scans the plugins directory,\nstarts any discovered binaries, and hot-swaps the proxy router so new\nand removed plugins take effect immediately without a server restart.\n\nRequires `SystemAdmin` permission.", "operationId": "reload_plugins", "responses": { "200": { - "description": "Plugins reloaded successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReloadResponse" } } - } + }, + "description": "Plugins reloaded successfully" }, "401": { "description": "Unauthorized" @@ -91296,30 +92186,29 @@ { "bearer_auth": [] } + ], + "summary": "Reload all external plugins.", + "tags": [ + "External Plugins" ] } }, "/{project_id}/envelope/": { "post": { - "tags": [ - "sentry-ingestor" - ], - "summary": "Ingest a Sentry envelope (binary payload)", "operationId": "ingest_sentry_envelope", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "requestBody": { - "description": "Sentry envelope as binary data", "content": { "application/octet-stream": { "schema": { @@ -91327,6 +92216,7 @@ } } }, + "description": "Sentry envelope as binary data", "required": true }, "responses": { @@ -91342,25 +92232,25 @@ "413": { "description": "Request body too large (exceeds 2 MiB)" } - } + }, + "summary": "Ingest a Sentry envelope (binary payload)", + "tags": [ + "sentry-ingestor" + ] } }, "/{project_id}/store/": { "post": { - "tags": [ - "sentry-ingestor" - ], - "summary": "Ingest a Sentry event (JSON payload)", "operationId": "ingest_sentry_event", "parameters": [ { - "name": "project_id", - "in": "path", "description": "Project ID", + "in": "path", + "name": "project_id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], @@ -91376,14 +92266,14 @@ }, "responses": { "200": { - "description": "Event ingested", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SentryEventResponse" } } - } + }, + "description": "Event ingested" }, "400": { "description": "Bad request" @@ -91394,96 +92284,96 @@ "413": { "description": "Request body too large (exceeds 2 MiB)" } - } + }, + "summary": "Ingest a Sentry event (JSON payload)", + "tags": [ + "sentry-ingestor" + ] } }, "audit/logs": { "get": { - "tags": [ - "Audit Logs" - ], - "summary": "List audit logs with optional filtering", "operationId": "list_audit_logs", "parameters": [ { - "name": "operation_type", - "in": "query", "description": "Filter logs by operation type (omit for all)", + "example": "user.login", + "in": "query", + "name": "operation_type", "required": false, "schema": { "type": "string" - }, - "example": "user.login" + } }, { - "name": "user_id", - "in": "query", "description": "Filter logs by user ID (omit for all users)", + "example": 1, + "in": "query", + "name": "user_id", "required": false, "schema": { - "type": "integer", - "format": "int32" - }, - "example": 1 + "format": "int32", + "type": "integer" + } }, { - "name": "from", - "in": "query", "description": "Start timestamp (milliseconds since epoch)", + "example": 1, + "in": "query", + "name": "from", "required": false, "schema": { - "type": "string", - "format": "date-time" - }, - "example": 1 + "format": "date-time", + "type": "string" + } }, { - "name": "to", - "in": "query", "description": "End timestamp (milliseconds since epoch)", + "example": 1, + "in": "query", + "name": "to", "required": false, "schema": { - "type": "string", - "format": "date-time" - }, - "example": 1 + "format": "date-time", + "type": "string" + } }, { - "name": "limit", - "in": "query", "description": "Maximum number of logs to return", + "example": 100, + "in": "query", + "name": "limit", "required": false, "schema": { - "type": "integer", - "format": "int32" - }, - "example": 100 + "format": "int32", + "type": "integer" + } }, { - "name": "offset", - "in": "query", "description": "Number of logs to skip", + "example": 0, + "in": "query", + "name": "offset", "required": false, "schema": { - "type": "integer", - "format": "int32" - }, - "example": 0 + "format": "int32", + "type": "integer" + } } ], "responses": { "200": { - "description": "List of audit logs", "content": { "application/json": { "schema": { - "type": "array", "items": { "$ref": "#/components/schemas/AuditLogResponse" - } + }, + "type": "array" } } - } + }, + "description": "List of audit logs" }, "401": { "description": "Unauthorized" @@ -91499,37 +92389,37 @@ { "api_key": [] } + ], + "summary": "List audit logs with optional filtering", + "tags": [ + "Audit Logs" ] } }, "audit/logs/{id}": { "get": { - "tags": [ - "Audit Logs" - ], - "summary": "Get a specific audit log entry by ID", "operationId": "get_audit_log", "parameters": [ { - "name": "id", "in": "path", + "name": "id", "required": true, "schema": { - "type": "integer", - "format": "int32" + "format": "int32", + "type": "integer" } } ], "responses": { "200": { - "description": "Audit log details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuditLogResponse" } } - } + }, + "description": "Audit log details" }, "401": { "description": "Unauthorized" @@ -91548,513 +92438,276 @@ { "api_key": [] } - ] - } - }, - "/otel/span-stats": { - "get": { - "tags": [ - "Traces" - ], - "summary": "Rank operations by latency, volume, or inconsistency.", - "description": "Groups spans by `(project, service, span name)` over a bounded window and\nreturns count, error rate, total/min/max/avg/stddev duration, p50/p95/p99,\nand two variability ratios per operation. Sorting is what makes it useful:\n\n- `sort_by=total_time` (default) \u2014 where the wall-clock actually goes.\n- `sort_by=p95` / `p99` \u2014 what users actually feel.\n- `sort_by=variability` or `tail_ratio` \u2014 operations whose *spread* is the\n problem: the ones that take 40ms most of the time and 4s the rest.\n- `span_name=payments.charge` \u2014 the worst this one operation ever got, in\n `max_duration_ms`.\n\nPair the variability sorts with `min_count` \u2014 a ratio computed from three\nsamples is noise, and without a floor it outranks every real signal.\n\nTwo bounds are enforced rather than clamped, so a result never claims to\ncover more than it does: at most 50 projects, and a window no wider than\n31 days. Both return 400. Unlike the trace list this report has no early\nexit \u2014 it aggregates every span in the window before it can rank anything.", - "operationId": "query_span_stats", - "parameters": [ - { - "name": "project_id", - "in": "query", - "description": "Single project to report on", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "project_ids", - "in": "query", - "description": "Comma-separated project ids, e.g. `4,5,6` (max 50)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "start_time", - "in": "query", - "description": "Window start (RFC 3339); defaults to 24h before end_time. The window may not exceed 31 days", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "end_time", - "in": "query", - "description": "Window end (RFC 3339); defaults to now", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "service_name", - "in": "query", - "description": "Restrict to one service", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "span_name", - "in": "query", - "description": "Restrict to one operation by exact span name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name_pattern", - "in": "query", - "description": "Case-insensitive substring match on the span name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "kind", - "in": "query", - "description": "server | client | internal | producer | consumer", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "ok | error | unset", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "environment_id", - "in": "query", - "description": "Restrict to one environment", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "deployment_id", - "in": "query", - "description": "Restrict to one deployment", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "attributes", - "in": "query", - "description": "Comma-separated key=value span attribute filters", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "min_duration_ms", - "in": "query", - "description": "Ignore spans faster than this", - "required": false, - "schema": { - "type": "number", - "format": "double" - } - }, - { - "name": "min_count", - "in": "query", - "description": "Drop operations with fewer samples than this", - "required": false, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 0 - } - }, - { - "name": "sort_by", - "in": "query", - "description": "total_time | p50 | p95 | p99 | max | avg | stddev | count | errors | error_rate | variability | tail_ratio", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_order", - "in": "query", - "description": "asc | desc (default)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (default 20, max 100)", - "required": false, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 0 - } - }, - { - "name": "offset", - "in": "query", - "description": "Page offset", - "required": false, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 0 - } - } ], - "responses": { - "200": { - "description": "Per-operation latency statistics", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SpanStatsResponse" - } - } - } - }, - "400": { - "description": "Invalid query (no project, empty window)", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "403": { - "description": "Insufficient permissions", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProblemDetails" - } - } - } - } - }, - "security": [ - { - "bearer_auth": [] - } + "summary": "Get a specific audit log entry by ID", + "tags": [ + "Audit Logs" ] } } }, "servers": [ { - "url": "/api", - "description": "Base path for all API endpoints" + "description": "Base path for all API endpoints", + "url": "/api" } ], "tags": [ { - "name": "Events", - "description": "Analytics events tracking endpoints" + "description": "Analytics events tracking endpoints", + "name": "Events" }, { - "name": "Metrics", - "description": "Analytics metrics collection endpoints including performance web vitals" + "description": "Analytics metrics collection endpoints including performance web vitals", + "name": "Metrics" }, { - "name": "Funnels", - "description": "Funnel management endpoints" + "description": "Funnel management endpoints", + "name": "Funnels" }, { - "name": "Analytics", - "description": "Analytics and session replay management" + "description": "Analytics and session replay management", + "name": "Analytics" }, { - "name": "Performance", - "description": "Performance metrics management" + "description": "Performance metrics management", + "name": "Performance" }, { - "name": "geo", - "description": "Geolocation API endpoints" + "description": "Geolocation API endpoints", + "name": "geo" }, { - "name": "Platform", - "description": "Platform information and compatibility" + "description": "Platform information and compatibility", + "name": "Platform" }, { - "name": "Teams", - "description": "Teams and project-scoped access" + "description": "Teams and project-scoped access", + "name": "Teams" }, { - "name": "Git Providers", - "description": "Git provider management endpoints" + "description": "Git provider management endpoints", + "name": "Git Providers" }, { - "name": "Repositories", - "description": "Repository management endpoints" + "description": "Repository management endpoints", + "name": "Repositories" }, { - "name": "Public Repositories", - "description": "Endpoints for accessing public repositories without authentication. Supports GitHub and GitLab." + "description": "Endpoints for accessing public repositories without authentication. Supports GitHub and GitLab.", + "name": "Public Repositories" }, { - "name": "Notification Providers", - "description": "Notification provider management endpoints" + "description": "Notification provider management endpoints", + "name": "Notification Providers" }, { - "name": "Notification Preferences", - "description": "User notification preferences and settings" + "description": "User notification preferences and settings", + "name": "Notification Preferences" }, { - "name": "DNS Providers", - "description": "DNS provider management endpoints" + "description": "DNS provider management endpoints", + "name": "DNS Providers" }, { - "name": "Internal DNS", - "description": "Per-node DNS resolver sync (ADR-011)" + "description": "Per-node DNS resolver sync (ADR-011)", + "name": "Internal DNS" }, { - "name": "Domains", - "description": "Domain management endpoints" + "description": "Domain management endpoints", + "name": "Domains" }, { - "name": "Email Providers", - "description": "Email provider management endpoints" + "description": "Email provider management endpoints", + "name": "Email Providers" }, { - "name": "Email Domains", - "description": "Email domain management and verification" + "description": "Email domain management and verification", + "name": "Email Domains" }, { - "name": "Emails", - "description": "Email sending and retrieval" + "description": "Email sending and retrieval", + "name": "Emails" }, { - "name": "Email Tracking", - "description": "Email open and click tracking" + "description": "Email open and click tracking", + "name": "Email Tracking" }, { - "name": "Email Validation", - "description": "Email address validation and verification" + "description": "Email address validation and verification", + "name": "Email Validation" }, { - "name": "Webhooks", - "description": "Webhook management endpoints" + "description": "Webhook management endpoints", + "name": "Webhooks" }, { - "name": "Webhook Deliveries", - "description": "Webhook delivery history and retry endpoints" + "description": "Webhook delivery history and retry endpoints", + "name": "Webhook Deliveries" }, { - "name": "External Services", - "description": "External service integration endpoints" + "description": "External service integration endpoints", + "name": "External Services" }, { - "name": "External Services - Query", - "description": "Data querying and exploration endpoints" + "description": "Data querying and exploration endpoints", + "name": "External Services - Query" }, { - "name": "Metrics", - "description": "Time-series metrics and alert rule endpoints" + "description": "Time-series metrics and alert rule endpoints", + "name": "Metrics" }, { - "name": "KV Store", - "description": "Key-Value storage operations" + "description": "Key-Value storage operations", + "name": "KV Store" }, { - "name": "KV Management", - "description": "KV service management operations" + "description": "KV service management operations", + "name": "KV Management" }, { - "name": "Blob", - "description": "Blob storage operations" + "description": "Blob storage operations", + "name": "Blob" }, { - "name": "Blob Management", - "description": "Blob service management operations" + "description": "Blob service management operations", + "name": "Blob Management" }, { - "name": "Feature Flags", - "description": "Runtime configuration that changes without a redeploy" + "description": "Runtime configuration that changes without a redeploy", + "name": "Feature Flags" }, { - "name": "Environments", - "description": "Environment management operations" + "description": "Environment management operations", + "name": "Environments" }, { - "name": "Secrets", - "description": "File-mounted secrets (/run/secrets/)" + "description": "File-mounted secrets (/run/secrets/)", + "name": "Secrets" }, { - "name": "Projects", - "description": "Project management endpoints" + "description": "Project management endpoints", + "name": "Projects" }, { - "name": "Presets", - "description": "Available deployment presets" + "description": "Available deployment presets", + "name": "Presets" }, { - "name": "Templates", - "description": "Project template endpoints" + "description": "Project template endpoints", + "name": "Templates" }, { - "name": "Custom Domains", - "description": "Custom domain management for projects" + "description": "Custom domain management for projects", + "name": "Custom Domains" }, { - "name": "error-tracking", - "description": "Error tracking data fetching endpoints" + "description": "Error tracking data fetching endpoints", + "name": "error-tracking" }, { - "name": "Vulnerability Scans", - "description": "Vulnerability scan management endpoints" + "description": "Vulnerability scan management endpoints", + "name": "Vulnerability Scans" }, { - "name": "Agents", - "description": "Autonomous AI agents, autofixer (interactive AI debugging), skills/MCP definitions, and preview gateway management." + "description": "Autonomous AI agents, autofixer (interactive AI debugging), skills/MCP definitions, and preview gateway management.", + "name": "Agents" }, { - "name": "Crons", - "description": "Cron jobs management API" + "description": "Cron jobs management API", + "name": "Crons" }, { - "name": "Sandboxes", - "description": "Standalone sandbox API (`/v1/sandboxes/*`) for running isolated containers." + "description": "Standalone sandbox API (`/v1/sandboxes/*`) for running isolated containers.", + "name": "Sandboxes" }, { - "name": "Logs", - "description": "Log search, context, live tail, and retention management" + "description": "Log search, context, live tail, and retention management", + "name": "Logs" }, { - "name": "Imports", - "description": "Import workloads from external sources" + "description": "Import workloads from external sources", + "name": "Imports" }, { - "name": "Status Page", - "description": "Status page and monitoring endpoints" + "description": "Status page and monitoring endpoints", + "name": "Status Page" }, { - "name": "OTel Ingest", - "description": "OTLP/HTTP ingest endpoints (protobuf)" + "description": "OTLP/HTTP ingest endpoints (protobuf)", + "name": "OTel Ingest" }, { - "name": "OTel", - "description": "Query endpoints for the monitoring UI" + "description": "Query endpoints for the monitoring UI", + "name": "OTel" }, { - "name": "GenAI", - "description": "GenAI agent activity tracing endpoints" + "description": "GenAI agent activity tracing endpoints", + "name": "GenAI" }, { - "name": "Alarms", - "description": "Unified alarm history \u2014 list, summarise, acknowledge, resolve" + "description": "Unified alarm history — list, summarise, acknowledge, resolve", + "name": "Alarms" }, { - "name": "Authentication", - "description": "Authentication and authorization endpoints" + "description": "Authentication and authorization endpoints", + "name": "Authentication" }, { - "name": "Users", - "description": "User management endpoints" + "description": "User management endpoints", + "name": "Users" }, { - "name": "Backups", - "description": "Backup management endpoints" + "description": "Backup management endpoints", + "name": "Backups" }, { - "name": "Restore", - "description": "External service restore operations" + "description": "External service restore operations", + "name": "Restore" }, { - "name": "Revenue", - "description": "Per-project revenue tracking integrations and analytics" + "description": "Per-project revenue tracking integrations and analytics", + "name": "Revenue" }, { - "name": "Observability", - "description": "Unified observability event stream \u2014 runtime logs, requests, spans, errors, revenue" + "description": "Unified observability event stream — runtime logs, requests, spans, errors, revenue", + "name": "Observability" }, { - "name": "AI Gateway", - "description": "OpenAI-compatible chat, embeddings, and model endpoints" + "description": "OpenAI-compatible chat, embeddings, and model endpoints", + "name": "AI Gateway" }, { - "name": "AI Gateway Admin", - "description": "Provider key management endpoints" + "description": "Provider key management endpoints", + "name": "AI Gateway Admin" }, { - "name": "AI Gateway Usage", - "description": "Usage analytics and reporting endpoints" + "description": "Usage analytics and reporting endpoints", + "name": "AI Gateway Usage" }, { - "name": "AI Gateway Pricing", - "description": "Model pricing endpoints" + "description": "Model pricing endpoints", + "name": "AI Gateway Pricing" }, { - "name": "API Keys", - "description": "API key management endpoints" + "description": "API key management endpoints", + "name": "API Keys" }, { - "name": "Load Balancer", - "description": "Load balancer management endpoints" + "description": "Load balancer management endpoints", + "name": "Load Balancer" }, { - "name": "IP Access Control", - "description": "IP access control management endpoints" + "description": "IP access control management endpoints", + "name": "IP Access Control" }, { - "name": "Files", - "description": "Static file serving endpoints" + "description": "Static file serving endpoints", + "name": "Files" }, { - "name": "External Plugins", - "description": "External plugin management and discovery" + "description": "External plugin management and discovery", + "name": "External Plugins" } ] } diff --git a/apps/temps-cli/package.json b/apps/temps-cli/package.json index ba6aa1f4a..e182a6cd2 100644 --- a/apps/temps-cli/package.json +++ b/apps/temps-cli/package.json @@ -15,6 +15,7 @@ "prepublishOnly": "bun run clean && bun run build", "build": "bun build src/index.ts --outdir dist --target node && sed -i '' '1s|#!/usr/bin/env bun|#!/usr/bin/env node|' dist/index.js && chmod +x dist/index.js", "build:bin": "bun build src/index.ts --compile --outfile bin/temps", + "spec:update": "bun run scripts/update-openapi.ts", "generate:api": "bun openapi-ts", "generate:docs": "bun run scripts/generate-docs.ts", "generate:docs:mdx": "bun run scripts/generate-docs.ts --format mdx", diff --git a/apps/temps-cli/scripts/generate-docs.ts b/apps/temps-cli/scripts/generate-docs.ts index f0b2b3f15..8bab853ba 100644 --- a/apps/temps-cli/scripts/generate-docs.ts +++ b/apps/temps-cli/scripts/generate-docs.ts @@ -24,6 +24,7 @@ import { registerNotificationsCommands } from '../src/commands/notifications/ind import { registerDnsCommands } from '../src/commands/dns/index.js' import { registerServicesCommands } from '../src/commands/services/index.js' import { registerSettingsCommands } from '../src/commands/settings/index.js' +import { registerPlatformCommands } from '../src/commands/platform/index.js' import { registerUsersCommands } from '../src/commands/users/index.js' import { registerApiKeysCommands } from '../src/commands/apikeys/index.js' import { registerMonitorsCommands } from '../src/commands/monitors/index.js' @@ -344,6 +345,7 @@ async function main() { registerDnsCommands(program) registerServicesCommands(program) registerSettingsCommands(program) + registerPlatformCommands(program) registerUsersCommands(program) registerApiKeysCommands(program) registerMonitorsCommands(program) diff --git a/apps/temps-cli/scripts/update-openapi.ts b/apps/temps-cli/scripts/update-openapi.ts new file mode 100644 index 000000000..70db52190 --- /dev/null +++ b/apps/temps-cli/scripts/update-openapi.ts @@ -0,0 +1,88 @@ +#!/usr/bin/env bun +/** + * Refresh `openapi.json` from a running temps server, in a canonical shape. + * + * Why this exists: the server emits the spec minified and with whatever key + * order serde produced. Writing that straight to disk replaces a ~92,000-line + * pretty-printed file with a single line, so the pull request reports ~-92,000 + * deletions and the real change is invisible to reviewers. Key order is not + * stable across builds either, so even a pretty-printed dump reorders large + * blocks for no reason. + * + * Canonical form is therefore: keys sorted, two-space indent, trailing + * newline. Sorting is what makes the diff proportional to the API change + * rather than to serde's iteration order. + * + * Usage: + * bun run scripts/update-openapi.ts # localhost:8080 + * bun run scripts/update-openapi.ts --url http://localhost:8220/api/api-docs/openapi.json + * TEMPS_API_KEY=tk_... bun run scripts/update-openapi.ts # if the server requires auth + * + * Then regenerate the client from the file: + * bun run generate:api + */ + +const DEFAULT_URL = 'http://localhost:8080/api/api-docs/openapi.json' +const OUTPUT = new URL('../openapi.json', import.meta.url).pathname + +/** Recursively sort object keys so the on-disk order never depends on the server. */ +function canonicalize(value: unknown): unknown { + if (Array.isArray(value)) { + // Array order is meaningful in OpenAPI (parameter lists, enum values) — + // sort the contents, never the sequence. + return value.map(canonicalize) + } + if (value && typeof value === 'object') { + const source = value as Record + return Object.fromEntries( + Object.keys(source) + .sort() + .map((key) => [key, canonicalize(source[key])]) + ) + } + return value +} + +function parseArgs(argv: string[]): { url: string } { + const index = argv.indexOf('--url') + if (index !== -1) { + const url = argv[index + 1] + if (!url) { + console.error('--url requires a value') + process.exit(1) + } + return { url } + } + return { url: process.env.TEMPS_OPENAPI_URL ?? DEFAULT_URL } +} + +const { url } = parseArgs(process.argv.slice(2)) +const apiKey = process.env.TEMPS_API_KEY + +const response = await fetch(url, { + headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : {}, +}).catch((error: unknown) => { + console.error(`Could not reach ${url}: ${String(error)}`) + console.error('Start a temps server first, or pass --url.') + process.exit(1) +}) + +if (!response.ok) { + console.error(`${url} returned ${response.status}`) + if (response.status === 401 || response.status === 403) { + console.error('Set TEMPS_API_KEY to an admin key; the spec endpoint is authenticated.') + } + process.exit(1) +} + +const spec = await response.json() +if (!spec?.paths || Object.keys(spec.paths).length === 0) { + // A spec with no paths means the server answered but the doc was not + // assembled — writing it would silently delete the entire committed client. + console.error('Refusing to write: the fetched spec has no paths.') + process.exit(1) +} + +await Bun.write(OUTPUT, `${JSON.stringify(canonicalize(spec), null, 2)}\n`) +console.log(`Wrote ${OUTPUT} (${Object.keys(spec.paths).length} paths)`) +console.log('Now run: bun run generate:api') diff --git a/apps/temps-cli/src/api/index.ts b/apps/temps-cli/src/api/index.ts index 3ed482c5b..1be0393f0 100644 --- a/apps/temps-cli/src/api/index.ts +++ b/apps/temps-cli/src/api/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiDataAccess, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQueryContainerInfo, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, querySpanStats, queryTraces, queryTraceSummaries, readEntityRows, readFile, reAnalyze, rebuildSandboxImage, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, sendMessage, setAiDataAccess, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; -export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiDataAccessResponse, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponse, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponse, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsError, QuerySpanStatsErrors, QuerySpanStatsResponse, QuerySpanStatsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponse, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReadRowsQuery, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RebuildSandboxImageData, RebuildSandboxImageErrors, RebuildSandboxImageResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageData, SendMessageErrors, SendMessageRequest, SendMessageResponses, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponse, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStats, SpanStatsResponse, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleAiDataAccessRequest, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; +export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, changeRequiredPassword, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkForUpdate, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiDataAccess, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQueryContainerInfo, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateCapability, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, querySpanStats, queryTraces, queryTraceSummaries, readEntityRows, readFile, reAnalyze, rebuildSandboxImage, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, sendMessage, setAiDataAccess, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, startUpdate, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; +export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiDataAccessResponse, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponse, ChangeRequiredPasswordResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckForUpdateData, CheckForUpdateError, CheckForUpdateErrors, CheckForUpdateResponse, CheckForUpdateResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponse, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponse, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateCapabilityData, GetUpdateCapabilityErrors, GetUpdateCapabilityResponse, GetUpdateCapabilityResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsError, QuerySpanStatsErrors, QuerySpanStatsResponse, QuerySpanStatsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponse, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReadRowsQuery, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RebuildSandboxImageData, RebuildSandboxImageErrors, RebuildSandboxImageResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseCheckResult, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, RequiredPasswordChangeRequest, RequiredPasswordChangeResponse, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SelfUpdateAttempt, SelfUpdateBlocker, SelfUpdatePhase, SelfUpdateRestartMode, SelfUpdateSettings, SelfUpdateStatus, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageData, SendMessageErrors, SendMessageRequest, SendMessageResponses, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponse, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStats, SpanStatsResponse, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StartUpdateData, StartUpdateError, StartUpdateErrors, StartUpdateRequest, StartUpdateResponse, StartUpdateResponse2, StartUpdateResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SupervisorKind, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleAiDataAccessRequest, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCapabilityResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; diff --git a/apps/temps-cli/src/api/sdk.gen.ts b/apps/temps-cli/src/api/sdk.gen.ts index ba37e47e1..e96bdc423 100644 --- a/apps/temps-cli/src/api/sdk.gen.ts +++ b/apps/temps-cli/src/api/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, type ClientMeta, formDataBodySerializer, type Options as Options2, type RequestResult, type ServerSentEventsResult, type TDataShape } from './client'; import { client } from './client.gen'; -import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsErrors, QuerySpanStatsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RebuildSandboxImageData, RebuildSandboxImageErrors, RebuildSandboxImageResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SendMessageData, SendMessageErrors, SendMessageResponses, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; +import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckForUpdateData, CheckForUpdateErrors, CheckForUpdateResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateCapabilityData, GetUpdateCapabilityErrors, GetUpdateCapabilityResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsErrors, QuerySpanStatsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RebuildSandboxImageData, RebuildSandboxImageErrors, RebuildSandboxImageResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SendMessageData, SendMessageErrors, SendMessageResponses, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StartUpdateData, StartUpdateErrors, StartUpdateResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; export type Options = Options2 & { /** @@ -750,6 +750,15 @@ export const startOidcLoginBySlug = (optio export const listPublicProviders = (options?: Options): RequestResult => (options?.client ?? client).get({ url: '/auth/oidc/providers', ...options }); +export const changeRequiredPassword = (options: Options): RequestResult => (options.client ?? client).post({ + url: '/auth/password-change-required', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + export const requestPasswordReset = (options: Options): RequestResult => (options.client ?? client).post({ url: '/auth/password-reset/request', ...options, @@ -4135,6 +4144,34 @@ export const getQuota = (options: Options< ...options }); +/** + * Rank operations by latency, volume, or inconsistency. + * + * Groups spans by `(project, service, span name)` over a bounded window and + * returns count, error rate, total/min/max/avg/stddev duration, p50/p95/p99, + * and two variability ratios per operation. Sorting is what makes it useful: + * + * - `sort_by=total_time` (default) — where the wall-clock actually goes. + * - `sort_by=p95` / `p99` — what users actually feel. + * - `sort_by=variability` or `tail_ratio` — operations whose *spread* is the + * problem: the ones that take 40ms most of the time and 4s the rest. + * - `span_name=payments.charge` — the worst this one operation ever got, in + * `max_duration_ms`. + * + * Pair the variability sorts with `min_count` — a ratio computed from three + * samples is noise, and without a floor it outranks every real signal. + * + * Two bounds are enforced rather than clamped, so a result never claims to + * cover more than it does: at most 50 projects, and a window no wider than + * 31 days. Both return 400. Unlike the trace list this report has no early + * exit — it aggregates every span in the window before it can rank anything. + */ +export const querySpanStats = (options?: Options): RequestResult => (options?.client ?? client).get({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/otel/span-stats', + ...options +}); + /** * Query trace summaries — one row per trace with span count, error count, * root span info, and proper trace-level pagination. @@ -6528,9 +6565,14 @@ export const getUniqueCounts = (options: O * deployed later using the deploy/static endpoint. */ export const uploadStaticBundle = (options: Options): RequestResult => (options.client ?? client).post({ + ...formDataBodySerializer, security: [{ scheme: 'bearer', type: 'http' }], url: '/projects/{project_id}/upload/static', - ...options + ...options, + headers: { + 'Content-Type': null, + ...options.headers + } }); export const listProjectScans = (options: Options): RequestResult => (options.client ?? client).get({ @@ -7265,6 +7307,33 @@ export const downloadGlobalSkillArchive = ...options }); +/** + * Report whether a release update can be applied from the console. + */ +export const getUpdateCapability = (options?: Options): RequestResult => (options?.client ?? client).get({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update', + ...options +}); + +/** + * Install a release and restart the server. + * + * Returns as soon as the attempt is accepted: the download and swap run in the + * background and the process then exits so its supervisor restarts it on the + * new binary. Poll `GET /settings/update` for progress — after the restart, + * `last_attempt` carries the outcome. + */ +export const startUpdate = (options: Options): RequestResult => (options.client ?? client).post({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + /** * Report whether a newer temps release is available for this install. */ @@ -7274,6 +7343,16 @@ export const getUpdateStatus = (options?: ...options }); +/** + * Ask the release API for the newest version on this install's channel, now, + * instead of waiting for the background notifier's next pass. + */ +export const checkForUpdate = (options?: Options): RequestResult => (options?.client ?? client).post({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update/check', + ...options +}); + export const listTeams = (options?: Options): RequestResult => (options?.client ?? client).get({ security: [{ scheme: 'bearer', type: 'http' }], url: '/teams', @@ -8000,31 +8079,3 @@ export const listAuditLogs = (options?: Op * Get a specific audit log entry by ID */ export const getAuditLog = (options: Options): RequestResult => (options.client ?? client).get({ url: 'audit/logs/{id}', ...options }); - -/** - * Rank operations by latency, volume, or inconsistency. - * - * Groups spans by `(project, service, span name)` over a bounded window and - * returns count, error rate, total/min/max/avg/stddev duration, p50/p95/p99, - * and two variability ratios per operation. Sorting is what makes it useful: - * - * - `sort_by=total_time` (default) — where the wall-clock actually goes. - * - `sort_by=p95` / `p99` — what users actually feel. - * - `sort_by=variability` or `tail_ratio` — operations whose *spread* is the - * problem: the ones that take 40ms most of the time and 4s the rest. - * - `span_name=payments.charge` — the worst this one operation ever got, in - * `max_duration_ms`. - * - * Pair the variability sorts with `min_count` — a ratio computed from three - * samples is noise, and without a floor it outranks every real signal. - * - * Two bounds are enforced rather than clamped, so a result never claims to - * cover more than it does: at most 50 projects, and a window no wider than - * 31 days. Both return 400. Unlike the trace list this report has no early - * exit — it aggregates every span in the window before it can rank anything. - */ -export const querySpanStats = (options?: Options): RequestResult => (options?.client ?? client).get({ - security: [{ scheme: 'bearer', type: 'http' }], - url: '/otel/span-stats', - ...options -}); diff --git a/apps/temps-cli/src/api/types.gen.ts b/apps/temps-cli/src/api/types.gen.ts index 439b23c5d..a654cb468 100644 --- a/apps/temps-cli/src/api/types.gen.ts +++ b/apps/temps-cli/src/api/types.gen.ts @@ -1105,6 +1105,7 @@ export type AppSettings = { require_mfa_for_admins?: boolean; screenshots?: ScreenshotSettings; security_headers?: SecurityHeadersSettings; + self_update?: null | SelfUpdateSettings; /** * Set to `true` by `temps setup` (all modes) once initial configuration * has been applied. The web onboarding wizard reads this from the server @@ -1189,6 +1190,13 @@ export type AppSettingsResponse = { require_mfa_for_admins: boolean; screenshots: ScreenshotSettings; security_headers: SecurityHeadersSettings; + /** + * Whether admins may apply a release from the console. This is the + * database-backed toggle only — a server started with + * `--disable-self-update` refuses regardless of what this says, which + * `GET /settings/update` reports as the authoritative answer. + */ + self_update: SelfUpdateSettings; /** * Whether `temps setup` has been run at least once. The web onboarding * wizard checks this field on load and skips itself when true. @@ -1345,7 +1353,10 @@ export type AuthFlavorDto = { export type AuthResponse = { message: string; + mfa_enrollment_required: boolean; mfa_required: boolean; + mfa_setup?: null | MfaSetupResponse; + password_change_required: boolean; success: boolean; user_id?: number | null; }; @@ -3938,6 +3949,7 @@ export type CreateTeamRequest = { export type CreateUserRequest = { email?: string | null; + must_change_password?: boolean; password?: string | null; roles: Array; username: string; @@ -4748,6 +4760,19 @@ export type DeploymentMetadata = { * ID of the deployment this was rolled back from (if applicable) */ rolledBackFromId?: number | null; + /** + * Uploaded source archive content type. + */ + sourceBundleContentType?: string | null; + /** + * Uploaded source archive ID. Source archives are extracted before the + * regular preset build pipeline and do not require Git metadata. + */ + sourceBundleId?: number | null; + /** + * Uploaded source archive path in the Temps data directory. + */ + sourceBundlePath?: string | null; /** * Static bundle content type (for proper extraction: application/gzip or application/zip) */ @@ -12390,6 +12415,12 @@ export type PropertyBreakdownQuery = { * Property column to group by */ group_by: PropertyColumn; + /** + * Include crawler/bot traffic (default: false). Off by default so the + * breakdown percentages share a denominator with the headline counts, + * which always exclude crawlers. + */ + include_crawlers?: boolean | null; /** * Maximum number of results to return (default: 20, max: 100) */ @@ -12446,6 +12477,11 @@ export type PropertyTimelineQuery = { * Property column to group by */ group_by: PropertyColumn; + /** + * Include crawler/bot traffic (default: false). See + * [`PropertyBreakdownQuery::include_crawlers`]. + */ + include_crawlers?: boolean | null; /** * Start date for the query range */ @@ -12806,9 +12842,14 @@ export type QueryDataResponse = { */ total_count: number; /** - * Whether rows were dropped from this response to stay inside the byte budget. + * Whether rows were dropped from this response to stay inside the byte + * budget. * - * `returned_count` is always the number of rows actually present, so a truncated page is still internally consistent — but a caller comparing it against the requested limit would otherwise conclude the table simply ended. Reported explicitly so a partial page is never mistaken for a complete one, by a human, a script, or a model reading a tool result. + * `returned_count` is always the number of rows actually present, so a + * truncated page is still internally consistent — but a caller comparing + * it against the requested limit would otherwise conclude the table simply + * ended. Reported explicitly so a partial page is never mistaken for a + * complete one, by a human, a script, or a model reading a tool result. */ truncated: boolean; }; @@ -13190,6 +13231,34 @@ export type ReinstallWebhookResponse = { message: string; }; +/** + * Outcome of an operator-triggered release check. + */ +export type ReleaseCheckResult = { + /** + * Channel that was queried. + */ + channel: string; + /** + * Version tag of the running binary. + */ + current_version: string; + /** + * Newest release published on that channel, if any could be resolved. + */ + latest_version?: string | null; + /** + * Release-notes page for `latest_version`. + */ + release_url?: string | null; + /** + * True when `latest_version` is strictly newer than what is running. + * False on a channel whose newest release is older — which is normal and + * expected right after switching a nightly box onto stable. + */ + update_available: boolean; +}; + export type ReleaseListResponse = { releases: Array; }; @@ -13325,6 +13394,18 @@ export type RequestRow = { user_agent?: string | null; }; +export type RequiredPasswordChangeRequest = { + new_password: string; +}; + +export type RequiredPasswordChangeResponse = { + message: string; + mfa_enrollment_required: boolean; + mfa_setup?: null | MfaSetupResponse; + success: boolean; + user_id: number; +}; + export type ResetPasswordRequest = { new_password: string; token: string; @@ -13833,6 +13914,7 @@ export type RouteUser = { id: number; image: string; mfa_enabled: boolean; + must_change_password: boolean; name: string; updated_at: number; username: string; @@ -14462,6 +14544,88 @@ export type SecurityHeadersSettings = { x_xss_protection?: string; }; +/** + * A single update attempt. Persisted to `/self-update.json` so the + * result survives the restart it causes. + */ +export type SelfUpdateAttempt = { + /** + * Operator-facing failure reason. Always set when `status` is `Failed`. + */ + error?: string | null; + /** + * When the outcome was decided. `None` while still `Pending`. + */ + finished_at?: string | null; + /** + * Version the attempt started from. + */ + from_version: string; + /** + * Where the replaced binary was kept, so a bad release can be reverted by + * hand (`mv `). Set once the swap completes. + */ + previous_binary_path?: string | null; + started_at: string; + status: SelfUpdateStatus; + /** + * Version the attempt targeted. `None` if it failed before resolving one. + */ + to_version?: string | null; + /** + * User who clicked the button. `None` for attempts started by the CLI. + */ + triggered_by_user_id?: number | null; +}; + +/** + * Why a one-click update is unavailable. Exactly one is reported — the most + * fundamental blocker wins, so the operator fixes the real problem first + * rather than clearing one only to hit the next. + */ +export type SelfUpdateBlocker = 'disabled_by_flag' | 'disabled_by_setting' | 'not_supported' | 'binary_not_writable' | 'unsupported_platform' | 'in_progress'; + +/** + * Where an in-flight update has got to. Polled by the console so a long + * download shows progress instead of an indefinite spinner. + */ +export type SelfUpdatePhase = 'idle' | 'resolving' | 'downloading' | 'verifying' | 'installing' | 'restarting' | 'pending_restart' | 'failed'; + +/** + * What happens to the running process once the new binary is in place. + */ +export type SelfUpdateRestartMode = 'automatic' | 'manual'; + +/** + * Controls the console's one-click "Update now" action. + */ +export type SelfUpdateSettings = { + /** + * Release channel this install tracks: `stable`, `beta` or `nightly`. + * + * `None` (the default) means "infer from the running version tag", which + * is what the CLI has always done — a `-nightly.` build tracks nightly, a + * `-beta.N` build tracks beta, a plain tag tracks stable. Setting it + * explicitly pins the channel, so an operator can move a nightly box back + * onto stable without reinstalling. + */ + channel?: string | null; + /** + * Allow admins to apply a release and restart the server from the console. + * `true` by default: the action is permission-gated, audited, and only + * ever installs an official release whose published SHA-256 matches. + * + * Turning this off hides nothing — the console still shows the update + * banner and the manual command, it just refuses to run it for you. + */ + enabled?: boolean; +}; + +/** + * Outcome of an update attempt, as persisted in the journal. + */ +export type SelfUpdateStatus = 'pending' | 'succeeded' | 'installed_pending_restart' | 'failed'; + export type SendEmailRequestBody = { /** * BCC recipients @@ -15866,6 +16030,76 @@ export type SpanRow = { ts: string; }; +/** + * Latency and error statistics for one operation, i.e. one + * `(project, service, span name)` triple over the queried window. + */ +export type SpanStats = { + avg_duration_ms: number; + /** + * `stddev / avg`, or `0` when `avg` is zero. + */ + coefficient_of_variation: number; + /** + * Number of spans aggregated. + */ + count: number; + error_count: number; + /** + * `error_count / count`, in `[0, 1]`. + */ + error_rate: number; + /** + * The most common span kind for this operation. + */ + kind: SpanKind; + /** + * Start time of the most recent span in this group. + */ + last_seen: string; + max_duration_ms: number; + min_duration_ms: number; + p50_duration_ms: number; + p95_duration_ms: number; + p99_duration_ms: number; + project_id: number; + service_name: string; + /** + * The span name, which is the operation identity: `GET /api/checkout`, + * `SELECT carts`, `payments.charge`. + */ + span_name: string; + /** + * Sample standard deviation. `0` when the operation has a single sample. + */ + stddev_duration_ms: number; + /** + * `p99 / p50`, or `0` when `p50` is zero. + */ + tail_ratio: number; + /** + * `SUM(duration_ms)` — total wall-clock attributable to this operation. + */ + total_duration_ms: number; +}; + +/** + * Response for `GET /otel/span-stats`. + */ +export type SpanStatsResponse = { + data: Array; + end_time: string; + /** + * The window actually aggregated, echoed back because it is defaulted + * server-side when the caller omits it. + */ + start_time: string; + /** + * Total number of distinct operations matching the filters, for pagination. + */ + total: number; +}; + /** * Span status code. */ @@ -16031,6 +16265,37 @@ export type StartRestoreRequest = RestoreRequestMode & { s3_source_id?: number | null; }; +/** + * Optional pin for the version to install. + */ +export type StartUpdateRequest = { + /** + * Release tag to install (e.g. `v0.2.0`). Omit to take the newest release + * on the channel this install already tracks. + */ + version?: string | null; +}; + +/** + * Acknowledgement that an update was accepted and is running. + */ +export type StartUpdateResponse = { + /** + * Version the server is running as it accepts this request. + */ + current_version: string; + /** + * How long to allow for the server to come back before treating the + * restart as failed. `0` when nothing restarts. + */ + estimated_restart_secs: number; + message: string; + /** + * `automatic` (temps restarts itself) or `manual` (installed only). + */ + restart_mode: SelfUpdateRestartMode; +}; + export type StatResponse = { exists: boolean; is_dir: boolean; @@ -16257,6 +16522,11 @@ export type StripeConfig = { product_allowlist?: Array; }; +/** + * What (if anything) will restart the process after it exits. + */ +export type SupervisorKind = 'systemd' | 'launchd' | 'container' | 'none'; + export type SyncedRepositoryListQuery = { direction?: string | null; git_provider_connection_id?: number | null; @@ -17190,6 +17460,77 @@ export type UpdateBlobResponse = { success: boolean; }; +/** + * Whether this install can apply a release update on request, and how the last + * attempt went. + * + * Deliberately answerable even when the answer is "no": an operator who cannot + * use the button still needs to know *why* and what to run instead, so this + * never 404s or returns an empty body when the feature is unavailable. + */ +export type UpdateCapabilityResponse = { + /** + * Whether the *caller* holds `platform:update`. Distinct from `can_apply`, + * which describes the server: the console shows the action only when both + * are true, so a reader is never offered a button that would 403. + */ + allowed: boolean; + /** + * Binary that would be replaced. + */ + binary_path: string; + blocker?: null | SelfUpdateBlocker; + /** + * True only when a request would actually download, install and restart. + */ + can_apply: boolean; + /** + * Non-blocking warning to show with the confirmation (split topology). + */ + caveat?: string | null; + /** + * Channel actually tracked, after applying the configured override or + * falling back to inference from the running version tag. + */ + channel: string; + /** + * True when `channel` was set explicitly in settings rather than inferred. + */ + channel_is_pinned: boolean; + /** + * Version tag of the running binary. Always present — the version page + * needs it whether or not an update exists. + */ + current_version: string; + last_attempt?: null | SelfUpdateAttempt; + /** + * The equivalent command to run by hand. Always present. + */ + manual_command: string; + /** + * Phase of an in-flight attempt: `idle` when none is running. + */ + phase: SelfUpdatePhase; + /** + * Failure detail while `phase` is `failed`. + */ + phase_error?: string | null; + /** + * Operator-facing explanation of `blocker`. + */ + reason?: string | null; + /** + * `automatic` when applying an update also restarts temps; `manual` when + * it only installs the binary and the operator restarts on their own + * schedule. Lets the console set expectations before the click. + */ + restart_mode: SelfUpdateRestartMode; + /** + * What would restart the process: `systemd`, `launchd`, `container`, `none`. + */ + supervisor: SupervisorKind; +}; + export type UpdateCloudflareProviderRequest = { config: CloudflareConfig; enabled?: boolean | null; @@ -18913,76 +19254,6 @@ export type ZoneListResponse = { zones: Array; }; -/** - * Latency and error statistics for one operation, i.e. one - * `(project, service, span name)` triple over the queried window. - */ -export type SpanStats = { - avg_duration_ms: number; - /** - * `stddev / avg`, or `0` when `avg` is zero. - */ - coefficient_of_variation: number; - /** - * Number of spans aggregated. - */ - count: number; - error_count: number; - /** - * `error_count / count`, in `[0, 1]`. - */ - error_rate: number; - /** - * The most common span kind for this operation. - */ - kind: SpanKind; - /** - * Start time of the most recent span in this group. - */ - last_seen: string; - max_duration_ms: number; - min_duration_ms: number; - p50_duration_ms: number; - p95_duration_ms: number; - p99_duration_ms: number; - project_id: number; - service_name: string; - /** - * The span name, which is the operation identity: `GET /api/checkout`, - * `SELECT carts`, `payments.charge`. - */ - span_name: string; - /** - * Sample standard deviation. `0` when the operation has a single sample. - */ - stddev_duration_ms: number; - /** - * `p99 / p50`, or `0` when `p50` is zero. - */ - tail_ratio: number; - /** - * `SUM(duration_ms)` — total wall-clock attributable to this operation. - */ - total_duration_ms: number; -}; - -/** - * Response for `GET /otel/span-stats`. - */ -export type SpanStatsResponse = { - data: Array; - end_time: string; - /** - * The window actually aggregated, echoed back because it is defaulted - * server-side when the caller omits it. - */ - start_time: string; - /** - * Total number of distinct operations matching the filters, for pagination. - */ - total: number; -}; - /** * Response type for S3 source */ @@ -22469,6 +22740,37 @@ export type ListPublicProvidersResponses = { export type ListPublicProvidersResponse = ListPublicProvidersResponses[keyof ListPublicProvidersResponses]; +export type ChangeRequiredPasswordData = { + body: RequiredPasswordChangeRequest; + path?: never; + query?: never; + url: '/auth/password-change-required'; +}; + +export type ChangeRequiredPasswordErrors = { + /** + * Password does not meet requirements + */ + 400: unknown; + /** + * Password-change session is missing or expired + */ + 401: unknown; + /** + * Internal server error + */ + 500: unknown; +}; + +export type ChangeRequiredPasswordResponses = { + /** + * Required password change completed + */ + 200: RequiredPasswordChangeResponse; +}; + +export type ChangeRequiredPasswordResponse = ChangeRequiredPasswordResponses[keyof ChangeRequiredPasswordResponses]; + export type RequestPasswordResetData = { body: EmailRequest; path?: never; @@ -34315,6 +34617,116 @@ export type GetQuotaResponses = { export type GetQuotaResponse = GetQuotaResponses[keyof GetQuotaResponses]; +export type QuerySpanStatsData = { + body?: never; + path?: never; + query?: { + /** + * Single project to report on + */ + project_id?: number; + /** + * Comma-separated project ids, e.g. `4,5,6` (max 50) + */ + project_ids?: string; + /** + * Window start (RFC 3339); defaults to 24h before end_time. The window may not exceed 31 days + */ + start_time?: string; + /** + * Window end (RFC 3339); defaults to now + */ + end_time?: string; + /** + * Restrict to one service + */ + service_name?: string; + /** + * Restrict to one operation by exact span name + */ + span_name?: string; + /** + * Case-insensitive substring match on the span name + */ + name_pattern?: string; + /** + * server | client | internal | producer | consumer + */ + kind?: string; + /** + * ok | error | unset + */ + status?: string; + /** + * Restrict to one environment + */ + environment_id?: number; + /** + * Restrict to one deployment + */ + deployment_id?: number; + /** + * Comma-separated key=value span attribute filters + */ + attributes?: string; + /** + * Ignore spans faster than this + */ + min_duration_ms?: number; + /** + * Drop operations with fewer samples than this + */ + min_count?: number; + /** + * total_time | p50 | p95 | p99 | max | avg | stddev | count | errors | error_rate | variability | tail_ratio + */ + sort_by?: string; + /** + * asc | desc (default) + */ + sort_order?: string; + /** + * Page size (default 20, max 100) + */ + limit?: number; + /** + * Page offset + */ + offset?: number; + }; + url: '/otel/span-stats'; +}; + +export type QuerySpanStatsErrors = { + /** + * Invalid query (no project, empty window) + */ + 400: ProblemDetails; + /** + * Unauthorized + */ + 401: ProblemDetails; + /** + * Insufficient permissions + */ + 403: ProblemDetails; + /** + * Internal server error + */ + 500: ProblemDetails; +}; + +export type QuerySpanStatsError = QuerySpanStatsErrors[keyof QuerySpanStatsErrors]; + +export type QuerySpanStatsResponses = { + /** + * Per-operation latency statistics + */ + 200: SpanStatsResponse; +}; + +export type QuerySpanStatsResponse = QuerySpanStatsResponses[keyof QuerySpanStatsResponses]; + export type QueryTraceSummariesData = { body?: never; path?: never; @@ -41084,6 +41496,10 @@ export type GetPropertyBreakdownData = { * Maximum number of results (default: 20, max: 100) */ limit?: number; + /** + * Include crawler/bot traffic (default: false) + */ + include_crawlers?: boolean; /** * Filter by country (for region/city drill-downs) */ @@ -41177,6 +41593,10 @@ export type GetPropertyTimelineData = { * Time bucket: hour, day, week, month (default: auto-detect) */ bucket_size?: string; + /** + * Include crawler/bot traffic (default: false) + */ + include_crawlers?: boolean; }; url: '/projects/{project_id}/events/properties/timeline'; }; @@ -44131,7 +44551,7 @@ export type GetUniqueCountsResponses = { export type GetUniqueCountsResponse = GetUniqueCountsResponses[keyof GetUniqueCountsResponses]; export type UploadStaticBundleData = { - body?: never; + body: SourceArchiveUpload; path: { project_id: number; }; @@ -47349,6 +47769,70 @@ export type DownloadGlobalSkillArchiveResponses = { export type DownloadGlobalSkillArchiveResponse = DownloadGlobalSkillArchiveResponses[keyof DownloadGlobalSkillArchiveResponses]; +export type GetUpdateCapabilityData = { + body?: never; + path?: never; + query?: never; + url: '/settings/update'; +}; + +export type GetUpdateCapabilityErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; +}; + +export type GetUpdateCapabilityResponses = { + /** + * Self-update capability for this install + */ + 200: UpdateCapabilityResponse; +}; + +export type GetUpdateCapabilityResponse = GetUpdateCapabilityResponses[keyof GetUpdateCapabilityResponses]; + +export type StartUpdateData = { + body: StartUpdateRequest; + path?: never; + query?: never; + url: '/settings/update'; +}; + +export type StartUpdateErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; + /** + * Update unavailable or already running + */ + 409: ProblemDetails; + /** + * This process cannot apply updates + */ + 501: ProblemDetails; +}; + +export type StartUpdateError = StartUpdateErrors[keyof StartUpdateErrors]; + +export type StartUpdateResponses = { + /** + * Update accepted; the server will restart + */ + 202: StartUpdateResponse; +}; + +export type StartUpdateResponse2 = StartUpdateResponses[keyof StartUpdateResponses]; + export type GetUpdateStatusData = { body?: never; path?: never; @@ -47376,6 +47860,43 @@ export type GetUpdateStatusResponses = { export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; +export type CheckForUpdateData = { + body?: never; + path?: never; + query?: never; + url: '/settings/update/check'; +}; + +export type CheckForUpdateErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; + /** + * This process cannot check for updates + */ + 501: ProblemDetails; + /** + * The release API could not be reached + */ + 502: ProblemDetails; +}; + +export type CheckForUpdateError = CheckForUpdateErrors[keyof CheckForUpdateErrors]; + +export type CheckForUpdateResponses = { + /** + * Result of the release check + */ + 200: ReleaseCheckResult; +}; + +export type CheckForUpdateResponse = CheckForUpdateResponses[keyof CheckForUpdateResponses]; + export type ListTeamsData = { body?: never; path?: never; @@ -47949,6 +48470,10 @@ export type SetupMfaErrors = { * Unauthorized */ 401: unknown; + /** + * MFA is already enabled; verify and disable it before re-enrollment + */ + 409: unknown; /** * Internal server error */ @@ -49811,113 +50336,3 @@ export type GetAuditLogResponses = { }; export type GetAuditLogResponse = GetAuditLogResponses[keyof GetAuditLogResponses]; - -export type QuerySpanStatsData = { - body?: never; - path?: never; - query?: { - /** - * Single project to report on - */ - project_id?: number; - /** - * Comma-separated project ids, e.g. `4,5,6` (max 50) - */ - project_ids?: string; - /** - * Window start (RFC 3339); defaults to 24h before end_time. The window may not exceed 31 days - */ - start_time?: string; - /** - * Window end (RFC 3339); defaults to now - */ - end_time?: string; - /** - * Restrict to one service - */ - service_name?: string; - /** - * Restrict to one operation by exact span name - */ - span_name?: string; - /** - * Case-insensitive substring match on the span name - */ - name_pattern?: string; - /** - * server | client | internal | producer | consumer - */ - kind?: string; - /** - * ok | error | unset - */ - status?: string; - /** - * Restrict to one environment - */ - environment_id?: number; - /** - * Restrict to one deployment - */ - deployment_id?: number; - /** - * Comma-separated key=value span attribute filters - */ - attributes?: string; - /** - * Ignore spans faster than this - */ - min_duration_ms?: number; - /** - * Drop operations with fewer samples than this - */ - min_count?: number; - /** - * total_time | p50 | p95 | p99 | max | avg | stddev | count | errors | error_rate | variability | tail_ratio - */ - sort_by?: string; - /** - * asc | desc (default) - */ - sort_order?: string; - /** - * Page size (default 20, max 100) - */ - limit?: number; - /** - * Page offset - */ - offset?: number; - }; - url: '/otel/span-stats'; -}; - -export type QuerySpanStatsErrors = { - /** - * Invalid query (no project, empty window) - */ - 400: ProblemDetails; - /** - * Unauthorized - */ - 401: ProblemDetails; - /** - * Insufficient permissions - */ - 403: ProblemDetails; - /** - * Internal server error - */ - 500: ProblemDetails; -}; - -export type QuerySpanStatsError = QuerySpanStatsErrors[keyof QuerySpanStatsErrors]; - -export type QuerySpanStatsResponses = { - /** - * Per-operation latency statistics - */ - 200: SpanStatsResponse; -}; - -export type QuerySpanStatsResponse = QuerySpanStatsResponses[keyof QuerySpanStatsResponses]; diff --git a/apps/temps-cli/src/commands/platform/index.ts b/apps/temps-cli/src/commands/platform/index.ts index b2f85329b..0c2ec8620 100644 --- a/apps/temps-cli/src/commands/platform/index.ts +++ b/apps/temps-cli/src/commands/platform/index.ts @@ -6,9 +6,16 @@ import { getAccessInfo, getPrivateIp, getPublicIp, + getUpdateCapability, + getUpdateStatus, + startUpdate, + checkForUpdate, + getSettings, + updateSettings, } from '../../api/sdk.gen.js' import { withSpinner } from '../../ui/spinner.js' -import { newline, header, icons, json, colors, info, keyValue, success } from '../../ui/output.js' +import { promptConfirm } from '../../ui/prompts.js' +import { newline, header, icons, json, colors, info, keyValue, success, warning, error, formatDate } from '../../ui/output.js' export function registerPlatformCommands(program: Command): void { const platform = program @@ -37,6 +44,38 @@ export function registerPlatformCommands(program: Command): void { .command('public-ip') .description('Get the server public IP address') .action(publicIpAction) + + const update = platform + .command('update') + .description('Check for and apply temps releases on the server') + + update + .command('status') + .description('Show the available release and whether it can be applied from here') + .option('--json', 'Output in JSON format') + .action(updateStatusAction) + + update + .command('check') + .description('Ask the release API for the newest version on this channel now') + .option('--json', 'Output in JSON format') + .action(updateCheckAction) + + update + .command('channel [channel]') + .description( + 'Show or set the release channel: stable, beta, nightly, or "auto" to follow the installed version' + ) + .option('--json', 'Output in JSON format') + .action(updateChannelAction) + + update + .command('apply') + .description('Install a release on the server and restart it') + .option('--version ', 'Release tag to install (default: newest on this channel)') + .option('-y, --yes', 'Skip the confirmation prompt') + .option('--json', 'Output in JSON format') + .action(updateApplyAction) } async function platformInfoAction(options: { json?: boolean }): Promise { @@ -144,3 +183,342 @@ async function publicIpAction(): Promise { json(result) } } + +/** + * Report both halves of the picture: whether a newer release exists, and + * whether this install can apply it without someone SSH-ing to the host. + */ +async function updateStatusAction(options: { json?: boolean }): Promise { + await requireAuth() + await setupClient() + + const { status, capability } = await withSpinner('Checking for updates...', async () => { + const [statusRes, capabilityRes] = await Promise.all([ + getUpdateStatus({ client }), + getUpdateCapability({ client }), + ]) + if (statusRes.error) { + throw new Error(getErrorMessage(statusRes.error)) + } + if (capabilityRes.error) { + throw new Error(getErrorMessage(capabilityRes.error)) + } + return { status: statusRes.data, capability: capabilityRes.data } + }) + + if (options.json) { + json({ status, capability }) + return + } + + newline() + header(`${icons.globe} Platform Updates`) + + if (status?.update_available) { + keyValue('Current', status.current_version ?? colors.muted('unknown')) + keyValue('Available', colors.success(status.latest_version ?? 'unknown')) + keyValue('Channel', status.channel ?? colors.muted('unknown')) + if (status.release_url) { + keyValue('Release notes', status.release_url) + } + } else { + keyValue('Status', 'Up to date (or no check has completed yet)') + keyValue('Current', status?.current_version ?? colors.muted('unknown')) + } + + newline() + keyValue('Supervisor', capability?.supervisor ?? colors.muted('unknown')) + keyValue('Binary', capability?.binary_path || colors.muted('unknown')) + + if (capability?.can_apply && capability.allowed) { + keyValue('Apply from here', colors.success('Yes')) + info(`Run ${colors.primary('temps platform update apply')} to install and restart.`) + } else { + keyValue('Apply from here', colors.warning('No')) + if (!capability?.allowed) { + warning('Your credentials lack the platform:update permission.') + } + if (capability?.reason) { + warning(capability.reason) + } + // Never leave the operator without a way forward. + info(`Upgrade manually on the host: ${colors.primary(capability?.manual_command ?? 'temps upgrade')}`) + } + + if (capability?.caveat) { + warning(capability.caveat) + } + + // Surface how the previous attempt ended — especially a failure, which the + // person running this may never have seen if it happened in the console. + const attempt = capability?.last_attempt + if (attempt) { + newline() + header(`${icons.bullet} Last update attempt`) + keyValue('Result', attempt.status === 'succeeded' + ? colors.success('succeeded') + : attempt.status === 'failed' + ? colors.error('failed') + : 'in progress') + keyValue('From', attempt.from_version) + keyValue('To', attempt.to_version ?? colors.muted('not resolved')) + keyValue('Started', formatDate(attempt.started_at)) + if (attempt.error) { + warning(attempt.error) + } + if (attempt.previous_binary_path) { + keyValue('Previous binary', attempt.previous_binary_path) + } + } + newline() +} + +/** + * Apply a release. The server restarts itself, so this deliberately does NOT + * wait for a response body beyond the acceptance — it polls afterwards and + * reports the recorded outcome once the server answers again. + */ +async function updateApplyAction(options: { + version?: string + yes?: boolean + json?: boolean +}): Promise { + await requireAuth() + await setupClient() + + const capability = await withSpinner('Checking update capability...', async () => { + const { data, error: err } = await getUpdateCapability({ client }) + if (err) { + throw new Error(getErrorMessage(err)) + } + return data + }) + + // Fail before prompting when the server has already told us it cannot. + if (!capability?.can_apply || !capability.allowed) { + error('This server cannot apply updates right now.') + if (!capability?.allowed) { + warning('Your credentials lack the platform:update permission.') + } + if (capability?.reason) { + warning(capability.reason) + } + info(`Upgrade manually on the host: ${colors.primary(capability?.manual_command ?? 'temps upgrade')}`) + process.exitCode = 1 + return + } + + if (capability.caveat) { + warning(capability.caveat) + } + + if (!options.yes) { + const confirmed = await promptConfirm({ + message: `Install ${options.version ?? 'the latest release'} and restart the server? It will be briefly unavailable.`, + default: false, + }) + if (!confirmed) { + info('Cancelled.') + return + } + } + + const started = await withSpinner('Starting update...', async () => { + const { data, error: err } = await startUpdate({ + client, + body: options.version ? { version: options.version } : {}, + }) + if (err) { + throw new Error(getErrorMessage(err)) + } + return data + }) + + if (options.json) { + json(started) + return + } + + success(`Update started from ${started?.current_version ?? 'the running version'}.`) + info('The server is downloading, verifying and installing, then restarting.') + + const outcome = await withSpinner('Waiting for the server to come back...', async () => + waitForUpdateOutcome( + capability.last_attempt?.started_at ?? null, + (started?.estimated_restart_secs ?? 45) + 60 + ) + ) + + newline() + if (!outcome) { + warning('The server did not report an outcome in time.') + info('Check the service on the host (systemctl status temps / journalctl -u temps).') + process.exitCode = 1 + return + } + if (outcome.status === 'succeeded') { + success(`temps is now running ${outcome.to_version} (was ${outcome.from_version}).`) + return + } + error(outcome.error ?? 'The update did not complete.') + info(`The server is still running ${outcome.from_version}.`) + if (outcome.previous_binary_path) { + info(`Previous binary kept at ${outcome.previous_binary_path}`) + } + process.exitCode = 1 +} + +/** + * Poll until the attempt we just started resolves. + * + * Connection errors are expected and ignored — the server is restarting, which + * is the whole point. `baselineStartedAt` distinguishes our attempt from a + * result left over from a previous one. + */ +async function waitForUpdateOutcome( + baselineStartedAt: string | null, + timeoutSecs: number +): Promise< + | { + status: string + from_version: string + to_version?: string | null + error?: string | null + previous_binary_path?: string | null + } + | null +> { + const deadline = Date.now() + timeoutSecs * 1000 + while (Date.now() < deadline) { + await new Promise((resolve) => setTimeout(resolve, 2000)) + try { + const { data } = await getUpdateCapability({ client }) + const attempt = data?.last_attempt + if ( + attempt && + attempt.status !== 'pending' && + attempt.started_at !== baselineStartedAt + ) { + return attempt + } + } catch { + // Server is down mid-restart; keep waiting. + } + } + return null +} + +/** Valid channels, plus the sentinel that clears an explicit pin. */ +const UPDATE_CHANNELS = ['stable', 'beta', 'nightly'] as const +const CHANNEL_AUTO = 'auto' + +/** Force a release check instead of waiting for the server's periodic one. */ +async function updateCheckAction(options: { json?: boolean }): Promise { + await requireAuth() + await setupClient() + + const result = await withSpinner('Checking the release API...', async () => { + const { data, error: err } = await checkForUpdate({ client }) + if (err) { + throw new Error(getErrorMessage(err)) + } + return data + }) + + if (options.json) { + json(result) + return + } + + newline() + header(`${icons.globe} Release Check`) + keyValue('Channel', result?.channel ?? colors.muted('unknown')) + keyValue('Current', result?.current_version ?? colors.muted('unknown')) + keyValue('Latest', result?.latest_version ?? colors.muted('none published')) + if (result?.update_available) { + success('An update is available. Run `temps platform update apply` to install it.') + if (result.release_url) { + keyValue('Release notes', result.release_url) + } + } else { + // Not necessarily "nothing newer exists" — on a more stable channel the + // newest release is often older than a nightly build, which is expected. + info('Nothing newer on this channel.') + } + newline() +} + +/** Show or pin the release channel this server tracks. */ +async function updateChannelAction( + channel: string | undefined, + options: { json?: boolean } +): Promise { + await requireAuth() + await setupClient() + + if (!channel) { + const capability = await withSpinner('Fetching channel...', async () => { + const { data, error: err } = await getUpdateCapability({ client }) + if (err) { + throw new Error(getErrorMessage(err)) + } + return data + }) + if (options.json) { + json({ + channel: capability?.channel, + pinned: capability?.channel_is_pinned, + }) + return + } + newline() + keyValue('Channel', capability?.channel ?? colors.muted('unknown')) + keyValue( + 'Source', + capability?.channel_is_pinned + ? 'pinned in settings' + : 'inferred from the installed version' + ) + newline() + return + } + + const requested = channel.trim().toLowerCase() + const isAuto = requested === CHANNEL_AUTO + if (!isAuto && !UPDATE_CHANNELS.includes(requested as (typeof UPDATE_CHANNELS)[number])) { + error( + `Unknown channel '${channel}'. Use one of: ${UPDATE_CHANNELS.join(', ')}, or ${CHANNEL_AUTO}.` + ) + process.exitCode = 1 + return + } + + await withSpinner('Updating channel...', async () => { + // The settings PUT replaces the whole document, so read-modify-write is + // required — sending only `self_update` would reset every other field. + const { data: current, error: readErr } = await getSettings({ client }) + if (readErr || !current) { + throw new Error(readErr ? getErrorMessage(readErr) : 'Could not read settings') + } + const { error: writeErr } = await updateSettings({ + client, + body: { + ...current, + self_update: { + enabled: current.self_update?.enabled ?? true, + channel: isAuto ? null : requested, + }, + } as never, + }) + if (writeErr) { + throw new Error(getErrorMessage(writeErr)) + } + }) + + success( + isAuto + ? 'Channel now follows the installed version.' + : `Now tracking the ${requested} channel.` + ) + info('Run `temps platform update check` to look for releases on it.') +} diff --git a/crates/temps-auth/src/permissions.rs b/crates/temps-auth/src/permissions.rs index c7c7f1cf2..9014b4c01 100644 --- a/crates/temps-auth/src/permissions.rs +++ b/crates/temps-auth/src/permissions.rs @@ -86,6 +86,12 @@ pub enum Permission { DnsProvidersRead, DnsProvidersWrite, DnsAutomationWrite, + /// Apply a release update to the server binary and restart the process. + /// Deliberately separate from `SettingsWrite`: replacing the running binary + /// and dropping every in-flight request is a different class of action from + /// editing a config value, so a custom role scoped to settings must not + /// acquire it implicitly. + PlatformUpdate, // Files permissions FilesRead, @@ -331,6 +337,7 @@ impl fmt::Display for Permission { Permission::DnsProvidersRead => "dns_providers:read", Permission::DnsProvidersWrite => "dns_providers:write", Permission::DnsAutomationWrite => "dns_automation:write", + Permission::PlatformUpdate => "platform:update", Permission::ErrorTrackingRead => "error_tracking:read", Permission::ErrorTrackingWrite => "error_tracking:write", Permission::ErrorTrackingCreate => "error_tracking:create", @@ -448,6 +455,7 @@ impl Permission { "dns_providers:read" => Some(Permission::DnsProvidersRead), "dns_providers:write" => Some(Permission::DnsProvidersWrite), "dns_automation:write" => Some(Permission::DnsAutomationWrite), + "platform:update" => Some(Permission::PlatformUpdate), "files:read" => Some(Permission::FilesRead), "files:write" => Some(Permission::FilesWrite), "files:delete" => Some(Permission::FilesDelete), @@ -597,6 +605,7 @@ impl Permission { Permission::DnsProvidersRead, Permission::DnsProvidersWrite, Permission::DnsAutomationWrite, + Permission::PlatformUpdate, Permission::FilesRead, Permission::FilesWrite, Permission::FilesDelete, @@ -814,6 +823,7 @@ impl Role { Permission::PipelinesRead, Permission::PipelinesWrite, Permission::PlatformInfoRead, + Permission::PlatformUpdate, Permission::ProjectsCreate, Permission::ProjectsDelete, Permission::ProjectsRead, @@ -959,6 +969,7 @@ impl Role { Permission::PipelinesRead, Permission::PipelinesWrite, Permission::PlatformInfoRead, + Permission::PlatformUpdate, Permission::ProjectsRead, Permission::SessionMetricsRead, Permission::SettingsRead, diff --git a/crates/temps-cli/src/commands/serve/console.rs b/crates/temps-cli/src/commands/serve/console.rs index 63b73543d..8b5e508e1 100644 --- a/crates/temps-cli/src/commands/serve/console.rs +++ b/crates/temps-cli/src/commands/serve/console.rs @@ -1215,6 +1215,12 @@ pub struct ConsoleApiParams { /// banner (`GET /settings/update-status`). Advisory read-only metadata — /// it never influences routing, auth, or connection handling. pub update_status: Arc, + /// Applies a release update on request from the settings API and exits so + /// the supervisor restarts temps on the new binary. Owned by the caller + /// (`commands/serve/mod.rs`) so the journal of a previous attempt is + /// resolved exactly once per process; registered below for ConfigPlugin's + /// `GET/POST /settings/update`. + pub self_updater: Arc, } /// Build a ClickHouse-backed metrics store from the server config, or `None` @@ -1782,6 +1788,7 @@ pub async fn start_console_api(params: ConsoleApiParams) -> anyhow::Result<()> { admin_gate_handle: provided_admin_gate_handle, retention_resolver_slot, update_status, + self_updater, } = params; // Count panics for the anonymous `error_summary` telemetry event. Only @@ -1890,6 +1897,9 @@ pub async fn start_console_api(params: ConsoleApiParams) -> anyhow::Result<()> { // it; ConfigPlugin's `GET /settings/update-status` reads it so the web // console can render the upgrade banner. service_context.register_service(update_status.clone()); + // Registered behind the trait so temps-config depends only on the + // temps-core contract, never on the CLI crate that implements it. + service_context.register_service(self_updater.clone() as Arc); // Register the shared route table (created in serve/mod.rs) // This is used by analytics-events and other plugins that need to resolve hosts diff --git a/crates/temps-cli/src/commands/serve/mod.rs b/crates/temps-cli/src/commands/serve/mod.rs index cd68e3916..b8ac83935 100644 --- a/crates/temps-cli/src/commands/serve/mod.rs +++ b/crates/temps-cli/src/commands/serve/mod.rs @@ -4,6 +4,7 @@ pub(crate) mod admin_gate_service; pub mod console; pub(crate) mod on_demand_cert; pub(crate) mod proxy; +pub(crate) mod self_update; mod shutdown; use clap::{Args, ValueEnum}; @@ -72,6 +73,18 @@ pub struct ServeCommand { #[arg(long, env = "TEMPS_CONSOLE_ADMIN_ADDRESS")] pub console_admin_address: Option, + /// Forbid applying release updates from the console, permanently for the + /// lifetime of this process. + /// + /// The console also has a Settings toggle for the same thing, but that one + /// lives in the database and can be switched back on by anyone who can + /// write settings. This flag cannot: it is set at launch, so an operator + /// who keeps upgrades under configuration management (or policy) can rule + /// the API path out entirely. The update banner still appears and still + /// shows the manual command — only the "Update now" action is refused. + #[arg(long)] + pub disable_self_update: bool, + /// Screenshot provider to use: "local" (headless Chrome), "remote", or "noop" (disabled) /// Use "noop" on servers without Chrome installed to skip screenshot functionality #[arg(long, env = "TEMPS_SCREENSHOT_PROVIDER", value_parser = ["local", "remote", "noop", "disabled", "none"])] @@ -321,6 +334,32 @@ impl ServeCommand { rt.spawn(crate::commands::upgrade::update_notifier_loop( update_status.clone(), update_check_interval, + Arc::new(temps_config::ConfigService::new( + serve_config.clone(), + db.clone(), + )), + )); + + // Companion to the notifier above: the notifier says a release exists, + // this applies it when an admin asks. Constructed here (not in the + // console) so it resolves the journal of a previous update attempt + // exactly once per process, before any request can observe it. + // + // In split topology (ADR-017) only the CONSOLE process restarts. The + // sibling `temps proxy` keeps serving :80/:443 on the binary it already + // exec'd, so the operator has to restart it separately to converge — + // stated up front rather than discovered as version skew later. + let self_update_caveat = (self.role == ServeRole::Console).then(|| { + "This process runs the console only (ADR-017 split topology). The separate \ + `temps proxy` service keeps serving traffic on the binary it started with — \ + restart it too once the console is back to finish the upgrade." + .to_string() + }); + let self_updater = Arc::new(self_update::BinarySelfUpdater::new( + serve_config.data_dir.clone(), + self.disable_self_update, + self_update_caveat, + update_status.clone(), )); // Connect to Docker once and share the handle between: @@ -537,6 +576,7 @@ impl ServeCommand { admin_gate_handle: Some(admin_gate_handle.clone()), retention_resolver_slot: retention_resolver_slot.clone(), update_status, + self_updater, }; if self.role == ServeRole::Console { diff --git a/crates/temps-cli/src/commands/serve/self_update.rs b/crates/temps-cli/src/commands/serve/self_update.rs new file mode 100644 index 000000000..3ca398aea --- /dev/null +++ b/crates/temps-cli/src/commands/serve/self_update.rs @@ -0,0 +1,1317 @@ +//! Applies a published release to the running install, on request from the API. +//! +//! This is the implementation behind `temps_core::SelfUpdater`; the HTTP surface +//! lives in temps-config (`GET/POST /settings/update`). It reuses the download, +//! checksum and atomic-swap machinery of `temps upgrade` — the only genuinely +//! new problems here are (a) deciding honestly whether the process will come +//! back after it exits, and (b) reporting the outcome of an operation that by +//! definition kills the process that started it. +//! +//! **How the restart works.** Nothing in temps restarts temps. Where a +//! supervisor is detected (systemd `Restart=always`, launchd `KeepAlive`) the +//! binary is swapped and the process exits, and the supervisor brings it back +//! on the new one. Where no supervisor is detected the binary is still +//! installed — the operator asked for the update and gets it — but the process +//! deliberately keeps running the OLD version instead of exiting into an +//! outage nothing would recover from. The capability says which of the two +//! will happen BEFORE the click, and the result says the update is not live +//! until temps is restarted. See `detect_supervisor` and `SelfUpdateRestartMode`. +//! +//! **How the outcome is reported.** The attempt is written to +//! `/self-update.json` as `pending` immediately before exiting, and +//! resolved on the next boot by comparing the running version against the +//! target (`reconcile_journal`). So the console can say "updated to v0.2.0" or +//! "came back on the old version" instead of the operator staring at a +//! reconnecting spinner with no idea what happened. + +use std::path::{Path, PathBuf}; +use std::sync::{Arc, RwLock}; + +use chrono::Utc; +use temps_core::{ + AvailableUpdate, ReleaseCheckResult, SelfUpdateAttempt, SelfUpdateBlocker, + SelfUpdateCapability, SelfUpdateError, SelfUpdatePhase, SelfUpdatePolicy, + SelfUpdateRestartMode, SelfUpdateStatus, SelfUpdater, StartedSelfUpdate, SupervisorKind, + UpdateStatusSlot, SELF_UPDATE_JOURNAL_FILE, +}; +use tracing::{error, info, warn}; + +use crate::commands::upgrade::{ + check_write_permission, current_version_tag, download_asset, download_asset_text, + extract_binary_from_tarball, fetch_latest_release_in_channel, fetch_specific_release, + is_newer_version, platform_target, replace_binary, verify_checksum, GitHubRelease, + UpgradeChannel, +}; + +/// Grace period between accepting the update and exiting the process. Long +/// enough for the 202 response and one status poll to reach the console, so the +/// UI can show "restarting" instead of an unexplained connection drop. +const RESTART_GRACE: std::time::Duration = std::time::Duration::from_millis(1_500); + +/// What the console should budget for the server to come back: the systemd unit +/// installed by `deploy.sh` uses `RestartSec=5`, plus boot (migrations, plugin +/// init). Advisory only — it drives the polling timeout, nothing else. +const ESTIMATED_RESTART_SECS: u64 = 45; + +/// Bound on an operator-triggered check so a hung release API cannot leave the +/// request (and the spinner behind it) waiting indefinitely. +const CHECK_NOW_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(15); + +#[derive(Debug, Default)] +struct UpdaterState { + phase: SelfUpdatePhase, + phase_error: Option, + last_attempt: Option, +} + +/// Replaces the on-disk binary and exits so the supervisor restarts it. +pub struct BinarySelfUpdater { + /// Binary that gets replaced — the running executable, symlinks resolved. + binary_path: PathBuf, + /// Directory holding the update journal. + data_dir: PathBuf, + /// `temps serve --disable-self-update`. A hard, API-proof off switch: unlike + /// the settings toggle, nothing reachable over HTTP can clear it. + disabled_by_flag: bool, + supervisor: SupervisorKind, + /// Split-topology note supplied by the caller, merged into `caveats()`. + topology_caveat: Option, + /// Shared notice slot the background notifier also writes. An on-demand + /// check republishes it so the banner and the version page never disagree. + update_status: Arc, + state: Arc>, +} + +impl BinarySelfUpdater { + /// Build the updater and resolve any attempt left `pending` by the previous + /// process. Never fails: a bad journal or an unresolvable binary path + /// degrades to "self-update unavailable", which the capability endpoint + /// reports with a reason. + pub fn new( + data_dir: PathBuf, + disabled_by_flag: bool, + topology_caveat: Option, + update_status: Arc, + ) -> Self { + let binary_path = std::env::current_exe() + .map(|p| std::fs::canonicalize(&p).unwrap_or(p)) + .unwrap_or_else(|e| { + warn!("Could not determine the running binary path: {}", e); + PathBuf::new() + }); + + let supervisor = detect_supervisor(); + info!( + supervisor = supervisor.as_str(), + binary = %binary_path.display(), + disabled_by_flag, + "Self-update capability initialized" + ); + + let updater = Self { + binary_path, + data_dir, + disabled_by_flag, + supervisor, + topology_caveat, + update_status, + state: Arc::new(RwLock::new(UpdaterState::default())), + }; + + let last_attempt = updater.reconcile_journal(); + if let Ok(mut state) = updater.state.write() { + state.last_attempt = last_attempt; + } + updater + } + + fn journal_path(&self) -> PathBuf { + self.data_dir.join(SELF_UPDATE_JOURNAL_FILE) + } + + /// Resolve an attempt the previous process left `pending`. + /// + /// The process that started the update cannot record its own outcome — it + /// exits mid-flight by design. So its successor decides: if we are running + /// the version the attempt targeted it succeeded, otherwise the swap did not + /// take effect and the operator needs to know that (and where the previous + /// binary was kept). + fn reconcile_journal(&self) -> Option { + let path = self.journal_path(); + let mut attempt = match read_journal(&path) { + Ok(attempt) => attempt?, + Err(e) => { + warn!( + "Ignoring unreadable self-update journal at {}: {}", + path.display(), + e + ); + return None; + } + }; + + // `InstalledPendingRestart` is resolvable too: the operator may be + // restarting right now, which is exactly this boot. + if !matches!( + attempt.status, + SelfUpdateStatus::Pending | SelfUpdateStatus::InstalledPendingRestart + ) { + return Some(attempt); + } + + let running = current_version_tag(); + let awaiting_manual_restart = attempt.status == SelfUpdateStatus::InstalledPendingRestart; + attempt.finished_at = Some(Utc::now()); + if attempt.to_version.as_deref() == Some(running.as_str()) { + attempt.status = SelfUpdateStatus::Succeeded; + info!( + from = %attempt.from_version, + to = %running, + "Self-update completed: restarted on the new version" + ); + } else if awaiting_manual_restart { + // Still on the old binary, but nothing ever promised otherwise: + // this install is waiting on a restart the operator hasn't done. + // Calling that a failure would hide a pending upgrade, so the + // attempt stays exactly where it is. + attempt.finished_at = None; + info!( + installed = ?attempt.to_version, + running = %running, + "A self-update is installed and waiting for a restart" + ); + } else { + attempt.status = SelfUpdateStatus::Failed; + let target = attempt + .to_version + .clone() + .unwrap_or_else(|| "?".to_string()); + attempt.error = Some(format!( + "Restarted on {running} instead of {target}. The binary swap did not take effect \ + — the supervisor may have relaunched an older binary from a different path, or \ + the new binary failed to start and was rolled back by the supervisor.{}", + match &attempt.previous_binary_path { + Some(p) => format!(" The replaced binary was kept at {p}."), + None => String::new(), + } + )); + error!( + from = %attempt.from_version, + target = %target, + running = %running, + "Self-update did not take effect" + ); + } + + if let Err(e) = write_journal(&path, &attempt) { + warn!("Could not persist resolved self-update journal: {}", e); + } + Some(attempt) + } + + /// The command an operator runs by hand when the API path is unavailable. + /// Always answerable — there is no state in which the manual path is gone. + fn manual_command(&self, blocker: Option) -> String { + match blocker { + Some(SelfUpdateBlocker::BinaryNotWritable) => "sudo temps upgrade".to_string(), + _ if self.supervisor == SupervisorKind::Container => { + "docker compose pull && docker compose up -d".to_string() + } + _ => "temps upgrade".to_string(), + } + } + + /// Everything true about this install that the operator should know before + /// clicking, but that does not stop the update. Composed rather than + /// single-valued because a split-topology console in a container has two + /// separate things worth saying. + fn caveats(&self) -> Option { + let mut parts: Vec = Vec::new(); + match self.supervisor { + SupervisorKind::Container => parts.push( + "This server runs in a container. The new binary is written into the container's \ + filesystem and survives a restart, but recreating the container (for example \ + `docker compose up -d` after an image change) reverts it to the image's version \ + — update your image tag for a durable upgrade." + .to_string(), + ), + SupervisorKind::None => parts.push( + "No process supervisor was detected, so temps cannot restart itself. The new \ + binary will be installed and temps will keep serving the current version until \ + you restart it." + .to_string(), + ), + SupervisorKind::Systemd | SupervisorKind::Launchd => {} + } + if let Some(topology) = &self.topology_caveat { + parts.push(topology.clone()); + } + (!parts.is_empty()).then(|| parts.join(" ")) + } + + /// First blocker that applies, or `None` when an update can run. + /// + /// Order is deliberate: an explicit operator decision (`--disable-self-update`, + /// then the settings toggle) is reported before any environmental problem, + /// because "you turned this off" is the honest answer even on a host that + /// also happens to be unsupervised. + fn find_blocker(&self, policy: &SelfUpdatePolicy) -> Option<(SelfUpdateBlocker, String)> { + if self.disabled_by_flag { + return Some(( + SelfUpdateBlocker::DisabledByFlag, + "The server was started with --disable-self-update. Restart it without that flag \ + to allow updates from the console; this cannot be re-enabled from the UI." + .to_string(), + )); + } + if !policy.enabled { + return Some(( + SelfUpdateBlocker::DisabledBySetting, + "One-click updates are turned off in Settings → Platform. An admin can re-enable \ + them there." + .to_string(), + )); + } + // NOTE: a missing supervisor is deliberately NOT a blocker. Installing + // the binary is still exactly what the operator asked for; only the + // restart is out of reach, and `restart_mode` says so up front. + if let Err(e) = platform_target() { + return Some((SelfUpdateBlocker::UnsupportedPlatform, e.to_string())); + } + if self.binary_path.as_os_str().is_empty() { + return Some(( + SelfUpdateBlocker::BinaryNotWritable, + "The path of the running binary could not be determined, so it cannot be replaced." + .to_string(), + )); + } + if let Err(e) = check_write_permission(&self.binary_path) { + return Some(( + SelfUpdateBlocker::BinaryNotWritable, + format!( + "The server user cannot replace {}: {}", + self.binary_path.display(), + e + ), + )); + } + // Checked last: an in-flight attempt is transient, and reporting it + // ahead of a permanent blocker would hide the real problem. + let phase = self + .state + .read() + .map(|s| s.phase) + .unwrap_or(SelfUpdatePhase::Idle); + if phase.is_active() { + return Some(( + SelfUpdateBlocker::InProgress, + format!("An update is already running ({}).", phase.as_str()), + )); + } + None + } + + /// Test-only: production code moves the phase through `try_claim` and the + /// job itself, which owns the transitions after the claim succeeds. + #[cfg(test)] + fn set_phase(&self, phase: SelfUpdatePhase, phase_error: Option) { + if let Ok(mut state) = self.state.write() { + state.phase = phase; + state.phase_error = phase_error; + } + } + + /// Take exclusive ownership of the updater, or report who already has it. + /// + /// Tests and sets the phase in ONE lock acquisition. The equivalent check + /// inside `find_blocker` is advisory only: two concurrent callers can both + /// observe `Idle` there and both proceed, which would put two jobs on the + /// same binary, backup and temp files — capable of leaving a truncated + /// executable behind. This is the check that actually excludes them. + fn try_claim(&self) -> Result<(), SelfUpdateError> { + let mut state = self + .state + .write() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if state.phase.is_active() { + return Err(SelfUpdateError::AlreadyRunning { + phase: state.phase.as_str(), + }); + } + state.phase = SelfUpdatePhase::Resolving; + state.phase_error = None; + Ok(()) + } +} + +/// Resolve the channel to track: the operator's explicit setting, else the one +/// implied by the running version tag. An unparsable setting falls back to +/// inference rather than erroring, so a bad value can never wedge the checker. +pub(crate) fn resolve_channel( + configured: Option<&str>, + current_version: &str, +) -> (UpgradeChannel, bool) { + match configured.and_then(UpgradeChannel::from_setting) { + Some(channel) => (channel, true), + None => ( + UpgradeChannel::for_installed_version(current_version), + false, + ), + } +} + +#[async_trait::async_trait] +impl SelfUpdater for BinarySelfUpdater { + fn capability(&self, policy: &SelfUpdatePolicy) -> SelfUpdateCapability { + let blocker = self.find_blocker(policy); + let current_version = current_version_tag(); + // The capability also backs the version page, so it reports the + // effective channel even when no update is pending. + let (channel, pinned) = resolve_channel(policy.channel.as_deref(), ¤t_version); + let (phase, phase_error, last_attempt) = match self.state.read() { + Ok(state) => ( + state.phase, + state.phase_error.clone(), + state.last_attempt.clone(), + ), + Err(poisoned) => { + let state = poisoned.into_inner(); + ( + state.phase, + state.phase_error.clone(), + state.last_attempt.clone(), + ) + } + }; + + SelfUpdateCapability { + can_apply: blocker.is_none(), + blocker: blocker.as_ref().map(|(b, _)| *b), + reason: blocker.as_ref().map(|(_, r)| r.clone()), + manual_command: self.manual_command(blocker.as_ref().map(|(b, _)| *b)), + current_version: current_version.clone(), + channel: channel.as_str().to_string(), + channel_is_pinned: pinned, + supervisor: self.supervisor, + restart_mode: self.supervisor.restart_mode(), + binary_path: self.binary_path.display().to_string(), + caveat: self.caveats(), + phase, + phase_error, + last_attempt, + } + } + + fn start( + &self, + target_version: Option, + triggered_by_user_id: Option, + policy: &SelfUpdatePolicy, + ) -> Result { + if let Some((blocker, reason)) = self.find_blocker(policy) { + if blocker == SelfUpdateBlocker::InProgress { + let phase = self + .state + .read() + .map(|s| s.phase) + .unwrap_or(SelfUpdatePhase::Idle); + return Err(SelfUpdateError::AlreadyRunning { + phase: phase.as_str(), + }); + } + return Err(SelfUpdateError::Unavailable { blocker, reason }); + } + + // Validate the pin BEFORE claiming the updater, so a typo fails the + // request outright rather than occupying the updater and surfacing as + // a background failure the caller has to go hunting for. This is also + // the security boundary for the tag — see `normalize_release_tag`. + let target_version = match target_version { + Some(version) => Some( + crate::commands::upgrade::normalize_release_tag(&version).map_err(|e| { + SelfUpdateError::InvalidVersion { + reason: e.to_string(), + } + })?, + ), + None => None, + }; + + self.try_claim()?; + + let current_version = current_version_tag(); + + let restart_mode = self.supervisor.restart_mode(); + let (channel, _) = resolve_channel(policy.channel.as_deref(), ¤t_version); + let job = UpdateJob { + binary_path: self.binary_path.clone(), + journal_path: self.journal_path(), + from_version: current_version.clone(), + target_version, + triggered_by_user_id, + restart_mode, + channel, + state: self.state.clone(), + }; + tokio::spawn(job.run()); + + info!( + user_id = ?triggered_by_user_id, + from = %current_version, + restart_mode = restart_mode.as_str(), + "Self-update accepted; downloading in the background" + ); + + Ok(StartedSelfUpdate { + current_version, + // Nothing goes down in manual mode, so the caller has nothing to + // wait out. + estimated_restart_secs: match restart_mode { + SelfUpdateRestartMode::Automatic => ESTIMATED_RESTART_SECS, + SelfUpdateRestartMode::Manual => 0, + }, + restart_mode, + }) + } + + async fn check_now(&self, channel: Option) -> Result { + let current_version = current_version_tag(); + let (channel, _) = resolve_channel(channel.as_deref(), ¤t_version); + + let release = + tokio::time::timeout(CHECK_NOW_TIMEOUT, fetch_latest_release_in_channel(channel)) + .await + .map_err(|_| { + format!( + "Checking the {} channel timed out after {}s.", + channel.as_str(), + CHECK_NOW_TIMEOUT.as_secs() + ) + })? + .map_err(|e| format!("Could not check the {} channel: {e}", channel.as_str()))?; + + let update_available = is_newer_version(&release.tag_name, ¤t_version); + if update_available { + self.update_status.set(AvailableUpdate { + current_version: current_version.clone(), + latest_version: release.tag_name.clone(), + channel: channel.as_str().to_string(), + release_url: release.html_url.clone(), + checked_at: Utc::now(), + }); + } else { + // Clear rather than leave the previous notice: after switching from + // nightly to stable the newest stable is OLDER, so it can never + // overwrite the stale nightly notice and the banner would lie. + self.update_status.clear(); + } + + info!( + channel = channel.as_str(), + current = %current_version, + latest = %release.tag_name, + update_available, + "Release check requested from the console" + ); + + Ok(ReleaseCheckResult { + channel: channel.as_str().to_string(), + current_version, + latest_version: Some(release.tag_name), + release_url: Some(release.html_url), + update_available, + }) + } + + fn available_update(&self) -> Option { + self.update_status.get() + } +} + +/// The background half of an update: everything between "accepted" and "the +/// process is gone". Owns clones rather than borrowing the updater so it can +/// outlive the request that started it. +struct UpdateJob { + binary_path: PathBuf, + journal_path: PathBuf, + from_version: String, + target_version: Option, + triggered_by_user_id: Option, + restart_mode: SelfUpdateRestartMode, + /// Channel the "newest release" lookup uses when no version is pinned. + channel: UpgradeChannel, + state: Arc>, +} + +impl UpdateJob { + fn set_phase(&self, phase: SelfUpdatePhase, phase_error: Option) { + if let Ok(mut state) = self.state.write() { + state.phase = phase; + state.phase_error = phase_error; + } + } + + async fn run(self) { + let started_at = Utc::now(); + match self.execute(started_at).await { + Ok(target) => match self.restart_mode { + SelfUpdateRestartMode::Automatic => { + // The swap is done and the journal says `pending`. Exiting + // is now the whole job: the supervisor brings us back on + // the new binary and the next boot resolves the journal. + self.set_phase(SelfUpdatePhase::Restarting, None); + warn!( + from = %self.from_version, + to = %target, + "Binary replaced — exiting so the supervisor restarts temps on the new version" + ); + tokio::time::sleep(RESTART_GRACE).await; + std::process::exit(0); + } + SelfUpdateRestartMode::Manual => { + // Installed, but exiting here would take the server down + // with nothing to bring it back. Keep serving the old + // binary and make the outstanding restart obvious. + self.set_phase(SelfUpdatePhase::PendingRestart, None); + warn!( + from = %self.from_version, + to = %target, + "Binary replaced, but no supervisor was detected — temps is STILL RUNNING \ + {} and will pick up {} when you restart it", + self.from_version, + target + ); + } + }, + Err(e) => { + let message = e.to_string(); + error!( + from = %self.from_version, + error = %message, + "Self-update failed; the running binary was left untouched" + ); + // Record the failure so it survives to the UI even if the + // operator's tab was closed when it happened. + let attempt = SelfUpdateAttempt { + from_version: self.from_version.clone(), + to_version: None, + status: SelfUpdateStatus::Failed, + started_at, + finished_at: Some(Utc::now()), + triggered_by_user_id: self.triggered_by_user_id, + error: Some(message.clone()), + previous_binary_path: None, + }; + if let Err(e) = write_journal(&self.journal_path, &attempt) { + warn!("Could not persist failed self-update attempt: {}", e); + } + if let Ok(mut state) = self.state.write() { + state.phase = SelfUpdatePhase::Failed; + state.phase_error = Some(message); + state.last_attempt = Some(attempt); + } + } + } + } + + /// Download, verify and install. Returns the version now on disk. + /// + /// Every failure here leaves the running binary untouched: the new bytes go + /// to a temp file and are only moved into place after the checksum matches + /// AND the new binary answers `--version`. + async fn execute(&self, started_at: chrono::DateTime) -> anyhow::Result { + let target = platform_target()?; + + let release = self.resolve_release().await?; + let to_version = release.tag_name.clone(); + if to_version == self.from_version { + return Err(anyhow::anyhow!( + "Already running {} — nothing to update", + self.from_version + )); + } + + let tarball_name = format!("temps-{}.tar.gz", target); + let asset = release + .assets + .iter() + .find(|a| a.name == tarball_name) + .ok_or_else(|| { + anyhow::anyhow!( + "Release {} publishes no asset for this platform ({}). Available: {}", + to_version, + target, + release + .assets + .iter() + .map(|a| a.name.as_str()) + .collect::>() + .join(", ") + ) + })?; + + info!( + to = %to_version, + size_mb = format!("{:.1}", asset.size as f64 / 1_048_576.0), + "Downloading release asset" + ); + self.set_phase(SelfUpdatePhase::Downloading, None); + let tarball = download_asset(&asset.browser_download_url).await?; + + self.set_phase(SelfUpdatePhase::Verifying, None); + // Fail closed on a missing checksum. `temps upgrade` merely warns + // because a human is watching the terminal and can judge; a background + // job triggered from a browser has nobody to make that call, so it must + // never install bytes it could not verify. + let checksum_asset = release + .assets + .iter() + .find(|a| a.name == format!("{}.sha256", tarball_name)) + .ok_or_else(|| { + anyhow::anyhow!( + "Release {} publishes no SHA-256 for {}, so the download cannot be verified. \ + Upgrade from the command line if you want to install it anyway.", + to_version, + tarball_name + ) + })?; + let expected = download_asset_text(&checksum_asset.browser_download_url).await?; + verify_checksum(&tarball, &expected)?; + + let new_binary = extract_binary_from_tarball(&tarball)?; + preflight_binary(&self.binary_path, &new_binary)?; + + self.set_phase(SelfUpdatePhase::Installing, None); + // Keep the outgoing binary next to the new one so a release that boots + // but misbehaves can be reverted with a single `mv`, without network. + let backup_path = backup_current_binary(&self.binary_path)?; + replace_binary(&self.binary_path, &new_binary)?; + + // Written BEFORE the exit: once the process is gone there is no second + // chance to record what it was doing. + let attempt = SelfUpdateAttempt { + from_version: self.from_version.clone(), + to_version: Some(to_version.clone()), + // `Pending` means "we are about to exit, resolve this on the next + // boot". In manual mode nothing exits, so the attempt is already + // as finished as it can get until the operator restarts. + status: match self.restart_mode { + SelfUpdateRestartMode::Automatic => SelfUpdateStatus::Pending, + SelfUpdateRestartMode::Manual => SelfUpdateStatus::InstalledPendingRestart, + }, + started_at, + finished_at: match self.restart_mode { + SelfUpdateRestartMode::Automatic => None, + SelfUpdateRestartMode::Manual => Some(Utc::now()), + }, + triggered_by_user_id: self.triggered_by_user_id, + error: None, + previous_binary_path: backup_path.map(|p| p.display().to_string()), + }; + write_journal(&self.journal_path, &attempt)?; + if let Ok(mut state) = self.state.write() { + state.last_attempt = Some(attempt); + } + + Ok(to_version) + } + + /// The release to install: an explicit pin, or the newest one on the channel + /// this install already tracks (inferred from the running version tag, the + /// same rule the startup notifier uses). + async fn resolve_release(&self) -> anyhow::Result { + match &self.target_version { + Some(version) => fetch_specific_release(version).await, + None => fetch_latest_release_in_channel(self.channel).await, + } + } +} + +/// Is this process running inside a container? Checked before anything else, +/// because a swapped binary there is silently discarded on the next recreate. +fn in_container() -> bool { + if Path::new("/.dockerenv").exists() || Path::new("/run/.containerenv").exists() { + return true; + } + // Fallback for runtimes that create neither marker file. + std::fs::read_to_string("/proc/1/cgroup").is_ok_and(|cgroup| { + cgroup.contains("/docker/") + || cgroup.contains("/docker-") + || cgroup.contains("containerd") + || cgroup.contains("kubepods") + || cgroup.contains("/lxc/") + }) +} + +/// Identify what will restart this process after it exits. +/// +/// Both signals are set by the supervisor itself in the child's environment, +/// so they cannot be faked by a wrong assumption about how temps was launched: +/// systemd exports `INVOCATION_ID`, launchd exports `XPC_SERVICE_NAME`. +fn detect_supervisor() -> SupervisorKind { + if in_container() { + return SupervisorKind::Container; + } + if std::env::var_os("INVOCATION_ID").is_some() && running_under_systemd_service() { + return SupervisorKind::Systemd; + } + // launchd sets this for managed jobs; processes started from a terminal + // inherit the literal "0", which means "not a launchd service". + if std::env::var("XPC_SERVICE_NAME").is_ok_and(|v| v != "0") { + return SupervisorKind::Launchd; + } + SupervisorKind::None +} + +/// Corroborate `INVOCATION_ID` against the cgroup this process actually lives in. +/// +/// `INVOCATION_ID` is inherited, so a shell started inside a unit — or anything +/// launched via `systemd-run` — carries it without being a restartable service. +/// Believing it there would make temps exit expecting a restart that never +/// comes, i.e. turn an update into an outage. A real service lives in a +/// `*.service` cgroup, so require that too. If the cgroup cannot be read (not +/// Linux, or an unusual mount), fall back to trusting the env var rather than +/// downgrading a legitimate systemd install to manual restarts. +fn running_under_systemd_service() -> bool { + match std::fs::read_to_string("/proc/self/cgroup") { + Ok(cgroup) => cgroup.lines().any(|line| { + line.rsplit('/') + .next() + .is_some_and(|unit| unit.ends_with(".service")) + }), + Err(_) => true, + } +} + +/// Run the downloaded binary's `--version` before trusting it. +/// +/// Catches the failures a checksum cannot: a build for the wrong libc, a +/// missing shared library, a corrupted extraction. Cheap insurance — without +/// it, a binary that cannot exec turns a one-click update into an outage that +/// only a console on the host can fix. +fn preflight_binary(binary_path: &Path, new_binary: &[u8]) -> anyhow::Result<()> { + let parent = binary_path + .parent() + .ok_or_else(|| anyhow::anyhow!("Cannot determine the binary's directory"))?; + // Unique per process: a stale probe from another temps (or a crashed run) + // must never be executed or overwritten mid-flight by a concurrent one. + let probe_path = parent.join(format!(".temps-update-probe.{}", std::process::id())); + + std::fs::write(&probe_path, new_binary).map_err(|e| { + anyhow::anyhow!( + "Failed to stage the new binary at {}: {}", + probe_path.display(), + e + ) + })?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + if let Err(e) = + std::fs::set_permissions(&probe_path, std::fs::Permissions::from_mode(0o755)) + { + let _ = std::fs::remove_file(&probe_path); + return Err(anyhow::anyhow!( + "Failed to make the staged binary executable: {}", + e + )); + } + } + + let output = std::process::Command::new(&probe_path) + .arg("--version") + .output(); + let _ = std::fs::remove_file(&probe_path); + + let output = output.map_err(|e| { + anyhow::anyhow!( + "The downloaded binary could not be executed on this host: {}. \ + The running version was left untouched.", + e + ) + })?; + if !output.status.success() { + return Err(anyhow::anyhow!( + "The downloaded binary exited with {} when asked for its version: {}. \ + The running version was left untouched.", + output.status, + String::from_utf8_lossy(&output.stderr).trim() + )); + } + Ok(()) +} + +/// Copy the current binary aside as `.bak`, returning where it went. +/// +/// A copy (not a rename) so the target is never momentarily absent — if the +/// process dies between the two steps, the install is still intact. Best +/// effort: failing to keep a backup must not block an otherwise valid update, +/// since the release remains downloadable. +fn backup_current_binary(binary_path: &Path) -> anyhow::Result> { + let backup_path = binary_path.with_extension("bak"); + match std::fs::copy(binary_path, &backup_path) { + Ok(_) => { + info!( + "Previous binary kept at {} — restore it with `mv {} {}` if the new version misbehaves", + backup_path.display(), + backup_path.display(), + binary_path.display() + ); + Ok(Some(backup_path)) + } + Err(e) => { + warn!( + "Could not keep a backup of the current binary at {}: {}", + backup_path.display(), + e + ); + Ok(None) + } + } +} + +fn read_journal(path: &Path) -> anyhow::Result> { + if !path.exists() { + return Ok(None); + } + let raw = std::fs::read_to_string(path) + .map_err(|e| anyhow::anyhow!("Failed to read {}: {}", path.display(), e))?; + let attempt = serde_json::from_str(&raw) + .map_err(|e| anyhow::anyhow!("Failed to parse {}: {}", path.display(), e))?; + Ok(Some(attempt)) +} + +fn write_journal(path: &Path, attempt: &SelfUpdateAttempt) -> anyhow::Result<()> { + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent) + .map_err(|e| anyhow::anyhow!("Failed to create {}: {}", parent.display(), e))?; + } + let json = serde_json::to_string_pretty(attempt) + .map_err(|e| anyhow::anyhow!("Failed to serialize the update journal: {}", e))?; + std::fs::write(path, json) + .map_err(|e| anyhow::anyhow!("Failed to write {}: {}", path.display(), e)) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn updater( + dir: &Path, + disabled_by_flag: bool, + supervisor: SupervisorKind, + ) -> BinarySelfUpdater { + BinarySelfUpdater { + // A path inside the temp dir: present and writable, so the write + // check passes and the test exercises the blocker being asserted. + binary_path: dir.join("temps"), + data_dir: dir.to_path_buf(), + disabled_by_flag, + supervisor, + topology_caveat: None, + update_status: Arc::new(UpdateStatusSlot::new()), + state: Arc::new(RwLock::new(UpdaterState::default())), + } + } + + /// Settings-backed policy for tests: enabled/disabled, channel inferred. + fn policy(enabled: bool) -> SelfUpdatePolicy { + SelfUpdatePolicy { + enabled, + channel: None, + } + } + + fn temp_dir(name: &str) -> PathBuf { + let dir = std::env::temp_dir().join(format!("temps-self-update-test-{name}")); + let _ = std::fs::remove_dir_all(&dir); + std::fs::create_dir_all(&dir).expect("create temp dir"); + std::fs::write(dir.join("temps"), b"#!/bin/sh\n").expect("write fake binary"); + dir + } + + #[test] + fn test_flag_blocks_even_when_everything_else_is_fine() { + let dir = temp_dir("flag"); + let cap = updater(&dir, true, SupervisorKind::Systemd).capability(&policy(true)); + assert!(!cap.can_apply); + assert_eq!(cap.blocker, Some(SelfUpdateBlocker::DisabledByFlag)); + // The reason must say the flag cannot be cleared from the UI, or an + // admin will hunt for a toggle that does not exist. + assert!(cap.reason.unwrap().contains("--disable-self-update")); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_flag_wins_over_settings_toggle() { + // Both off: the flag is the one the operator cannot undo in the UI, so + // it must be the reported blocker. + let dir = temp_dir("flag-wins"); + let cap = updater(&dir, true, SupervisorKind::Systemd).capability(&policy(false)); + assert_eq!(cap.blocker, Some(SelfUpdateBlocker::DisabledByFlag)); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_settings_toggle_blocks() { + let dir = temp_dir("setting"); + let cap = updater(&dir, false, SupervisorKind::Systemd).capability(&policy(false)); + assert!(!cap.can_apply); + assert_eq!(cap.blocker, Some(SelfUpdateBlocker::DisabledBySetting)); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_container_installs_with_a_caveat_instead_of_being_refused() { + let dir = temp_dir("container"); + let cap = updater(&dir, false, SupervisorKind::Container).capability(&policy(true)); + // The operator asked for the binary to be updated; a container is a + // reason to warn, not to refuse. + assert!(cap.can_apply, "blocked by {:?}", cap.blocker); + assert_eq!(cap.restart_mode, SelfUpdateRestartMode::Manual); + // ...but they must be told the swap does not survive a recreate. + let caveat = cap.caveat.expect("container needs a caveat"); + assert!( + caveat.contains("recreating") || caveat.contains("recreate"), + "{caveat}" + ); + // The durable fix points at the image, not `temps upgrade`. + assert!(cap.manual_command.contains("docker")); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_unsupervised_installs_without_restarting() { + let dir = temp_dir("unsupervised"); + let cap = updater(&dir, false, SupervisorKind::None).capability(&policy(true)); + // Installing still works with no supervisor — only the restart is out + // of reach, and that is stated rather than used as a refusal. + assert!(cap.can_apply, "blocked by {:?}", cap.blocker); + assert_eq!(cap.blocker, None); + assert_eq!(cap.restart_mode, SelfUpdateRestartMode::Manual); + let caveat = cap.caveat.expect("manual restart needs a caveat"); + assert!(caveat.contains("restart it"), "{caveat}"); + assert_eq!(cap.manual_command, "temps upgrade"); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_supervised_install_restarts_automatically_and_has_no_caveat() { + let dir = temp_dir("supervised-mode"); + let cap = updater(&dir, false, SupervisorKind::Systemd).capability(&policy(true)); + assert_eq!(cap.restart_mode, SelfUpdateRestartMode::Automatic); + assert_eq!(cap.caveat, None); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_split_topology_caveat_is_kept_alongside_the_restart_caveat() { + let dir = temp_dir("caveats"); + let mut u = updater(&dir, false, SupervisorKind::None); + u.topology_caveat = Some("Console only; restart the proxy too.".to_string()); + let caveat = u.capability(&policy(true)).caveat.expect("both caveats"); + assert!(caveat.contains("restart it"), "{caveat}"); + assert!(caveat.contains("restart the proxy too"), "{caveat}"); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_supervised_install_can_apply() { + let dir = temp_dir("ok"); + let cap = updater(&dir, false, SupervisorKind::Systemd).capability(&policy(true)); + assert!( + cap.can_apply, + "blocked by {:?}: {:?}", + cap.blocker, cap.reason + ); + assert_eq!(cap.blocker, None); + assert_eq!(cap.phase, SelfUpdatePhase::Idle); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_start_refused_when_disabled_reports_blocker() { + let dir = temp_dir("start-refused"); + let err = updater(&dir, false, SupervisorKind::Systemd) + .start(None, Some(1), &policy(false)) + .expect_err("must refuse when disabled in settings"); + assert_eq!(err.blocker(), Some(SelfUpdateBlocker::DisabledBySetting)); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_start_rejects_a_bad_version_without_claiming_the_updater() { + // A typo must fail the request outright and leave the updater free, + // not occupy it and surface later as a background failure. + let dir = temp_dir("bad-version"); + let updater = updater(&dir, false, SupervisorKind::Systemd); + let err = updater + .start( + Some("v/../../../../../owner/repo/releases/latest".to_string()), + Some(1), + &policy(true), + ) + .expect_err("must reject a traversal-shaped version"); + assert!(matches!(err, SelfUpdateError::InvalidVersion { .. })); + assert_eq!( + err.blocker(), + None, + "a bad argument is not an install blocker" + ); + // Still idle, so a corrected retry works immediately. + assert_eq!( + updater.capability(&policy(true)).phase, + SelfUpdatePhase::Idle + ); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_start_refused_while_another_attempt_runs() { + let dir = temp_dir("start-busy"); + let updater = updater(&dir, false, SupervisorKind::Systemd); + updater.set_phase(SelfUpdatePhase::Downloading, None); + let err = updater + .start(None, Some(1), &policy(true)) + .expect_err("must refuse a concurrent attempt"); + assert!(matches!(err, SelfUpdateError::AlreadyRunning { .. })); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_concurrent_starts_claim_the_updater_exactly_once() { + // Two callers racing on the same updater must not both win: they + // would share the binary, the .bak and the temp files, and can leave a + // truncated executable behind. The claim is a test-and-set under one + // lock, so exactly one wins however they interleave. + let dir = temp_dir("concurrent-claim"); + let updater = Arc::new(updater(&dir, false, SupervisorKind::Systemd)); + + let accepted = Arc::new(std::sync::atomic::AtomicUsize::new(0)); + let rejected = Arc::new(std::sync::atomic::AtomicUsize::new(0)); + let barrier = Arc::new(std::sync::Barrier::new(8)); + + let handles: Vec<_> = (0..8) + .map(|_| { + let updater = updater.clone(); + let accepted = accepted.clone(); + let rejected = rejected.clone(); + let barrier = barrier.clone(); + std::thread::spawn(move || { + barrier.wait(); + match updater.try_claim() { + Ok(()) => accepted.fetch_add(1, std::sync::atomic::Ordering::SeqCst), + Err(SelfUpdateError::AlreadyRunning { .. }) => { + rejected.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + } + Err(e) => panic!("unexpected error: {e}"), + }; + }) + }) + .collect(); + for handle in handles { + handle.join().expect("thread"); + } + + assert_eq!( + accepted.load(std::sync::atomic::Ordering::SeqCst), + 1, + "exactly one caller may claim the updater" + ); + assert_eq!(rejected.load(std::sync::atomic::Ordering::SeqCst), 7); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_failed_phase_does_not_block_a_retry() { + // A previous failure must not wedge the updater — the operator has to + // be able to try again after fixing whatever broke. + let dir = temp_dir("retry"); + let updater = updater(&dir, false, SupervisorKind::Systemd); + updater.set_phase(SelfUpdatePhase::Failed, Some("network down".to_string())); + let cap = updater.capability(&policy(true)); + assert!(cap.can_apply); + assert_eq!(cap.phase, SelfUpdatePhase::Failed); + assert_eq!(cap.phase_error.as_deref(), Some("network down")); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_pending_journal_resolves_to_succeeded_on_matching_version() { + let dir = temp_dir("journal-ok"); + let running = current_version_tag(); + let attempt = SelfUpdateAttempt { + from_version: "v0.0.1".to_string(), + to_version: Some(running.clone()), + status: SelfUpdateStatus::Pending, + started_at: Utc::now(), + finished_at: None, + triggered_by_user_id: Some(3), + error: None, + previous_binary_path: None, + }; + let path = dir.join(SELF_UPDATE_JOURNAL_FILE); + write_journal(&path, &attempt).expect("write journal"); + + let resolved = updater(&dir, false, SupervisorKind::Systemd) + .reconcile_journal() + .expect("journal entry"); + assert_eq!(resolved.status, SelfUpdateStatus::Succeeded); + assert!(resolved.finished_at.is_some()); + // Resolution is persisted, so a later boot doesn't redo it. + let reread = read_journal(&path).expect("read").expect("entry"); + assert_eq!(reread.status, SelfUpdateStatus::Succeeded); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_pending_journal_resolves_to_failed_on_version_mismatch() { + let dir = temp_dir("journal-fail"); + let attempt = SelfUpdateAttempt { + from_version: current_version_tag(), + // A version we are demonstrably not running. + to_version: Some("v999.0.0".to_string()), + status: SelfUpdateStatus::Pending, + started_at: Utc::now(), + finished_at: None, + triggered_by_user_id: None, + error: None, + previous_binary_path: Some("/usr/local/bin/temps.bak".to_string()), + }; + write_journal(&dir.join(SELF_UPDATE_JOURNAL_FILE), &attempt).expect("write journal"); + + let resolved = updater(&dir, false, SupervisorKind::Systemd) + .reconcile_journal() + .expect("journal entry"); + assert_eq!(resolved.status, SelfUpdateStatus::Failed); + let error = resolved.error.expect("failure must explain itself"); + assert!(error.contains("v999.0.0"), "{error}"); + // The operator needs to be told where the old binary went. + assert!(error.contains("/usr/local/bin/temps.bak"), "{error}"); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_resolved_journal_is_left_alone() { + // Already-decided attempts must not be re-resolved on every boot, + // which would rewrite a success into a failure once the NEXT version + // is installed. + let dir = temp_dir("journal-stable"); + let attempt = SelfUpdateAttempt { + from_version: "v0.0.1".to_string(), + to_version: Some("v0.0.2".to_string()), + status: SelfUpdateStatus::Succeeded, + started_at: Utc::now(), + finished_at: Some(Utc::now()), + triggered_by_user_id: None, + error: None, + previous_binary_path: None, + }; + write_journal(&dir.join(SELF_UPDATE_JOURNAL_FILE), &attempt).expect("write journal"); + let resolved = updater(&dir, false, SupervisorKind::Systemd) + .reconcile_journal() + .expect("journal entry"); + assert_eq!(resolved.status, SelfUpdateStatus::Succeeded); + assert_eq!(resolved.to_version.as_deref(), Some("v0.0.2")); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_installed_pending_restart_survives_a_restart_on_the_old_version() { + // The operator installed an update but has not restarted yet. Booting + // the OLD binary must not turn that into a failure — the new binary is + // still sitting there waiting. + let dir = temp_dir("journal-pending-restart"); + let attempt = SelfUpdateAttempt { + from_version: current_version_tag(), + to_version: Some("v999.0.0".to_string()), + status: SelfUpdateStatus::InstalledPendingRestart, + started_at: Utc::now(), + finished_at: Some(Utc::now()), + triggered_by_user_id: Some(1), + error: None, + previous_binary_path: None, + }; + write_journal(&dir.join(SELF_UPDATE_JOURNAL_FILE), &attempt).expect("write journal"); + + let resolved = updater(&dir, false, SupervisorKind::None) + .reconcile_journal() + .expect("journal entry"); + assert_eq!(resolved.status, SelfUpdateStatus::InstalledPendingRestart); + assert_eq!(resolved.error, None, "waiting is not a failure"); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_installed_pending_restart_resolves_once_the_new_version_boots() { + let dir = temp_dir("journal-pending-done"); + let running = current_version_tag(); + let attempt = SelfUpdateAttempt { + from_version: "v0.0.1".to_string(), + to_version: Some(running.clone()), + status: SelfUpdateStatus::InstalledPendingRestart, + started_at: Utc::now(), + finished_at: Some(Utc::now()), + triggered_by_user_id: Some(1), + error: None, + previous_binary_path: None, + }; + write_journal(&dir.join(SELF_UPDATE_JOURNAL_FILE), &attempt).expect("write journal"); + + let resolved = updater(&dir, false, SupervisorKind::None) + .reconcile_journal() + .expect("journal entry"); + assert_eq!(resolved.status, SelfUpdateStatus::Succeeded); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_missing_journal_is_not_an_error() { + let dir = temp_dir("journal-absent"); + assert!(updater(&dir, false, SupervisorKind::Systemd) + .reconcile_journal() + .is_none()); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_corrupt_journal_degrades_instead_of_failing_startup() { + let dir = temp_dir("journal-corrupt"); + std::fs::write(dir.join(SELF_UPDATE_JOURNAL_FILE), "{not json").expect("write"); + assert!(updater(&dir, false, SupervisorKind::Systemd) + .reconcile_journal() + .is_none()); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_preflight_rejects_a_binary_that_cannot_run() { + let dir = temp_dir("preflight"); + // Not a valid executable — exec must fail, and the error must say the + // running version is untouched. + let err = preflight_binary(&dir.join("temps"), b"definitely not an executable") + .expect_err("must reject"); + assert!(err.to_string().contains("left untouched"), "{err}"); + // The probe file must not be left behind. + assert!(!dir + .join(format!(".temps-update-probe.{}", std::process::id())) + .exists()); + let _ = std::fs::remove_dir_all(&dir); + } + + #[test] + fn test_backup_keeps_the_original_in_place() { + let dir = temp_dir("backup"); + let binary = dir.join("temps"); + let backup = backup_current_binary(&binary) + .expect("backup") + .expect("path"); + assert!(binary.exists(), "the original must never be moved away"); + assert!(backup.exists()); + assert_eq!( + std::fs::read(&binary).unwrap(), + std::fs::read(&backup).unwrap() + ); + let _ = std::fs::remove_dir_all(&dir); + } +} diff --git a/crates/temps-cli/src/commands/upgrade.rs b/crates/temps-cli/src/commands/upgrade.rs index 3b4e8b593..c8d783948 100644 --- a/crates/temps-cli/src/commands/upgrade.rs +++ b/crates/temps-cli/src/commands/upgrade.rs @@ -64,7 +64,19 @@ fn is_nightly_tag(tag: &str) -> bool { } impl UpgradeChannel { - fn as_str(self) -> &'static str { + /// Parse a channel configured in settings. Unknown values return `None` so + /// the caller falls back to inferring from the running version rather than + /// silently tracking the wrong channel. + pub fn from_setting(value: &str) -> Option { + match value.trim().to_ascii_lowercase().as_str() { + "stable" => Some(Self::Stable), + "beta" => Some(Self::Beta), + "nightly" => Some(Self::Nightly), + _ => None, + } + } + + pub fn as_str(self) -> &'static str { match self { Self::Stable => "stable", Self::Beta => "beta", @@ -184,9 +196,9 @@ pub struct GitHubRelease { #[derive(Clone, Deserialize, Debug)] pub struct GitHubAsset { - name: String, - browser_download_url: String, - size: u64, + pub(crate) name: String, + pub(crate) browser_download_url: String, + pub(crate) size: u64, } impl UpgradeCommand { @@ -747,7 +759,7 @@ fn version_sort_key(tag: &str) -> Option { /// exotic tags. This is deliberately stricter than `temps upgrade`, which /// treats any tag difference as upgradeable (including downgrades the /// operator explicitly pins with `--version`). -fn is_newer_version(candidate: &str, current: &str) -> bool { +pub(crate) fn is_newer_version(candidate: &str, current: &str) -> bool { match (version_sort_key(candidate), version_sort_key(current)) { (Some(candidate_key), Some(current_key)) => candidate_key > current_key, _ => false, @@ -759,9 +771,13 @@ fn is_newer_version(candidate: &str, current: &str) -> bool { /// binary. Every failure path (network, GitHub quota, unparsable tags) /// collapses to `None` with a debug log — the notifier is advisory and must /// never surface errors to an operator who didn't ask for a check. -pub async fn check_for_newer_release() -> Option { +pub async fn check_for_newer_release(configured_channel: Option<&str>) -> Option { let current_version = current_version_tag(); - let channel = UpgradeChannel::for_installed_version(¤t_version); + // An explicit channel from settings wins; otherwise fall back to the tag + // the running binary carries, which is what the CLI has always done. + let channel = configured_channel + .and_then(UpgradeChannel::from_setting) + .unwrap_or_else(|| UpgradeChannel::for_installed_version(¤t_version)); let release = match tokio::time::timeout( UPDATE_CHECK_TIMEOUT, @@ -815,10 +831,18 @@ pub async fn check_for_newer_release() -> Option { pub async fn update_notifier_loop( slot: Arc, interval: std::time::Duration, + config_service: Arc, ) { tokio::time::sleep(UPDATE_CHECK_STARTUP_DELAY).await; loop { - if let Some(notice) = check_for_newer_release().await { + // Re-read every pass so switching channel in the console takes effect + // on the next check instead of requiring a restart. + let configured_channel = config_service + .get_settings() + .await + .ok() + .and_then(|s| s.self_update().channel); + if let Some(notice) = check_for_newer_release(configured_channel.as_deref()).await { tracing::warn!( current_version = %notice.current_version, latest_version = %notice.latest_version, @@ -843,7 +867,7 @@ pub async fn update_notifier_loop( } /// Determine the platform target string matching release asset names. -fn platform_target() -> anyhow::Result { +pub(crate) fn platform_target() -> anyhow::Result { let target = match (OS, ARCH) { ("macos", "x86_64") => "darwin-amd64", ("macos", "aarch64") => "darwin-arm64", @@ -920,19 +944,88 @@ fn pick_release_for_channel( releases.into_iter().find(|r| channel.includes(r)) } -/// Fetch a specific release by tag from GitHub. -async fn fetch_specific_release(version: &str) -> anyhow::Result { - // Ensure the version starts with 'v' - let tag = if version.starts_with('v') { - version.to_string() - } else { - format!("v{}", version) +/// Normalize a caller-supplied version into a release tag, rejecting anything +/// that is not a plain semver-shaped tag. +/// +/// **This is a security boundary, not cosmetics.** The tag is interpolated into +/// a GitHub API path, and the `url` crate resolves `..` segments when parsing — +/// so an unvalidated tag like `v/../../../../../owner/repo/releases/latest` +/// walks out of `gotempsh/temps` and resolves to *another repository's* release. +/// Everything downstream then behaves normally: it downloads that release's +/// `temps-.tar.gz`, checks it against that release's own `.sha256` +/// (which of course matches), executes it for the version preflight, and +/// installs it over the running binary. In other words, a caller who can reach +/// `temps upgrade --version` or `POST /settings/update` could install an +/// arbitrary binary. Keep this strict. +pub(crate) fn normalize_release_tag(version: &str) -> anyhow::Result { + let trimmed = version.trim(); + if trimmed.is_empty() { + return Err(anyhow::anyhow!("Version must not be empty")); + } + + let core = trimmed.strip_prefix('v').unwrap_or(trimmed); + // Split off the prerelease/build suffix; the numeric core is validated + // separately so `1.2.3` and `1.2.3-beta.4` are both accepted but + // `1.2.3/../x` is not. + let (numeric, suffix) = match core.split_once(['-', '+']) { + Some((numeric, suffix)) => (numeric, Some(suffix)), + None => (core, None), }; - let url = format!( - "https://api.github.com/repos/gotempsh/temps/releases/tags/{}", - tag - ); + let mut parts = numeric.split('.'); + let mut components = 0; + for _ in 0..3 { + let component = parts.next().ok_or_else(|| { + anyhow::anyhow!("Version '{version}' must look like 'v1.2.3' or 'v1.2.3-beta.4'") + })?; + if component.is_empty() || !component.bytes().all(|b| b.is_ascii_digit()) { + return Err(anyhow::anyhow!( + "Version '{version}' has a non-numeric component '{component}'" + )); + } + components += 1; + } + if components != 3 || parts.next().is_some() { + return Err(anyhow::anyhow!( + "Version '{version}' must have exactly three numeric components" + )); + } + + if let Some(suffix) = suffix { + // Deliberately narrow: alphanumerics, dot and dash only. No slashes, no + // percent-encoding, nothing that can add or escape a path segment. + if suffix.is_empty() + || !suffix + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b == b'.' || b == b'-') + { + return Err(anyhow::anyhow!( + "Version '{version}' has an unsupported prerelease suffix" + )); + } + if suffix.split('.').any(|segment| segment.is_empty()) { + return Err(anyhow::anyhow!( + "Version '{version}' has an empty prerelease segment" + )); + } + } + + Ok(format!("v{core}")) +} + +/// Fetch a specific release by tag from GitHub. +pub(crate) async fn fetch_specific_release(version: &str) -> anyhow::Result { + let tag = normalize_release_tag(version)?; + + // Built by pushing a validated segment rather than string interpolation, so + // even a future validation slip cannot alter the path structure. + let mut url = reqwest::Url::parse("https://api.github.com/repos/gotempsh/temps/releases/tags/") + .map_err(|e| anyhow::anyhow!("Failed to build the release URL: {e}"))?; + url.path_segments_mut() + .map_err(|_| anyhow::anyhow!("Failed to build the release URL"))? + .pop_if_empty() + .push(&tag); + let url = url.to_string(); let client = reqwest::Client::new(); let response = client @@ -1037,7 +1130,7 @@ pub(crate) fn verify_checksum(data: &[u8], checksum_text: &str) -> anyhow::Resul } /// Extract the `temps` binary from a gzipped tarball. -fn extract_binary_from_tarball(tarball_bytes: &[u8]) -> anyhow::Result> { +pub(crate) fn extract_binary_from_tarball(tarball_bytes: &[u8]) -> anyhow::Result> { use flate2::read::GzDecoder; use std::io::Read; @@ -1061,7 +1154,7 @@ fn extract_binary_from_tarball(tarball_bytes: &[u8]) -> anyhow::Result> } /// Check we have write permission to the binary path. -fn check_write_permission(binary_path: &PathBuf) -> anyhow::Result<()> { +pub(crate) fn check_write_permission(binary_path: &PathBuf) -> anyhow::Result<()> { // Check the parent directory is writable (for atomic rename) let parent = binary_path .parent() @@ -1098,12 +1191,15 @@ fn check_write_permission(binary_path: &PathBuf) -> anyhow::Result<()> { /// 1. Write new binary to a temp file next to the target /// 2. Set executable permissions /// 3. Rename temp file over the target (atomic on the same filesystem) -fn replace_binary(binary_path: &PathBuf, new_binary: &[u8]) -> anyhow::Result<()> { +pub(crate) fn replace_binary(binary_path: &PathBuf, new_binary: &[u8]) -> anyhow::Result<()> { let parent = binary_path .parent() .ok_or_else(|| anyhow::anyhow!("Cannot determine parent directory"))?; - let tmp_path = parent.join(".temps-upgrade-tmp"); + // Unique per process so a concurrent upgrader (another temps, or the CLI + // run alongside the server) cannot half-write the file this one is about to + // rename over the live binary. + let tmp_path = parent.join(format!(".temps-upgrade-tmp.{}", std::process::id())); // Write the new binary to temp file fs::write(&tmp_path, new_binary) @@ -1460,6 +1556,72 @@ mod tests { assert!(!g.contains("systemctl")); } + #[test] + fn test_normalize_release_tag_accepts_real_tags() { + for (input, expected) in [ + ("v1.2.3", "v1.2.3"), + ("1.2.3", "v1.2.3"), + ("v0.1.0-beta.55", "v0.1.0-beta.55"), + ( + "v0.1.0-nightly.20260806.c64e8f98", + "v0.1.0-nightly.20260806.c64e8f98", + ), + (" v1.0.0 ", "v1.0.0"), + ] { + assert_eq!( + normalize_release_tag(input).expect(input), + expected, + "should accept {input}" + ); + } + } + + #[test] + fn test_normalize_release_tag_blocks_path_traversal() { + // The exploit this validation exists for: the `url` crate resolves + // `..` segments, so an unvalidated tag escapes gotempsh/temps and + // reaches an arbitrary repository's release — whose asset would then + // be downloaded, checksum-matched against ITS OWN published hash, + // executed by the preflight and installed over the running binary. + for input in [ + "v/../../../../../rust-lang/rust/releases/latest", + "v1.2.3/../../../../../owner/repo/releases/latest", + "../../owner/repo/releases/latest", + "v1.2.3/..", + "v1.2.3/extra", + "v1.2.3%2f..%2fowner", + ] { + assert!( + normalize_release_tag(input).is_err(), + "must reject traversal: {input}" + ); + } + } + + #[test] + fn test_normalize_release_tag_blocks_malformed_tags() { + for input in [ + "", + " ", + "v", + "v1.2", + "v1.2.3.4", + "v1.2.x", + "v1.2.3-beta 4", + "v1.2.3-", + "v1.2.3-beta..4", + "v1.2.3?foo=bar", + "v1.2.3#frag", + "v1.2.3@evil.com", + "http://evil.com/v1.2.3", + ] { + assert!( + normalize_release_tag(input).is_err(), + "must reject malformed tag: {input:?}" + ); + } + } + #[test] fn test_platform_target() { // Just verify it doesn't panic on the current platform diff --git a/crates/temps-config/src/handler.rs b/crates/temps-config/src/handler.rs index 307cd4e70..ed1778cae 100644 --- a/crates/temps-config/src/handler.rs +++ b/crates/temps-config/src/handler.rs @@ -34,6 +34,11 @@ pub struct SettingsState { /// (e.g. the standalone proxy's plugin context) — the update-status /// endpoint then reports "no update known". pub update_status: Option>, + /// Applies a release and restarts the server. `None` in hosts that cannot + /// meaningfully restart themselves (e.g. the standalone proxy) — the + /// update endpoints then report the feature as unsupported here rather + /// than pretending it is merely misconfigured. + pub self_updater: Option>, } #[derive(Debug, Clone, serde::Serialize)] @@ -60,6 +65,36 @@ impl AuditOperation for SettingsUpdatedAudit { } } +/// Audit record for a console-triggered platform update. Written before the +/// process exits, so the trail survives the restart it causes. +#[derive(Debug, Clone, serde::Serialize)] +struct PlatformUpdateStartedAudit { + context: AuditContext, + /// Version the server was running when the update was requested. + from_version: String, + /// Explicitly pinned target, or `None` for "newest on this channel". + target_version: Option, +} + +impl AuditOperation for PlatformUpdateStartedAudit { + fn operation_type(&self) -> String { + "PLATFORM_UPDATE_STARTED".to_string() + } + fn user_id(&self) -> Option { + Some(self.context.user_id) + } + fn ip_address(&self) -> Option { + self.context.ip_address.clone() + } + fn user_agent(&self) -> &str { + &self.context.user_agent + } + fn serialize(&self) -> anyhow::Result { + serde_json::to_string(self) + .map_err(|e| anyhow::anyhow!("Failed to serialize audit operation {}", e)) + } +} + /// Response for successful settings update #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct SettingsUpdateResponse { @@ -175,6 +210,11 @@ pub struct AppSettingsResponse { /// Per-turn limits for the AI chat. No sensitive content. pub ai_chat_limits: AiChatLimitsSettings, + /// Whether admins may apply a release from the console. This is the + /// database-backed toggle only — a server started with + /// `--disable-self-update` refuses regardless of what this says, which + /// `GET /settings/update` reports as the authoritative answer. + pub self_update: temps_core::SelfUpdateSettings, } /// Monitoring settings with the ClickHouse DSN masked. @@ -289,6 +329,9 @@ pub struct DockerRegistrySettingsMasked { impl From for AppSettingsResponse { fn from(settings: AppSettings) -> Self { + // Resolved before the literal below starts moving fields out of + // `settings`; absence means "never configured", which reads as default. + let self_update = settings.self_update(); Self { external_url: settings.external_url, internal_url: settings.internal_url, @@ -387,6 +430,7 @@ impl From for AppSettingsResponse { cluster_dns: settings.cluster_dns, build_limits: settings.build_limits, ai_chat_limits: settings.ai_chat_limits, + self_update, } } } @@ -465,6 +509,9 @@ impl AppSettingsResponse { paths( get_settings, get_update_status, + get_update_capability, + start_update, + check_for_update, get_disk_status, update_settings, generate_join_token, @@ -503,6 +550,17 @@ impl AppSettingsResponse { EnrollmentTokenListResponse, RouteRefreshResponse, UpdateStatusResponse, + UpdateCapabilityResponse, + StartUpdateRequest, + StartUpdateResponse, + temps_core::SelfUpdateSettings, + temps_core::SelfUpdateAttempt, + temps_core::SelfUpdateBlocker, + temps_core::SelfUpdatePhase, + temps_core::SelfUpdateRestartMode, + temps_core::SelfUpdateStatus, + temps_core::ReleaseCheckResult, + temps_core::SupervisorKind, )), info( title = "Settings API", @@ -518,6 +576,11 @@ pub fn configure_routes() -> Router> { .route("/settings", get(get_settings)) .route("/settings", put(update_settings)) .route("/settings/update-status", get(get_update_status)) + .route( + "/settings/update", + get(get_update_capability).post(start_update), + ) + .route("/settings/update/check", post(check_for_update)) .route("/settings/disk-status", get(get_disk_status)) .route("/settings/join-token/generate", post(generate_join_token)) .route("/settings/join-token", delete(revoke_join_token)) @@ -823,6 +886,364 @@ async fn get_update_status( Ok(Json(response)) } +// ── Applying a release from the console ────────────────────────────────────── + +/// Whether this install can apply a release update on request, and how the last +/// attempt went. +/// +/// Deliberately answerable even when the answer is "no": an operator who cannot +/// use the button still needs to know *why* and what to run instead, so this +/// never 404s or returns an empty body when the feature is unavailable. +#[derive(Debug, Serialize, ToSchema)] +pub struct UpdateCapabilityResponse { + /// True only when a request would actually download, install and restart. + pub can_apply: bool, + /// Whether the *caller* holds `platform:update`. Distinct from `can_apply`, + /// which describes the server: the console shows the action only when both + /// are true, so a reader is never offered a button that would 403. + pub allowed: bool, + /// Machine-readable reason `can_apply` is false (`disabled_by_flag`, + /// `disabled_by_setting`, `container`, `no_supervisor`, `binary_not_writable`, + /// `unsupported_platform`, `in_progress`). + pub blocker: Option, + /// Operator-facing explanation of `blocker`. + pub reason: Option, + /// Non-blocking warning to show with the confirmation (split topology). + pub caveat: Option, + /// The equivalent command to run by hand. Always present. + pub manual_command: String, + /// Version tag of the running binary. Always present — the version page + /// needs it whether or not an update exists. + pub current_version: String, + /// Channel actually tracked, after applying the configured override or + /// falling back to inference from the running version tag. + pub channel: String, + /// True when `channel` was set explicitly in settings rather than inferred. + pub channel_is_pinned: bool, + /// What would restart the process: `systemd`, `launchd`, `container`, `none`. + pub supervisor: temps_core::SupervisorKind, + /// `automatic` when applying an update also restarts temps; `manual` when + /// it only installs the binary and the operator restarts on their own + /// schedule. Lets the console set expectations before the click. + pub restart_mode: temps_core::SelfUpdateRestartMode, + /// Binary that would be replaced. + pub binary_path: String, + /// Phase of an in-flight attempt: `idle` when none is running. + pub phase: temps_core::SelfUpdatePhase, + /// Failure detail while `phase` is `failed`. + pub phase_error: Option, + /// Most recent attempt, including one resolved during this boot — this is + /// how the console reports the outcome of an update that restarted it. + pub last_attempt: Option, +} + +/// Optional pin for the version to install. +#[derive(Debug, Default, Deserialize, ToSchema)] +pub struct StartUpdateRequest { + /// Release tag to install (e.g. `v0.2.0`). Omit to take the newest release + /// on the channel this install already tracks. + pub version: Option, +} + +/// Acknowledgement that an update was accepted and is running. +#[derive(Debug, Serialize, ToSchema)] +pub struct StartUpdateResponse { + /// Version the server is running as it accepts this request. + pub current_version: String, + /// How long to allow for the server to come back before treating the + /// restart as failed. `0` when nothing restarts. + pub estimated_restart_secs: u64, + /// `automatic` (temps restarts itself) or `manual` (installed only). + pub restart_mode: temps_core::SelfUpdateRestartMode, + pub message: String, +} + +/// Read the database-backed half of the update policy. +/// +/// Fails CLOSED: if settings cannot be read we must not report (or act on) a +/// capability the operator may have deliberately turned off. +async fn load_self_update_policy(app_state: &SettingsState) -> temps_core::SelfUpdatePolicy { + match app_state.config_service.get_settings().await { + Ok(settings) => { + let self_update = settings.self_update(); + temps_core::SelfUpdatePolicy { + enabled: self_update.enabled, + channel: self_update.channel, + } + } + Err(e) => { + error!("Could not read self-update settings, treating as disabled: {e}"); + temps_core::SelfUpdatePolicy { + enabled: false, + channel: None, + } + } + } +} + +/// Build the "no updater registered in this process" answer. +/// +/// Reached in hosts that run the settings API without owning the process +/// lifecycle. Reported as a capability with a reason rather than an error, so +/// the console renders the same explain-and-point-at-the-CLI surface it uses +/// for every other blocked state. +fn updater_unavailable_response(allowed: bool) -> UpdateCapabilityResponse { + UpdateCapabilityResponse { + can_apply: false, + allowed, + blocker: Some(temps_core::SelfUpdateBlocker::NotSupported), + reason: Some( + "This process does not manage the temps binary, so it cannot apply an update. \ + Upgrade from the command line on the host instead." + .to_string(), + ), + caveat: None, + manual_command: "temps upgrade".to_string(), + current_version: String::new(), + channel: "unknown".to_string(), + channel_is_pinned: false, + supervisor: temps_core::SupervisorKind::None, + restart_mode: temps_core::SelfUpdateRestartMode::Manual, + binary_path: String::new(), + phase: temps_core::SelfUpdatePhase::Idle, + phase_error: None, + last_attempt: None, + } +} + +/// Ask the release API for the newest version on this install's channel, now, +/// instead of waiting for the background notifier's next pass. +#[utoipa::path( + tag = "Settings", + post, + path = "/settings/update/check", + responses( + (status = 200, description = "Result of the release check", body = temps_core::ReleaseCheckResult), + (status = 401, description = "Unauthorized"), + (status = 403, description = "Insufficient permissions"), + (status = 502, description = "The release API could not be reached", body = temps_core::ProblemDetails), + (status = 501, description = "This process cannot check for updates", body = temps_core::ProblemDetails) + ), + security(("bearer_auth" = [])) +)] +async fn check_for_update( + RequireAuth(auth): RequireAuth, + State(app_state): State>, +) -> Result { + // A read-only network probe that changes no state the operator can't + // already see, so it sits with the rest of the settings reads. + permission_guard!(auth, SettingsRead); + + let Some(updater) = app_state.self_updater.as_ref() else { + return Err(ErrorBuilder::new(StatusCode::NOT_IMPLEMENTED) + .title("Update Checks Not Supported Here") + .detail("This process does not track temps releases.") + .build()); + }; + + let policy = load_self_update_policy(&app_state).await; + let result = updater.check_now(policy.channel).await.map_err(|reason| { + // Upstream reachability, not a client mistake — say so plainly so the + // operator looks at egress rather than at their own request. + ErrorBuilder::new(StatusCode::BAD_GATEWAY) + .title("Release Check Failed") + .detail(reason) + .build() + })?; + + Ok(Json(result)) +} + +/// Report whether a release update can be applied from the console. +#[utoipa::path( + tag = "Settings", + get, + path = "/settings/update", + responses( + (status = 200, description = "Self-update capability for this install", body = UpdateCapabilityResponse), + (status = 401, description = "Unauthorized"), + (status = 403, description = "Insufficient permissions") + ), + security(("bearer_auth" = [])) +)] +async fn get_update_capability( + RequireAuth(auth): RequireAuth, + State(app_state): State>, +) -> Result { + // Readable by anyone who can read settings: the banner needs this to decide + // what to render. Actually *starting* an update needs `platform:update`, + // reported separately as `allowed`. + permission_guard!(auth, SettingsRead); + + let allowed = auth.has_permission(&temps_auth::Permission::PlatformUpdate); + + let Some(updater) = app_state.self_updater.as_ref() else { + return Ok(Json(updater_unavailable_response(allowed))); + }; + + let capability = updater.capability(&load_self_update_policy(&app_state).await); + Ok(Json(UpdateCapabilityResponse { + // Describes the SERVER only. Permission is reported separately as + // `allowed` so a blocked install and an under-privileged caller stay + // distinguishable — collapsing them would leave the UI unable to say + // which of the two it is looking at. + can_apply: capability.can_apply, + allowed, + blocker: capability.blocker, + reason: capability.reason, + caveat: capability.caveat, + manual_command: capability.manual_command, + current_version: capability.current_version, + channel: capability.channel, + channel_is_pinned: capability.channel_is_pinned, + supervisor: capability.supervisor, + restart_mode: capability.restart_mode, + // Host filesystem layout is only useful to someone who can actually + // run an update; readers with `settings:read` alone get nothing from + // it but a hint about where the install lives. + binary_path: if allowed { + capability.binary_path + } else { + String::new() + }, + phase: capability.phase, + phase_error: capability.phase_error, + last_attempt: capability.last_attempt, + })) +} + +/// Install a release and restart the server. +/// +/// Returns as soon as the attempt is accepted: the download and swap run in the +/// background and the process then exits so its supervisor restarts it on the +/// new binary. Poll `GET /settings/update` for progress — after the restart, +/// `last_attempt` carries the outcome. +#[utoipa::path( + tag = "Settings", + post, + path = "/settings/update", + request_body = StartUpdateRequest, + responses( + (status = 202, description = "Update accepted; the server will restart", body = StartUpdateResponse), + (status = 401, description = "Unauthorized"), + (status = 403, description = "Insufficient permissions"), + (status = 409, description = "Update unavailable or already running", body = temps_core::ProblemDetails), + (status = 501, description = "This process cannot apply updates", body = temps_core::ProblemDetails) + ), + security(("bearer_auth" = [])) +)] +async fn start_update( + RequireAuth(auth): RequireAuth, + State(app_state): State>, + Extension(metadata): Extension, + Json(request): Json, +) -> Result { + // NOT SettingsWrite: replacing the running binary and dropping every + // in-flight request is a different class of action from editing a config + // value, so it carries its own permission. + permission_guard!(auth, PlatformUpdate); + + let Some(updater) = app_state.self_updater.as_ref() else { + return Err(ErrorBuilder::new(StatusCode::NOT_IMPLEMENTED) + .title("Self-Update Not Supported Here") + .detail( + "This process does not manage the temps binary. Upgrade from the command line \ + on the host with `temps upgrade`.", + ) + .build()); + }; + + let started = updater + .start( + request.version.clone(), + Some(auth.user_id()), + &load_self_update_policy(&app_state).await, + ) + .map_err(self_update_error_to_problem)?; + + // Audited BEFORE the restart — the process is about to exit, and an update + // that leaves no trace of who triggered it is exactly the record an + // operator needs afterwards. + let audit = PlatformUpdateStartedAudit { + context: AuditContext { + user_id: auth.user_id(), + ip_address: Some(metadata.ip_address.clone()), + user_agent: metadata.user_agent.clone(), + }, + from_version: started.current_version.clone(), + target_version: request.version.clone(), + }; + if let Err(e) = app_state.audit_service.create_audit_log(&audit).await { + error!("Failed to create audit log for platform update: {}", e); + } + + info!( + user_id = auth.user_id(), + from = %started.current_version, + target = ?request.version, + "Platform update started from the console" + ); + + Ok(( + StatusCode::ACCEPTED, + Json(StartUpdateResponse { + current_version: started.current_version, + estimated_restart_secs: started.estimated_restart_secs, + restart_mode: started.restart_mode, + message: match started.restart_mode { + temps_core::SelfUpdateRestartMode::Automatic => { + "Update started. The server will restart when the new binary is installed." + } + temps_core::SelfUpdateRestartMode::Manual => { + "Update started. The new binary will be installed, but temps keeps running \ + the current version until you restart it." + } + } + .to_string(), + }), + )) +} + +fn self_update_error_to_problem(error: temps_core::SelfUpdateError) -> Problem { + use temps_core::{SelfUpdateBlocker, SelfUpdateError}; + let status = match error { + // These describe current state the caller can change (a flag, a + // setting, a running attempt) rather than a malformed request. + SelfUpdateError::Unavailable { .. } | SelfUpdateError::AlreadyRunning { .. } => { + StatusCode::CONFLICT + } + // A bad argument, not a state of the install. + SelfUpdateError::InvalidVersion { .. } => StatusCode::BAD_REQUEST, + }; + let Some(blocker) = error.blocker() else { + return ErrorBuilder::new(status) + .title("Invalid Version") + .detail(error.to_string()) + .build(); + }; + let title = match blocker { + SelfUpdateBlocker::DisabledByFlag | SelfUpdateBlocker::DisabledBySetting => { + "Self-Update Disabled" + } + SelfUpdateBlocker::InProgress => "Update Already Running", + SelfUpdateBlocker::NotSupported => "Self-Update Not Supported Here", + SelfUpdateBlocker::BinaryNotWritable => "Binary Not Writable", + SelfUpdateBlocker::UnsupportedPlatform => "Unsupported Platform", + }; + ErrorBuilder::new(status) + .title(title) + .detail(error.to_string()) + .value( + "blocker", + serde_json::to_value(blocker) + .unwrap_or(serde_json::Value::Null) + .as_str() + .unwrap_or_default() + .to_string(), + ) + .build() +} + /// Get application settings #[utoipa::path( tag = "Settings", @@ -937,6 +1358,22 @@ fn preserve_self_recorded_fields(incoming: &mut AppSettings, current: &AppSettin incoming.console_version = current.console_version.clone(); } +/// Keep security-relevant settings the client did not mention. +/// +/// The settings PUT replaces the whole document and `AppSettings` deserializes +/// with `#[serde(default)]`, so a field a client omits is indistinguishable +/// from one it reset. That is harmless for presentation settings and dangerous +/// for `self_update`: an operator who deliberately forbade console updates +/// would have that silently undone by any unrelated save from a client built +/// before the field existed — including a published CLI, or a stale browser +/// tab. Absence therefore means "leave it alone", and only an explicit value +/// changes it. +fn preserve_omitted_security_fields(incoming: &mut AppSettings, current: &AppSettings) { + if incoming.self_update.is_none() { + incoming.self_update = current.self_update.clone(); + } +} + /// Trim and validate an optional URL setting (`external_url`/`internal_url`). /// A blank value (after trimming) means "unset" and is normalized to `None` /// rather than rejected -- `external_url` previously validated the raw @@ -1171,6 +1608,7 @@ async fn update_settings( // `#[serde(default)]` → None). Done first, before any field is moved // out of `current_settings` below. preserve_self_recorded_fields(&mut settings, ¤t_settings); + preserve_omitted_security_fields(&mut settings, ¤t_settings); // Per-provider credentials: keep existing unless caller supplied a new one for (id, current_cfg) in current_settings.agent_sandbox.providers.iter() { @@ -1624,6 +2062,72 @@ mod tests { use super::*; use temps_core::{AgentSandboxSettings, AiChatLimitsSettings, AppSettings, ProviderConfig}; + /// An operator's decision to forbid console updates must survive a save + /// from a client that has never heard of the field. + /// + /// `AppSettings` deserializes with `#[serde(default)]` and the PUT replaces + /// the whole document, so an omitted `self_update` used to come back as + /// "enabled" — silently re-arming the server's ability to replace its own + /// binary. Regression test for that: absence means "leave it alone". + #[test] + fn omitting_self_update_preserves_the_stored_value() { + let current = AppSettings { + self_update: Some(temps_core::SelfUpdateSettings { + enabled: false, + channel: Some("stable".to_string()), + }), + ..AppSettings::default() + }; + // What serde produces for a body that never mentioned the field. + let mut incoming = AppSettings { + self_update: None, + ..AppSettings::default() + }; + + preserve_omitted_security_fields(&mut incoming, ¤t); + + let effective = incoming.self_update(); + assert!( + !effective.enabled, + "an omitted self_update must not re-enable console updates" + ); + assert_eq!(effective.channel.as_deref(), Some("stable")); + } + + /// An explicit value still wins — this is a preserve, not a freeze. + #[test] + fn an_explicit_self_update_value_overrides_the_stored_one() { + let current = AppSettings { + self_update: Some(temps_core::SelfUpdateSettings { + enabled: false, + channel: None, + }), + ..AppSettings::default() + }; + let mut incoming = AppSettings { + self_update: Some(temps_core::SelfUpdateSettings { + enabled: true, + channel: Some("beta".to_string()), + }), + ..AppSettings::default() + }; + + preserve_omitted_security_fields(&mut incoming, ¤t); + + let effective = incoming.self_update(); + assert!(effective.enabled); + assert_eq!(effective.channel.as_deref(), Some("beta")); + } + + /// A never-configured install reads as the documented default. + #[test] + fn absent_self_update_reads_as_enabled_by_default() { + let settings = AppSettings::default(); + assert!(settings.self_update.is_none()); + assert!(settings.self_update().enabled); + assert_eq!(settings.self_update().channel, None); + } + /// The stored value and the effective value must be the same number. /// /// The runtime clamps on read, so an out-of-range value could never break diff --git a/crates/temps-config/src/plugin.rs b/crates/temps-config/src/plugin.rs index f6a346149..018a79070 100644 --- a/crates/temps-config/src/plugin.rs +++ b/crates/temps-config/src/plugin.rs @@ -74,6 +74,10 @@ impl TempsPlugin for ConfigPlugin { // not). Optional: without it, update-status just reports "no update". let update_status = context.get_service::(); + // Same optionality as the slot above, for the same reason: only a host + // that owns the binary and the process lifecycle registers an updater. + let self_updater = context.get_service::(); + // Create SettingsState let settings_state = Arc::new(SettingsState { config_service, @@ -81,6 +85,7 @@ impl TempsPlugin for ConfigPlugin { route_table_refresher, enrollment_token_service, update_status, + self_updater, }); // Configure routes with the state diff --git a/crates/temps-core/src/app_settings.rs b/crates/temps-core/src/app_settings.rs index 4c67a7576..39611fe24 100644 --- a/crates/temps-core/src/app_settings.rs +++ b/crates/temps-core/src/app_settings.rs @@ -121,6 +121,23 @@ pub struct AppSettings { #[serde(default)] pub require_mfa_for_admins: bool, + /// One-click "Update now" from the console. Enabled by default; an admin + /// can turn it off here to keep upgrades on the CLI/config-management path. + /// + /// This is the *soft* switch — it is stored in the database, so whoever can + /// write settings can also turn it back on. Operators who need an upgrade + /// path that no console session can re-open should start the server with + /// `--disable-self-update`, which wins over this field unconditionally. + /// `None` means the client did not express an opinion, NOT "reset to + /// default". Every other field on this struct is safe to re-default on a + /// partial write, but this one gates whether the server may replace its own + /// binary — silently flipping it back on because an older client PUT a + /// settings document without it would undo a deliberate security decision. + /// The update handler preserves the stored value when this is absent; read + /// it through `self_update()`. + #[serde(default)] + pub self_update: Option, + /// Binary version tag (e.g. "v0.1.0") of the *console* process /// (`temps serve`, role=all or role=console) that last started. Written /// on console startup; read by the standalone `temps proxy` to detect @@ -905,11 +922,54 @@ impl Default for AppSettings { observability_retention: ObservabilityRetentionSettings::default(), setup_complete: false, require_mfa_for_admins: false, + self_update: None, console_version: None, } } } +impl AppSettings { + /// Effective self-update settings, treating "never configured" as the + /// default. Use this everywhere instead of touching the `Option` directly, + /// so absence and an explicit default behave identically at read time. + pub fn self_update(&self) -> SelfUpdateSettings { + self.self_update.clone().unwrap_or_default() + } +} + +/// Controls the console's one-click "Update now" action. +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, PartialEq, Eq)] +#[serde(default)] +pub struct SelfUpdateSettings { + /// Allow admins to apply a release and restart the server from the console. + /// `true` by default: the action is permission-gated, audited, and only + /// ever installs an official release whose published SHA-256 matches. + /// + /// Turning this off hides nothing — the console still shows the update + /// banner and the manual command, it just refuses to run it for you. + #[schema(example = true)] + pub enabled: bool, + + /// Release channel this install tracks: `stable`, `beta` or `nightly`. + /// + /// `None` (the default) means "infer from the running version tag", which + /// is what the CLI has always done — a `-nightly.` build tracks nightly, a + /// `-beta.N` build tracks beta, a plain tag tracks stable. Setting it + /// explicitly pins the channel, so an operator can move a nightly box back + /// onto stable without reinstalling. + #[schema(example = "stable")] + pub channel: Option, +} + +impl Default for SelfUpdateSettings { + fn default() -> Self { + Self { + enabled: true, + channel: None, + } + } +} + impl Default for ContainerLogSettings { fn default() -> Self { Self { diff --git a/crates/temps-core/src/lib.rs b/crates/temps-core/src/lib.rs index 56c0639f7..7a6c4608b 100644 --- a/crates/temps-core/src/lib.rs +++ b/crates/temps-core/src/lib.rs @@ -25,6 +25,7 @@ pub mod public_hostname_resolver; pub mod retention; pub mod retry; pub mod secrets_manager; +pub mod self_update; pub mod sensitive_action; pub mod telemetry; pub mod time_window; @@ -32,6 +33,11 @@ pub mod tls; pub mod traces; pub mod update_status; pub use problemdetails::ProblemDetails; +pub use self_update::{ + ReleaseCheckResult, SelfUpdateAttempt, SelfUpdateBlocker, SelfUpdateCapability, + SelfUpdateError, SelfUpdatePhase, SelfUpdatePolicy, SelfUpdateRestartMode, SelfUpdateStatus, + SelfUpdater, StartedSelfUpdate, SupervisorKind, SELF_UPDATE_JOURNAL_FILE, +}; pub use update_status::{AvailableUpdate, UpdateStatusSlot, UPGRADE_DOCS_URL}; mod app_settings; mod constants; @@ -97,7 +103,7 @@ pub use app_settings::{ DockerRegistrySettings, LetsEncryptSettings, MetricsStoreKind, MonitoringSettings, MultiNodeSettings, ObservabilityCompressionSettings, ObservabilityRetentionSettings, PreviewGatewaySettings, ProviderConfig, RateLimitSettings, ScreenshotSettings, - SecurityHeadersSettings, + SecurityHeadersSettings, SelfUpdateSettings, }; pub use async_trait; pub use chrono; diff --git a/crates/temps-core/src/self_update.rs b/crates/temps-core/src/self_update.rs new file mode 100644 index 000000000..bc8d590e5 --- /dev/null +++ b/crates/temps-core/src/self_update.rs @@ -0,0 +1,439 @@ +//! Contract for applying a release update to the running binary from the API. +//! +//! Lives in temps-core because the two crates involved must not depend on each +//! other: the implementation belongs to temps-cli (it owns the binary path, the +//! release downloader and the process lifecycle), while the HTTP surface +//! belongs to temps-config (`POST /settings/update`). The console registers the +//! implementation as a service; ConfigPlugin picks it up if present. +//! +//! **Why a capability instead of "just do it":** replacing the binary is only +//! half the job — the process then has to come back on the new one. That is +//! only true when something supervises it (systemd `Restart=always`, launchd +//! `KeepAlive`). Inside a container the binary lives in the image, so a swap is +//! discarded on the next container recreate and a restart returns to the OLD +//! version; run from a shell, exiting is simply permanent downtime. So the +//! capability is reported honestly up front, with the reason and the manual +//! command to run instead, rather than discovering it after the process is gone. + +use crate::AvailableUpdate; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use utoipa::ToSchema; + +/// File under the data dir recording the in-flight/last update attempt. Read +/// back on the next boot to report the outcome of an update that, by +/// definition, killed the process that started it. +pub const SELF_UPDATE_JOURNAL_FILE: &str = "self-update.json"; + +/// What (if anything) will restart the process after it exits. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum SupervisorKind { + /// Started by systemd (detected via `INVOCATION_ID`). The unit installed by + /// `deploy.sh` carries `Restart=always`, so exiting restarts on the new binary. + Systemd, + /// Started by launchd (detected via `XPC_SERVICE_NAME`), the macOS install path. + Launchd, + /// Running inside a container. The binary comes from the image, so a + /// self-update cannot survive a container recreate — never updatable. + Container, + /// No supervisor found: a foreground/manual `temps serve`. Exiting is downtime. + None, +} + +impl SupervisorKind { + /// How the new binary gets picked up under this supervisor. + /// + /// Only systemd and launchd are known to relaunch the process, so only they + /// get an automatic restart. Everything else installs and stays put: the + /// operator restarts on their own schedule, which is strictly better than + /// either refusing to install or exiting into an outage. + pub fn restart_mode(self) -> SelfUpdateRestartMode { + match self { + Self::Systemd | Self::Launchd => SelfUpdateRestartMode::Automatic, + Self::Container | Self::None => SelfUpdateRestartMode::Manual, + } + } + + pub fn as_str(self) -> &'static str { + match self { + Self::Systemd => "systemd", + Self::Launchd => "launchd", + Self::Container => "container", + Self::None => "none", + } + } +} + +/// Why a one-click update is unavailable. Exactly one is reported — the most +/// fundamental blocker wins, so the operator fixes the real problem first +/// rather than clearing one only to hit the next. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum SelfUpdateBlocker { + /// The operator started the server with `--disable-self-update`. Deliberate + /// and NOT overridable from the API — see the module docs on the two levels. + DisabledByFlag, + /// Turned off in Settings (`self_update.enabled = false`). An admin can turn + /// it back on in the UI. + DisabledBySetting, + /// This process does not manage the temps binary at all (e.g. the settings + /// API running inside the standalone proxy), so there is nothing to replace. + NotSupported, + /// The binary (or its directory) is not writable by the server user. + BinaryNotWritable, + /// No release assets are published for this OS/arch. + UnsupportedPlatform, + /// Another update attempt is already running. + InProgress, +} + +/// What happens to the running process once the new binary is in place. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum SelfUpdateRestartMode { + /// A supervisor will relaunch temps, so the update finishes by exiting. + /// Costs a few seconds of downtime and completes without further action. + Automatic, + /// Nothing would relaunch temps, so it installs the binary and keeps + /// running the OLD version until the operator restarts it themselves. + /// No downtime, but the update is not live until they do. + Manual, +} + +impl SelfUpdateRestartMode { + pub fn as_str(self) -> &'static str { + match self { + Self::Automatic => "automatic", + Self::Manual => "manual", + } + } +} + +/// Where an in-flight update has got to. Polled by the console so a long +/// download shows progress instead of an indefinite spinner. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, Default)] +#[serde(rename_all = "snake_case")] +pub enum SelfUpdatePhase { + /// Nothing running. + #[default] + Idle, + /// Resolving the target release from the release API. + Resolving, + /// Downloading the release tarball. + Downloading, + /// Checking the published SHA-256 and running `--version` on the new binary. + Verifying, + /// Swapping the binary on disk (previous one kept as a `.bak` sibling). + Installing, + /// Binary swapped; the process is shutting down so the supervisor restarts it. + Restarting, + /// Binary swapped, but nothing will restart temps automatically — it is + /// still serving the old version until the operator restarts it. + PendingRestart, + /// The attempt failed. The running binary was left untouched. + Failed, +} + +impl SelfUpdatePhase { + /// Is an attempt currently occupying the updater? + pub fn is_active(self) -> bool { + matches!( + self, + Self::Resolving | Self::Downloading | Self::Verifying | Self::Installing + ) + } + + pub fn as_str(self) -> &'static str { + match self { + Self::Idle => "idle", + Self::Resolving => "resolving", + Self::Downloading => "downloading", + Self::Verifying => "verifying", + Self::Installing => "installing", + Self::Restarting => "restarting", + Self::PendingRestart => "pending_restart", + Self::Failed => "failed", + } + } +} + +/// Outcome of an update attempt, as persisted in the journal. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum SelfUpdateStatus { + /// Binary swapped, process exiting — written just before shutdown and + /// resolved on the next boot by comparing the running version to the target. + Pending, + /// The process came back on the target version. + Succeeded, + /// The new binary is on disk, but temps is still running the old one + /// because nothing restarts it automatically. Resolves to `Succeeded` on + /// the next boot; stays here (never fails) until the operator restarts. + InstalledPendingRestart, + /// The attempt failed before the swap, or the process came back on the old + /// version despite a completed swap. + Failed, +} + +/// A single update attempt. Persisted to `/self-update.json` so the +/// result survives the restart it causes. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +pub struct SelfUpdateAttempt { + /// Version the attempt started from. + pub from_version: String, + /// Version the attempt targeted. `None` if it failed before resolving one. + pub to_version: Option, + pub status: SelfUpdateStatus, + #[schema(value_type = String, format = DateTime, example = "2026-08-06T09:12:31Z")] + pub started_at: DateTime, + /// When the outcome was decided. `None` while still `Pending`. + #[schema(value_type = Option, format = DateTime)] + pub finished_at: Option>, + /// User who clicked the button. `None` for attempts started by the CLI. + pub triggered_by_user_id: Option, + /// Operator-facing failure reason. Always set when `status` is `Failed`. + pub error: Option, + /// Where the replaced binary was kept, so a bad release can be reverted by + /// hand (`mv `). Set once the swap completes. + pub previous_binary_path: Option, +} + +/// Everything the console needs to render the update control honestly: whether +/// it can run, why not, what to do instead, and how the last attempt went. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +pub struct SelfUpdateCapability { + /// True only when a click would actually download, swap and come back up. + pub can_apply: bool, + /// Set iff `can_apply` is false. + pub blocker: Option, + /// Operator-facing explanation of `blocker`, naming the specific thing that + /// is wrong (path, supervisor, flag) rather than a generic refusal. + pub reason: Option, + /// Command to run by hand instead. Always present — the manual path works + /// even when the API path is blocked, so the operator is never stuck. + pub manual_command: String, + /// Version tag of the running binary, e.g. `v0.1.0-beta.55`. Always + /// present — the version page needs it whether or not an update exists. + pub current_version: String, + /// Channel this install actually tracks, after applying the configured + /// override or falling back to inference from `current_version`. + pub channel: String, + /// Whether `channel` came from settings (`true`) or was inferred from the + /// running version tag (`false`). The UI shows inference as the default + /// rather than as an explicit choice the operator made. + pub channel_is_pinned: bool, + pub supervisor: SupervisorKind, + /// Whether applying an update also restarts temps, or only installs the + /// binary and leaves the restart to the operator. + pub restart_mode: SelfUpdateRestartMode, + /// Absolute path of the binary that would be replaced. + pub binary_path: String, + /// Something true about this topology that the operator must know *before* + /// clicking, even though it does not block the update — currently the + /// split-topology case, where restarting the console leaves the separate + /// proxy process on the old binary. Shown alongside the confirmation. + pub caveat: Option, + /// Phase of the in-flight attempt (`idle` when none). + pub phase: SelfUpdatePhase, + /// Failure detail for `phase == failed`, before it is cleared by a retry. + pub phase_error: Option, + /// The most recent attempt, including one resolved on this boot. + pub last_attempt: Option, +} + +/// Accepted-update receipt returned by `start`. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +pub struct StartedSelfUpdate { + /// Version the server is running right now. + pub current_version: String, + /// How long the console should expect to wait before the server answers + /// again, so it can poll with a sensible timeout instead of guessing. + /// Meaningless when `restart_mode` is `manual` — nothing goes down. + pub estimated_restart_secs: u64, + /// Echoed from the capability so the caller knows whether to expect a + /// restart at all, without racing a second capability fetch. + pub restart_mode: SelfUpdateRestartMode, +} + +/// Outcome of an operator-triggered release check. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] +pub struct ReleaseCheckResult { + /// Channel that was queried. + pub channel: String, + /// Version tag of the running binary. + pub current_version: String, + /// Newest release published on that channel, if any could be resolved. + pub latest_version: Option, + /// Release-notes page for `latest_version`. + pub release_url: Option, + /// True when `latest_version` is strictly newer than what is running. + /// False on a channel whose newest release is older — which is normal and + /// expected right after switching a nightly box onto stable. + pub update_available: bool, +} + +/// The database-backed half of the update policy. +/// +/// Passed in by the caller rather than read here: these live in the settings +/// table, which this trait deliberately knows nothing about. Bundled into one +/// struct so adding policy later doesn't churn every call site. +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct SelfUpdatePolicy { + /// `self_update.enabled` — the console's soft off switch. + pub enabled: bool, + /// `self_update.channel` — `None` means infer from the running version. + pub channel: Option, +} + +#[derive(Debug, thiserror::Error)] +pub enum SelfUpdateError { + #[error("Self-update is unavailable on this install: {reason}")] + Unavailable { + blocker: SelfUpdateBlocker, + reason: String, + }, + #[error("An update is already running (phase: {phase})")] + AlreadyRunning { phase: &'static str }, + /// The pinned version is not a release tag this install will accept. + /// Rejected before any work starts so the caller gets a straight answer + /// instead of a background failure they have to go looking for. + #[error("{reason}")] + InvalidVersion { reason: String }, +} + +impl SelfUpdateError { + /// The blocker behind this error, for mapping to a response body. + pub fn blocker(&self) -> Option { + match self { + Self::Unavailable { blocker, .. } => Some(*blocker), + Self::AlreadyRunning { .. } => Some(SelfUpdateBlocker::InProgress), + // Not a state of the install — a bad argument. + Self::InvalidVersion { .. } => None, + } + } +} + +/// Applies a published release to the running install. +/// +/// Registered as a service by `temps serve` and consumed by the settings API. +/// Absent in hosts that cannot restart themselves meaningfully (e.g. the +/// standalone proxy), in which case the endpoint reports "not supported here". +#[async_trait::async_trait] +pub trait SelfUpdater: Send + Sync { + /// Report whether an update can be applied right now, plus the version and + /// channel information the console's version page renders. + fn capability(&self, policy: &SelfUpdatePolicy) -> SelfUpdateCapability; + + /// Begin an update. Returns as soon as the attempt is accepted — the + /// download and swap continue in the background, observable through + /// `capability().phase`. Under `Automatic` restart mode the process then + /// exits and the outcome is read from the journal on the next boot; under + /// `Manual` it finishes at `PendingRestart` with temps still serving the + /// old binary. + /// + /// `target_version` pins a specific tag; `None` takes the newest release on + /// this install's channel. + fn start( + &self, + target_version: Option, + triggered_by_user_id: Option, + policy: &SelfUpdatePolicy, + ) -> Result; + + /// Query the release API right now instead of waiting for the background + /// notifier's next pass, and republish the shared update slot from the + /// result (including clearing it when nothing newer exists). + /// + /// `channel` is the configured override; `None` infers from the running + /// version. Errors are returned as operator-facing strings — a failed + /// check is a network problem to show, not a domain error to model. + async fn check_now(&self, channel: Option) -> Result; + + /// The update the last successful check found, if it is still current. + fn available_update(&self) -> Option; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_only_real_supervisors_restart_automatically() { + assert_eq!( + SupervisorKind::Systemd.restart_mode(), + SelfUpdateRestartMode::Automatic + ); + assert_eq!( + SupervisorKind::Launchd.restart_mode(), + SelfUpdateRestartMode::Automatic + ); + // Neither of these is known to relaunch temps, so the update must + // install and stop rather than exit into an outage. + assert_eq!( + SupervisorKind::Container.restart_mode(), + SelfUpdateRestartMode::Manual + ); + assert_eq!( + SupervisorKind::None.restart_mode(), + SelfUpdateRestartMode::Manual + ); + } + + #[test] + fn test_only_pre_restart_phases_are_active() { + for phase in [ + SelfUpdatePhase::Resolving, + SelfUpdatePhase::Downloading, + SelfUpdatePhase::Verifying, + SelfUpdatePhase::Installing, + ] { + assert!(phase.is_active(), "{phase:?} should occupy the updater"); + } + // Restarting is deliberately NOT active: the swap is done and the + // process is on its way out, so a second attempt has nothing to race. + assert!(!SelfUpdatePhase::Restarting.is_active()); + // Likewise once installed — the binary is in place and the updater is + // free; only the operator's restart is outstanding. + assert!(!SelfUpdatePhase::PendingRestart.is_active()); + assert!(!SelfUpdatePhase::Idle.is_active()); + assert!(!SelfUpdatePhase::Failed.is_active()); + } + + #[test] + fn test_already_running_maps_to_in_progress_blocker() { + let err = SelfUpdateError::AlreadyRunning { + phase: "downloading", + }; + assert_eq!(err.blocker(), Some(SelfUpdateBlocker::InProgress)); + } + + #[test] + fn test_invalid_version_is_not_an_install_blocker() { + // A bad argument says nothing about the install's capability, so it + // must not be reported as one (it maps to 400, not 409). + let err = SelfUpdateError::InvalidVersion { + reason: "bad tag".to_string(), + }; + assert_eq!(err.blocker(), None); + } + + #[test] + fn test_attempt_roundtrips_through_json() { + // The journal is written by one process and read by its successor, so + // the on-disk shape must survive a serialize/deserialize round trip. + let attempt = SelfUpdateAttempt { + from_version: "v0.1.0".to_string(), + to_version: Some("v0.2.0".to_string()), + status: SelfUpdateStatus::Pending, + started_at: Utc::now(), + finished_at: None, + triggered_by_user_id: Some(7), + error: None, + previous_binary_path: Some("/usr/local/bin/temps.bak".to_string()), + }; + let json = serde_json::to_string(&attempt).expect("serialize"); + let parsed: SelfUpdateAttempt = serde_json::from_str(&json).expect("deserialize"); + assert_eq!(parsed, attempt); + } +} diff --git a/crates/temps-core/src/update_status.rs b/crates/temps-core/src/update_status.rs index f82685f7d..ef3b6b746 100644 --- a/crates/temps-core/src/update_status.rs +++ b/crates/temps-core/src/update_status.rs @@ -55,6 +55,20 @@ impl UpdateStatusSlot { *guard = Some(update); } + /// Drop any recorded notice. + /// + /// Used when a check finds nothing newer — otherwise switching from a + /// nightly install onto the stable channel would leave the old nightly + /// notice on screen forever, since stable is *older* and can never + /// overwrite it. + pub fn clear(&self) { + let mut guard = match self.inner.write() { + Ok(guard) => guard, + Err(poisoned) => poisoned.into_inner(), + }; + *guard = None; + } + /// The most recent notice, if any check has found a newer release. pub fn get(&self) -> Option { let guard = match self.inner.read() { @@ -92,6 +106,14 @@ mod tests { assert_eq!(slot.get(), Some(update)); } + #[test] + fn test_slot_clear_removes_a_stale_notice() { + let slot = UpdateStatusSlot::new(); + slot.set(notice("v0.2.0")); + slot.clear(); + assert_eq!(slot.get(), None); + } + #[test] fn test_slot_later_set_overwrites() { let slot = UpdateStatusSlot::new(); diff --git a/web/src/App.tsx b/web/src/App.tsx index 3f6847246..4ed90f329 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -267,6 +267,11 @@ const DockerRegistryPage = lazy(() => default: m.DockerRegistryPage, })) ) +const VersionPage = lazy(() => + import('./pages/settings/VersionPage').then((m) => ({ + default: m.VersionPage, + })) +) const SecurityPage = lazy(() => import('./pages/settings/SecurityPage').then((m) => ({ default: m.SecurityPage, @@ -591,6 +596,7 @@ const FullAppRoutes = () => { element={} /> {/* Security */} + } /> } /> = [ Pick & { @@ -14738,6 +14738,46 @@ export const downloadGlobalSkillArchiveOptions = (options: Options) => createQueryKey('getUpdateCapability', options); + +/** + * Report whether a release update can be applied from the console. + */ +export const getUpdateCapabilityOptions = (options?: Options) => queryOptions>({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getUpdateCapability({ + ...options, + ...queryKey[0], + signal, + throwOnError: true + }); + return data; + }, + queryKey: getUpdateCapabilityQueryKey(options) +}); + +/** + * Install a release and restart the server. + * + * Returns as soon as the attempt is accepted: the download and swap run in the + * background and the process then exits so its supervisor restarts it on the + * new binary. Poll `GET /settings/update` for progress — after the restart, + * `last_attempt` carries the outcome. + */ +export const startUpdateMutation = (options?: Partial>): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { + mutationFn: async (fnOptions) => { + const { data } = await startUpdate({ + ...options, + ...fnOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + export const getUpdateStatusQueryKey = (options?: Options) => createQueryKey('getUpdateStatus', options); /** @@ -14756,6 +14796,24 @@ export const getUpdateStatusOptions = (options?: Options) = queryKey: getUpdateStatusQueryKey(options) }); +/** + * Ask the release API for the newest version on this install's channel, now, + * instead of waiting for the background notifier's next pass. + */ +export const checkForUpdateMutation = (options?: Partial>): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { + mutationFn: async (fnOptions) => { + const { data } = await checkForUpdate({ + ...options, + ...fnOptions, + throwOnError: true + }); + return data; + } + }; + return mutationOptions; +}; + export const listTeamsQueryKey = (options?: Options) => createQueryKey('listTeams', options); export const listTeamsOptions = (options?: Options) => queryOptions>({ @@ -15758,24 +15816,6 @@ export const stopSandboxMutation = (options?: Partial>) return mutationOptions; }; -export const terminalQueryKey = (options: Options) => createQueryKey('terminal', options); - -/** - * Attach an interactive terminal to a sandbox. - */ -export const terminalOptions = (options: Options) => queryOptions>({ - queryFn: async ({ queryKey, signal }) => { - const { data } = await terminal({ - ...options, - ...queryKey[0], - signal, - throwOnError: true - }); - return data; - }, - queryKey: terminalQueryKey(options) -}); - /** * Kill a running command (`@vercel/sandbox`-compatible). The SDK * calls `POST /v1/sandboxes/{id}/{cmdId}/kill` — note the path has the diff --git a/web/src/api/client/index.ts b/web/src/api/client/index.ts index 85b707af4..428229461 100644 --- a/web/src/api/client/index.ts +++ b/web/src/api/client/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, changeRequiredPassword, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiDataAccess, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQueryContainerInfo, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, querySpanStats, queryTraces, queryTraceSummaries, readEntityRows, readFile, reAnalyze, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, setAiDataAccess, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, terminal, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; -export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiDataAccessResponse, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponse, ChangeRequiredPasswordResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponse, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponse, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesErrors, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsError, QuerySpanStatsErrors, QuerySpanStatsResponse, QuerySpanStatsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponse, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReadRowsQuery, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, RequiredPasswordChangeRequest, RequiredPasswordChangeResponse, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageRequest, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponse, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStats, SpanStatsResponse, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TerminalData, TerminalErrors, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleAiDataAccessRequest, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; +export { acknowledgeAlarm, activateAiProvider, activateApiKey, activateConnection, activateProvider, addClusterMember, addContext, addEnvironmentDomain, addEvents, addManagedDomain, addSessionReplayEvents, addTeamMember, adminDrainNode, adminDrainStatus, adminGetNode, adminListNodeContainers, adminListNodes, adminRemoveNode, adminUndrainNode, applyHostnameMode, archiveConversation, archiveFlag, assignRole, attachScheduleServices, blobCopy, blobDelete, blobDisable, blobDownload, blobEnable, blobHead, blobList, blobPut, blobStatus, blobUpdate, cancel, cancelBackup, cancelDeployment, cancelDomainOrder, cancelPgUpgrade, cancelRun, cancelScheduleRun, changePasswordSelf, changeProjectSource, changeRequiredPassword, chatCompletions, checkAnalyticsHasEvents, checkCommitExists, checkDomainStatus, checkExplorerSupport, checkForUpdate, checkIpBlocked, checkProviderDeletionSafety, chunkUploadOptions, cleanupExpiredBackups, clearPreviewPassword, cliDeviceApprove, cliDeviceDeny, cliDeviceLookup, cliDevicePoll, cliDeviceStart, cliLogout, cmd, cmdKill, cmdLogs, confirmPendingAction, containerMetricsGetHistory, createAgent, createAlert, createAlertRule, createApiKey, createBackupSchedule, createBitbucketProvider, createCloudflareProvider, createConversation, createCustomDomain, createDashboard, createDeploymentToken, createDnsProvider, createDomain, createDsn, createEmailDomain, createEmailProvider, createEnvironment, createEnvironmentVariable, createFlag, createFunnel, createGenericProvider, createGiteaPatProvider, createGithubPatProvider, createGitlabOauthProvider, createGitlabPatProvider, createGitProvider, createGlobalMcp, createGlobalSkill, createIncident, createIpAccessControl, createMcp, createMonitor, createNotificationEmailProvider, createNotificationProvider, createOidcProvider, createOidcRoleMapping, createOrRecreateOrder, createPlan, createPr, createProject, createProjectFromTemplate, createProjectRelease, createProjectSecret, createProviderKey, createRelease, createRoute, createS3Source, createSandbox, createService, createSkill, createSlackProvider, createTeam, createUser, createWebhook, createWebhookProvider, deactivateApiKey, deactivateConnection, deactivateProvider, deleteAgent, deleteAlert, deleteAlertRule, deleteApiKey, deleteBackup, deleteBackupSchedule, deleteConnection, deleteCustomDomain, deleteDashboard, deleteDeploymentToken, deleteDnsProvider, deleteDomain, deleteEmailDomain, deleteEmailProvider, deleteEnvironment, deleteEnvironmentDomain, deleteEnvironmentVariable, deleteExternalImage, deleteFunnel, deleteGitProvider, deleteGlobalMcp, deleteGlobalSkill, deleteIpAccessControl, deleteMcp, deleteMonitor, deleteNotificationProvider, deleteOidcProvider, deleteOidcRoleMapping, deletePreferences, deleteProject, deleteProjectSecret, deleteProviderKey, deleteProviderSafely, deleteReleaseSourceFiles, deleteReleaseSourceMaps, deleteRoute, deleteS3Source, deleteScan, deleteSecret, deleteService, deleteSessionReplay, deleteSkill, deleteSourceMap, deleteStaticBundle, deleteTeam, deleteUser, deleteWebhook, deployFromImage, deployFromImageUpload, deployFromStatic, deployFromUploadedSource, deploymentMetricsGetLatest, deploymentMetricsGetRange, deploymentMetricsToggle, destroySandbox, detachScheduleService, detectPublicPresets, disableBackupSchedule, disableMfa, discoverWorkloads, domain, downloadGlobalSkillArchive, downloadObject, downloadSkillArchive, emailStatus, embeddings, enableBackupSchedule, enrichVisitor, exec, execDetached, executeDeploymentOperation, executeImport, extendTimeout, externalServiceEnablePgStatStatements, externalServiceMetricsByDatabase, externalServiceMetricsCreateAlertRule, externalServiceMetricsDeleteAlertRule, externalServiceMetricsGetAlertRules, externalServiceMetricsGetLatest, externalServiceMetricsGetRange, externalServiceMetricsStatus, externalServiceMetricsToggle, externalServiceMetricsUpdateAlertRule, externalServiceResetPgStatStatements, finalizeOrder, finalizeProjectRelease, findConversation, generateJoinToken, generatePresetDockerfile, getAccessInfo, getActiveVisitors, getActivityGraph, getAdminGate, getAgent, getAggregatedBuckets, getAiAgentBreakdown, getAiAgentPages, getAiAgentTimeline, getAiDataAccess, getAiPageBreakdown, getAiStatusBreakdown, getAlert, getAlertRule, getAllRepositoriesByName, getAnalyticsActiveVisitors, getAnalyticsEventsCount, getAnalyticsSessionEvents, getAnalyticsVisitorSessions, getApiKey, getApiKeyPermissions, getAuditLog, getBackup, getBackupSchedule, getBranchesByRepositoryId, getBucketedIncidents, getBucketedStatus, getChallengeToken, getChatReadiness, getCliStatus, getClusterHealth, getClusterMember, getCmd, getContainerDetail, getContainerEnvironmentVariable, getContainerLogs, getContainerLogsById, getContainerMetrics, getConversation, getConversationDetail, getConversations, getCronById, getCronExecutions, getCrossProjectTraceSiblings, getCurrentMonitorStatus, getCurrentUser, getCustomDomain, getDashboard, getDashboardProjectsAnalytics, getDelivery, getDeployment, getDeploymentContainerLogContent, getDeploymentJobLogs, getDeploymentJobs, getDeploymentOperations, getDeploymentOperationStatus, getDeploymentToken, getDiskStatus, getDnsChanges, getDnsProvider, getDomain, getDomainByHost, getDomainById, getDomainByName, getDomainDnsRecords, getDomainOrder, getEmail, getEmailEvents, getEmailLinks, getEmailProvider, getEmailStats, getEmailTracking, getEmailTrackingStatus, getEntityInfo, getEnvironment, getEnvironmentCrons, getEnvironmentDomains, getEnvironments, getEnvironmentVariables, getEnvironmentVariableValue, getErrorDashboardStats, getErrorEvent, getErrorGroup, getErrorStats, getErrorTimeSeries, getEventDetail, getEventEntries, getEventsCount, getEventsTimeline, getEventTypeBreakdown, getEventVisitors, getExternalImage, getFile, getFlag, getFlagSnapshot, getFunnelMetrics, getGenaiTrace, getGeneralStats, getGitProvider, getGlobalEvents, getGlobalEventStats, getGlobalMcp, getGlobalSandboxStatus, getGlobalSkill, getGroupedPageMetrics, getHealth, getHourlyVisits, getHttpChallengeDebug, getImportStatus, getIncident, getIncidentUpdates, getIpAccessControl, getIpGeolocation, getJoinTokenStatus, getLastDeployment, getLatestScan, getLatestScansPerEnvironment, getLiveVisitorsList, getLogContext, getMcp, getMetricsOverTime, getMonitor, getNotificationProvider, getOnDemandCertStatus, getOrCreateDsn, getPageFlow, getPageHourlySessions, getPagePathDetail, getPagePaths, getPagePathsSparklines, getPagePathVisitors, getPendingAction, getPerformanceMetrics, getPgUpgrade, getPgUpgradeLogs, getPipelineStats, getPlatformInfo, getPostgresWalHealth, getPreferences, getPreviewGatewayLogs, getPreviewGatewaySettings, getPreviewGatewayStatus, getPricing, getPrivateIp, getProject, getProjectAlarmsSummary, getProjectBySlug, getProjectDeployments, getProjects, getProjectServiceEnvironmentVariables, getProjectSessionReplays, getProjectsHealth, getProjectsMonitorHealth, getProjectStatistics, getProjectTemplate, getPropertyBreakdown, getPropertyTimeline, getProviderConnections, getProviderMetadata, getProvidersMetadata, getProxyLogById, getProxyLogByRequestId, getProxyLogs, getPublicBranches, getPublicIp, getPublicRepository, getQueryContainerInfo, getQuota, getRecentActivity, getRemoteExternalImage, getRepositoryBranches, getRepositoryById, getRepositoryByName, getRepositoryPresetByName, getRepositoryPresetLive, getRepositoryTags, getResolvedEnvironmentVariables, getResolvedEnvironmentVariableValue, getRestoreCapabilities, getRestoreRun, getRoute, getRun, getRunWithLogs, getS3Credentials, getS3Source, getSandbox, getSandboxStatus, getScan, getScanByDeployment, getScanVulnerabilities, getService, getServiceBySlug, getServiceEnvironmentVariable, getServiceEnvironmentVariables, getServiceHealthStatus, getServicePreviewEnvironmentVariableNames, getServicePreviewEnvironmentVariablesMasked, getServiceRuntime, getServiceStats, getServiceTypeParameters, getServiceTypes, getSessionDetails, getSessionEvents, getSessionLogs, getSessionReplay, getSessionReplayEvents, getSettings, getSkill, getSlowQueries, getStaticBundle, getStatusOverview, getTagsByRepositoryId, getTeam, getTimeBucketStats, getTodayStats, getTrace, getUnifiedTrace, getUniqueCounts, getUniqueEvents, getUpdateCapability, getUpdateStatus, getUptimeHistory, getUsageByProvider, getUsageRecent, getUsageSummary, getUsageTimeseries, getUsageTopModels, getVisitorByGuid, getVisitorById, getVisitorDetails, getVisitorFacets, getVisitorInfo, getVisitorJourney, getVisitors, getVisitorSessions, getVisitorStats, getWebhook, grantProjectAccess, handleGitProviderOauthCallback, hasAnalyticsEvents, hasErrorGroups, hasPerformanceMetrics, importExternalService, ingestLogs, ingestLogsByPath, ingestMetrics, ingestMetricsByPath, ingestSentryEnvelope, ingestSentryEvent, ingestTraces, ingestTracesByPath, initSessionReplay, inspectDropArchive, jobLogs, jobStatus, killJob, kvDel, kvDisable, kvEnable, kvExpire, kvGet, kvIncr, kvKeys, kvSet, kvStatus, kvTtl, kvUpdate, latestRunForSource, linkCustomDomainToCertificate, linkServiceToProject, listAgentRuns, listAgents, listAiProviders, listAlertRules, listAlerts, listAllConversations, listAllRuns, listApiKeys, listAuditLogs, listAvailableContainers, listBackupAlerts, listBackupChildren, listBackupSchedules, listBackupsForSchedule, listCommitsByRepositoryId, listConnections, listContainers, listContainersAtPath, listConversations, listCustomDomainsForProject, listDashboards, listDeliveries, listDeploymentContainerLogs, listDeploymentTokens, listDnsProviders, listDomains, listDsns, listEmailDomains, listEmailProviders, listEmails, listEnrollmentTokens, listEntities, listErrorEvents, listErrorGroups, listEvents, listEventTypes, listExternalImages, listExternalPlugins, listExternalServiceBackups, listFlags, listFunnels, listGitProviders, listGlobalMcps, listGlobalSkills, listIncidents, listInsights, listIpAccessControl, listJobs, listKnownAiAgents, listManagedDomains, listMcps, listMetricLabelKeys, listMetricLabelValues, listMetricNames, listModels, listMonitors, listNotificationProviders, listOidcProviders, listOidcProviderUsers, listOidcRoleMappings, listOnDemandCerts, listOrders, listPeers, listPendingActions, listPgUpgrades, listPresets, listProjectAccess, listProjectAlarms, listProjectScans, listProjectSecrets, listProjectServices, listProjectTemplates, listProjectTemplateTags, listProviderKeys, listProviderZones, listPublicProviders, listReleaseFiles, listReleases, listRemoteExternalImages, listRepositoriesByConnection, listRepositoriesByProvider, listRestoreRunsForService, listRootContainers, listRoutes, listS3Sources, listSandboxes, listScheduleRunJobs, listScheduleRuns, listScheduleServices, listSecrets, listServiceHealthStatuses, listServiceProjects, listServices, listServiceSchedules, listSkills, listSourceBackups, listSourceFiles, listSourceMaps, listSources, listStaticBundles, listSyncedRepositories, listTeamMembers, listTeamProjects, listTeams, listUsers, listWebhooks, login, logout, lookupDnsARecords, mintEnrollmentToken, mkdir, nodeHeartbeat, nodeMetricsGetRange, observabilityFullEvent, observabilityListEvents, oidcCallback, type Options, patchAdminGate, patchPreviewGatewaySettings, pauseDeployment, pauseSandbox, planRestore, postDnsAck, previewAlert, previewFunnelMetrics, previewHostnameMode, promoteClusterMember, promoteDeployment, provisionDomain, purgeProjectLogs, pushExternalImage, queryData, queryGenaiTraces, queryLogs, queryMetrics, querySpanStats, queryTraces, queryTraceSummaries, readEntityRows, readFile, reAnalyze, recordConsoleEvent, recordEventMetrics, recordFlagExposure, recordSpeedMetrics, refreshRouteTable, regenerateDsn, registerExternalImage, registerNode, reinstallGitlabWebhook, rejectPendingAction, reloadPlugins, removeClusterMember, removeManagedDomain, removeRole, removeTeamMember, renameConversation, renewDomain, requestPasswordReset, resetPassword, resizeSandbox, resolveAlarm, restartContainer, restartPreviewGateway, restartSandbox, restoreFlag, restoreUser, resumeDeployment, resumeSandbox, retryCluster, retryDelivery, retryPgUpgrade, retryRun, revealGlobalMcpConfig, revealMcpConfig, revealNotificationProviderConfig, revealServiceParameter, revenueCreateIntegration, revenueDeleteIntegration, revenueGlobalEvents, revenueImportInvoicesCsv, revenueImportSubscriptionsCsv, revenueListIntegrations, revenueListProviders, revenueMetricsCustomers, revenueMetricsGlobalMrr, revenueMetricsGlobalSummary, revenueMetricsMrr, revenueMetricsSummary, revenueRecentEvents, revenueRotateToken, revenueUpdateConfig, revenueUpdateSecret, revokeDsn, revokeEnrollmentToken, revokeJoinToken, revokeProjectAccess, rollbackPgUpgrade, rollbackToDeployment, rootfsGc, rootfsReport, rotateApiKey, rotateDeploymentToken, runBackupForSource, runConnectionHealthCheck, runExternalServiceBackup, runScheduleNow, sandboxCreatePreviewLink, saveAgentToken, saveAiProviderCredential, searchLogs, sendEmail, setAiDataAccess, setDefaultS3Source, setFlagEnvironment, setPreviewPassword, setupDns, setupDnsChallenge, setupEmailTracking, setupMfa, sleepEnvironment, smokeTestAgent, sourceSandbox, startAnalysis, startContainer, startFix, startGitProviderOauth, startOidcLoginBySlug, startPgUpgrade, startRestore, startService, startUpdate, statPath, stopContainer, stopSandbox, stopService, streamContainerMetrics, streamEvents, streamRunEvents, syncRepositories, tailDeploymentJobLogs, tailLogs, teardownDeployment, teardownEnvironment, testNotificationProvider, testOidcProvider, testProvider, testProviderConnection, testProviderKeyById, testProviderKeyInline, testS3ConnectionPreview, testS3SourceConnection, trackClick, trackOpen, triggerAgent, triggerProjectPipeline, triggerScan, triggerServiceHealthCheck, triggerWeeklyDigest, unlinkServiceFromProject, updateAgent, updateAiProvider, updateAlert, updateAlertRule, updateApiKey, updateAutomaticDeploy, updateBackupSchedule, updateCloudflareProvider, updateConnectionToken, updateCustomDomain, updateDashboard, updateDeploymentToken, updateEmailProvider, updateEnvironmentSettings, updateEnvironmentSubdomain, updateEnvironmentVariable, updateErrorGroup, updateFlag, updateFunnel, updateGitProviderCredentials, updateGitSettings, updateGlobalMcp, updateGlobalSkill, updateIncidentStatus, updateIpAccessControl, updateManagedDomain, updateMcp, updateNotificationEmailProvider, updateNotificationProvider, updateOidcProvider, updatePreferences, updateProject, updateProjectDeploymentConfig, updateProjectSecret, updateProjectSettings, updateProvider, updateProviderKey, updateRoute, updateS3Source, updateSelf, updateService, updateServiceResources, updateSessionDuration, updateSettings, updateSkill, updateSlackProvider, updateSpeedMetrics, updateTeam, updateTeamMemberRole, updateUser, updateWebhook, updateWebhookProvider, upgradePreviewGateway, upgradeService, uploadGlobalSkill, uploadReleaseFile, uploadSkill, uploadSourceFile, uploadSourceMap, uploadStaticBundle, upsertSecret, validateConnection, validateEmail, verifyAndEnableMfa, verifyDomain, verifyEmail, verifyManagedDomain, verifyMfaChallenge, verifyStepUp, wakeEnvironment, webhookTrigger, workflowDryRun, writeFile, writeFiles } from './sdk.gen'; +export type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, AcmeOrderResponse, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponse, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponse, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponse, ActivateProviderResponses, ActiveVisitor, ActiveVisitorsQuery, ActiveVisitorsResponse, ActivityDay, ActivityEvent, ActivityGraphQuery, ActivityGraphResponse, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberRequest, AddClusterMemberResponse, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextRequest, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainRequest, AddEnvironmentDomainResponse, AddEnvironmentDomainResponses, AddEventsData, AddEventsError, AddEventsErrors, AddEventsRequest, AddEventsResponse, AddEventsResponse2, AddEventsResponses, AddManagedDomainApiRequest, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponse, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsError, AddSessionReplayEventsErrors, AddSessionReplayEventsResponse, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponse, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponse, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponse, AdminDrainStatusResponses, AdminGateResponse, AdminGateSource, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponse, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponse, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponse, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponse, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponse, AdminUndrainNodeResponses, AgentConfigResponse, AgentRunLogResponse, AgentRunResponse, AgentRunWithLogsResponse, AgentSandboxSettings, AgentSandboxSettingsMasked, AggregatedBucketItem, AggregatedBucketsQuery, AggregatedBucketsResponse, AggregationLevel, AggregationTemporality, AiAgentBreakdownResponse, AiAgentBreakdownRow, AiAgentDescriptor, AiAgentPageRow, AiAgentPagesResponse, AiAgentTimelineResponse, AiAgentTimelineRow, AiChatLimitsSettings, AiConfigSettings, AiDataAccessResponse, AiPageBreakdownResponse, AiPageBreakdownRow, AiStatusBreakdownResponse, AiStatusBreakdownRow, AlarmListResponse, AlarmResponse, AlarmSummaryResponse, AlertRuleResponse, AllocEntry, AnalyticsSessionEventsResponse, AnnotatedSpan, AnomalyAlgorithm, AnomalyParams, AnomalyPreviewPointResponse, AnomalyPreviewRequest, AnomalyPreviewResponse, ApiKeyListResponse, ApiKeyResponse, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeRequest, ApplyHostnameModeResponse, ApplyHostnameModeResponses, AppSettings, AppSettingsResponse, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponse, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponse, ArchiveFlagResponse2, ArchiveFlagResponses, ArchiveMode, AssignRoleData, AssignRoleErrors, AssignRoleRequest, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesError, AttachScheduleServicesErrors, AttachScheduleServicesRequest, AttachScheduleServicesResponse, AttachScheduleServicesResponse2, AttachScheduleServicesResponses, AuditLogIpInfo, AuditLogResponse, AuditLogUserInfo, AuthFlavorDto, AuthResponse, AuthStatusResponse, AuthTokenResponse, AutofixerRunResponse, AutofixerRunWithLogsResponse, AutofixRunConfig, AutoWatchParams, AvailableContainerInfo, AvailablePermissions, BackupAlertListResponse, BackupAlertResponse, BackupResponse, BackupScheduleResponse, BitbucketAuthInput, BlobCopyData, BlobCopyError, BlobCopyErrors, BlobCopyResponse, BlobCopyResponses, BlobDeleteData, BlobDeleteError, BlobDeleteErrors, BlobDeleteResponse, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponse, BlobDisableResponses, BlobDownloadData, BlobDownloadError, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponse, BlobEnableResponses, BlobHeadData, BlobHeadError, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListError, BlobListErrors, BlobListResponse, BlobListResponses, BlobPutData, BlobPutError, BlobPutErrors, BlobPutResponse, BlobPutResponses, BlobResponse, BlobStatusData, BlobStatusErrors, BlobStatusResponse, BlobStatusResponse2, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponse, BlobUpdateResponses, BranchInfo, BranchListResponse, BrowserCount, BrowsersQuery, BuildConfiguration, BuildLimitsSettings, CancelBackupData, CancelBackupError, CancelBackupErrors, CancelBackupResponse, CancelBackupResponse2, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponse, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponse, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponse, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponse, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunError, CancelScheduleRunErrors, CancelScheduleRunResponse, CancelScheduleRunResponses, CertStatusResponse, ChallengeConfig, ChallengeError, ChallengeValidationStatus, ChangePasswordRequest, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponse, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceRequest, ChangeProjectSourceResponse, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponse, ChangeRequiredPasswordResponses, ChatCompletionChoice, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionsData, ChatCompletionsError, ChatCompletionsErrors, ChatCompletionsResponse, ChatCompletionsResponses, ChatMessage, ChatReadinessResponse, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponse, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponse, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponse, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponse, CheckExplorerSupportResponses, CheckForUpdateData, CheckForUpdateError, CheckForUpdateErrors, CheckForUpdateResponse, CheckForUpdateResponses, CheckIpBlockedData, CheckIpBlockedError, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponse, CheckProviderDeletionSafetyResponses, ChildBackupEntryResponse, ChildBackupListResponse, ChunkUploadOptionsData, ChunkUploadOptionsResponse, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsError, CleanupExpiredBackupsErrors, CleanupExpiredBackupsRequest, CleanupExpiredBackupsResponse, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponse, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveRequest, CliDeviceApproveResponse, CliDeviceApproveResponse2, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponse, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponse, CliDeviceLookupResponse2, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollRequest, CliDevicePollResponse, CliDevicePollResponse2, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartRequest, CliDeviceStartResponse, CliDeviceStartResponse2, CliDeviceStartResponses, ClientOptions, CliLoginRequest, CliLogoutData, CliLogoutErrors, CliLogoutResponse, CliLogoutResponses, CloudflareConfig, CloudProvider, ClusterCapacity, ClusterDnsSettings, ClusterHealthReportResponse, ClusterMemberHealthResponse, ClusterMemberRequest, CmdBody, CmdData, CmdErrors, CmdInner, CmdKillBody, CmdKillData, CmdKillErrors, CmdKillResponse, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponse, CmdResponse2, CmdResponses, CommitExistsResponse, CommitInfo, CommitListResponse, Comparator, ComposePublicPort, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponse, ConfirmPendingActionResponses, ConnectionListQuery, ConnectionListResponse, ConnectionResponse, ConnectionTestResult, ConsoleEventPayload, ContainerActionResponse, ContainerDetailResponse, ContainerEnvironmentVariableValueResponse, ContainerInfoResponse, ContainerInventoryItem, ContainerListResponse, ContainerLogSettings, ContainerLogsQuery, ContainerMetricHistoryPoint, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponse, ContainerMetricsGetHistoryResponses, ContainerMetricsHistoryQuery, ContainerMetricsResponse, ContainerResponse, ContainerRuntimeInfo, ContainerStatsSample, ContentPart, ContextLine, ContextLogsRequest, ContextLogsResponse, ConversationDetailResponse, ConversationResponse, ConversationsQueryParams, ConversationSummary, CopyBlobRequest, CostAnalysis, CreateAgentData, CreateAgentErrors, CreateAgentResponse, CreateAgentResponses, CreateAlertData, CreateAlertError, CreateAlertErrors, CreateAlertResponse, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleRequest, CreateAlertRuleResponse, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponse2, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleError, CreateBackupScheduleErrors, CreateBackupScheduleRequest, CreateBackupScheduleResponse, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponse, CreateBitbucketProviderResponses, CreateBitbucketRequest, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderRequest, CreateCloudflareProviderResponse, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationRequest, CreateConversationResponse, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponse, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardError, CreateDashboardErrors, CreateDashboardRequest, CreateDashboardResponse, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenRequest, CreateDeploymentTokenResponse, CreateDeploymentTokenResponse2, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderRequest, CreateDnsProviderResponse, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainRequest, CreateDomainResponse, CreateDomainResponses, CreatedResource, CreateDsnData, CreateDsnErrors, CreateDsnRequest, CreateDsnResponse, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainRequest, CreateEmailDomainResponse, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderRequest, CreateEmailProviderResponse, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentRequest, CreateEnvironmentResponse, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableRequest, CreateEnvironmentVariableResponse, CreateEnvironmentVariableResponses, CreateExternalServiceRequest, CreateFlagData, CreateFlagErrors, CreateFlagRequest, CreateFlagResponse, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelRequest, CreateFunnelResponse, CreateFunnelResponse2, CreateFunnelResponses, CreateFunnelStep, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponse, CreateGenericProviderResponses, CreateGenericRequest, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponse, CreateGiteaPatProviderResponses, CreateGiteaPatRequest, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponse, CreateGithubPatProviderResponses, CreateGitHubPatRequest, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponse, CreateGitlabOauthProviderResponses, CreateGitLabOAuthRequest, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponse, CreateGitlabPatProviderResponses, CreateGitLabPatRequest, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponse, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponse, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponse, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentRequest, CreateIncidentResponse, CreateIncidentResponses, CreateIntegrationBody, CreateIpAccessControlData, CreateIpAccessControlError, CreateIpAccessControlErrors, CreateIpAccessControlRequest, CreateIpAccessControlResponse, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpRequest, CreateMcpResponse, CreateMcpResponses, CreateMetricAlertRequest, CreateMonitorData, CreateMonitorErrors, CreateMonitorRequest, CreateMonitorResponse, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderRequest, CreateNotificationEmailProviderResponse, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponse, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderRequest, CreateOidcProviderResponse, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingRequest, CreateOidcRoleMappingResponse, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponse, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanRequest, CreatePlanResponse, CreatePlanResponse2, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectAccessRequest, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateRequest, CreateProjectFromTemplateResponse, CreateProjectFromTemplateResponse2, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponse, CreateProjectReleaseResponses, CreateProjectRequest, CreateProjectResponse, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretRequest, CreateProjectSecretResponse, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyError, CreateProviderKeyErrors, CreateProviderKeyRequest, CreateProviderKeyResponse, CreateProviderKeyResponses, CreateProviderRequest, CreatePrResponse, CreatePrResponse2, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponse, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteRequest, CreateRouteResponse, CreateRouteResponses, CreateS3SourceData, CreateS3SourceError, CreateS3SourceErrors, CreateS3SourceRequest, CreateS3SourceResponse, CreateS3SourceResponses, CreateSandboxBody, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponse, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponse, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillRequest, CreateSkillResponse, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderRequest, CreateSlackProviderResponse, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamMemberRequest, CreateTeamRequest, CreateTeamResponse, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserRequest, CreateUserResponse, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderRequest, CreateWebhookProviderResponse, CreateWebhookProviderResponses, CreateWebhookRequestBody, CreateWebhookResponse, CreateWebhookResponses, CronExecutionInfo, CronInfo, CrossProjectSiblingRef, CrossProjectTraceResponse, CurrentStatusResponse, CustomDomainRequest, CustomDomainResponse, CustomerMovementResponse, DashboardLayout, DashboardProjectsAnalyticsQuery, DashboardProjectsAnalyticsResponse, DashboardSection, DashboardTile, DatabaseMetricsResponse, DatabaseMetricsRow, DataImplication, DataImplicationSeverity, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponse, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponse, DeleteAgentResponses, DeleteAlertData, DeleteAlertError, DeleteAlertErrors, DeleteAlertResponse, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponse, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupError, DeleteBackupErrors, DeleteBackupResponse, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleError, DeleteBackupScheduleErrors, DeleteBackupScheduleResponse, DeleteBackupScheduleResponses, DeleteBlobRequest, DeleteBlobResponse, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponse, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponse, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardError, DeleteDashboardErrors, DeleteDashboardResponse, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponse, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponse, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponse, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponse, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponse, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponse, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponse, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponse, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponse, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponse, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponse, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlError, DeleteIpAccessControlErrors, DeleteIpAccessControlResponse, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponse, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponse, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponse, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponse, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponse, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponse, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponse, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponse, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyError, DeleteProviderKeyErrors, DeleteProviderKeyResponse, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponse, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponse, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponse, DeleteReleaseSourceMapsResponses, DeleteResponse, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceError, DeleteS3SourceErrors, DeleteS3SourceResponse, DeleteS3SourceResponses, DeleteScanData, DeleteScanError, DeleteScanErrors, DeleteScanResponse, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponse, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponse, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayError, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponse, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponse, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponse, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponse, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponse, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponse, DeleteWebhookResponses, DelRequest, DelResponse, DeployFromImageData, DeployFromImageErrors, DeployFromImageRequest, DeployFromImageResponse, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadQuery, DeployFromImageUploadResponse, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticRequest, DeployFromStaticResponse, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponse, DeployFromUploadedSourceResponses, DeploymentConfig, DeploymentConfigSnapshot, DeploymentConfiguration, DeploymentContainerLogContentResponse, DeploymentContainerLogResponse, DeploymentContainerLogsListResponse, DeploymentEnvironmentResponse, DeploymentJobResponse, DeploymentJobsResponse, DeploymentListResponse, DeploymentMetadata, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponse, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponse, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DeploymentResponse, DeploymentStateResponse, DeploymentStrategy, DeploymentTokenListResponse, DeploymentTokenResponse, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponse, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceError, DetachScheduleServiceErrors, DetachScheduleServiceResponse, DetachScheduleServiceResponses, DetectionConfig, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponse, DetectPublicPresetsResponses, DeviceCount, DigestSections, Direction, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponse, DisableBackupScheduleResponses, DisableBlobResponse, DisableKvResponse, DisableMfaData, DisableMfaErrors, DisableMfaRequest, DisableMfaResponse, DisableMfaResponses, DiscoverRequest, DiscoverResponse, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponse, DiscoverWorkloadsResponses, DiskInfo, DiskSpaceAlert, DiskSpaceAlertSettings, DiskSpaceCheckResult, DnsAckRequest, DnsAckResponse, DnsChallengeRecordResult, DnsChangesResponse, DnsCompletionResponse, DnsLookupError, DnsLookupRequest, DnsLookupResponse, DnsProviderCredentials, DnsProviderResponse, DnsProviderSettings, DnsProviderSettingsMasked, DnsProviderType, DnsRecord, DnsRecordChange, DnsRecordContent, DnsRecordResponse, DnsRecordSetupResult, DnsRecordStatusResponse, DnsZone, DockerComposePresetConfig, DockerfilePresetConfig, DockerfileVariant, DockerRegistrySettings, DockerRegistrySettingsMasked, DomainAction, DomainChallengeResponse, DomainData, DomainEnvironmentResponse, DomainError, DomainErrors, DomainPlan, DomainResponse, DomainResponse2, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponse, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponse, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponse, DownloadSkillArchiveResponses, DrainNodeResponse, DrainStatusResponse, DropArchiveUpload, DropInspectionResponse, DropOffPoint, DropPresetCandidate, EmailConfig, EmailDomainResponse, EmailDomainWithDnsResponse, EmailProviderResponse, EmailProviderTypeRoute, EmailRequest, EmailResponse, EmailStatsResponse, EmailStatusData, EmailStatusErrors, EmailStatusResponse, EmailStatusResponse2, EmailStatusResponses, EmailTrackingResponse, EmailTrackingSetupResponse, EmailTrackingStatusResponse, EmbeddingData, EmbeddingInput, EmbeddingRequest, EmbeddingResponse, EmbeddingsData, EmbeddingsError, EmbeddingsErrors, EmbeddingsResponse, EmbeddingsResponses, EmbeddingUsage, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponse, EnableBackupScheduleResponses, EnableBlobRequest, EnableBlobResponse, EnableKvRequest, EnableKvResponse, EnablePgStatStatementsResponse, EndpointDto, EnqueuedJob, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorRequest, EnrichVisitorResponse, EnrichVisitorResponse2, EnrichVisitorResponses, EnrollmentTokenInfo, EnrollmentTokenListResponse, EntityInfoResponse, EntityResponse, EnvironmentConfiguration, EnvironmentDomainResponse, EnvironmentInfo, EnvironmentResponse, EnvironmentVariable, EnvironmentVariableInfo, EnvironmentVariableResponse, EnvironmentVariableValueResponse, EnvVarInput, EnvVarIntegrationInfo, EnvVarResponse, EnvVarTemplateResponse, ErrorDashboardStatsQuery, ErrorDashboardStatsResponse, ErrorEventResponse, ErrorGroupResponse, ErrorGroupStatsResponse, ErrorResponse, ErrorRow, ErrorTimeSeriesDataResponse, ErrorTimeSeriesQuery, EventActivityBucket, EventBreakdown, EventBrowserStats, EventCount, EventCountryStats, EventDetailQuery, EventDetailResponse, EventEntriesQuery, EventEntriesResponse, EventEntryInfo, EventKind, EventMetricsPayload, EventReferrerStats, EventsCountQuery, EventsResponse, EventTimeline, EventTimelineQuery, EventType, EventTypeBreakdown, EventTypeBreakdownQuery, EventTypeResponse, EventTypesResponse, EventVisitorInfo, EventVisitorsQuery, EventVisitorsResponse, ExecBody, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponse, ExecDetachedResponse2, ExecDetachedResponses, ExecErrors, ExecResponse, ExecResponse2, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponse, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportRequest, ExecuteImportResponse, ExecuteImportResponse2, ExecuteImportResponses, ExecuteOperationRequest, ExpireRequest, ExpireResponse, ExplorerSupportResponse, ExtendTimeoutBody, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponse, ExtendTimeoutResponses, ExternalImageResponse, ExternalServiceBackupResponse, ExternalServiceDetails, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponse, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceInfo, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponse, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponse, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponse, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponse, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponse, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponse, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponse, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponse, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponse, ExternalServiceResetPgStatStatementsResponses, ExternalServiceSummary, FieldResponse, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponse, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponse, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponse, FindConversationResponses, FiringSeriesEntry, FlagEnvironmentResponse, FlagListResponse, FlagResponse, FlagSnapshot, FlagSnapshotResponse, FlagValueType, ForecastAlgorithm, ForecastParams, FullError, FullEvent, FullRequest, FunnelMetricsResponse, FunnelResponse, GatewayStatus, GenAiEvent, GenAiSpanDetail, GenAiTraceDetailResponse, GenAiTraceSummariesResponse, GenAiTraceSummary, GeneralStatsQuery, GeneralStatsResponse, GenerateDockerfileRequest, GenerateDockerfileResponse, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponse, GenerateJoinTokenResponse2, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponse, GeneratePresetDockerfileResponses, GeoLocationResponse, GeoRestrictionsConfig, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponse, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponse, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponse, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponse, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponse, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownError, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponse, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesError, GetAiAgentPagesErrors, GetAiAgentPagesResponse, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineError, GetAiAgentTimelineErrors, GetAiAgentTimelineResponse, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponse, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownError, GetAiPageBreakdownErrors, GetAiPageBreakdownResponse, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownError, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponse, GetAiStatusBreakdownResponses, GetAlertData, GetAlertError, GetAlertErrors, GetAlertResponse, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponse, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponse, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponse, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponse, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponse, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponse, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponse, GetApiKeyPermissionsResponses, GetApiKeyResponse, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponse, GetAuditLogResponses, GetBackupData, GetBackupError, GetBackupErrors, GetBackupResponse, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponse, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponse, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponse, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponse, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponse, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponse, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponse, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponse, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponse, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponse, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponse, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponse, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailError, GetConversationDetailErrors, GetConversationDetailResponse, GetConversationDetailResponses, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetConversationsData, GetConversationsError, GetConversationsErrors, GetConversationsResponse, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponse, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponse, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsError, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponse, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponse, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponse, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponse, GetCustomDomainResponses, GetDashboardData, GetDashboardError, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponse, GetDashboardProjectsAnalyticsResponses, GetDashboardResponse, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponse, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponse, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponse, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponse, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponse, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponse, GetDeploymentOperationStatusResponses, GetDeploymentResponse, GetDeploymentResponses, GetDeploymentsParams, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponse, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponse, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponse, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponse, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponse, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponse, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponse, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponse, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponse, GetDomainOrderResponses, GetDomainResponse, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponse, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponse, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponse, GetEmailProviderResponses, GetEmailResponse, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponse, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponse, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponse, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponse, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponse, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponse, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponse, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponse, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesQuery, GetEnvironmentVariablesResponse, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponse, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponse, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponse, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponse, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponse, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponse, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponse, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponse, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponse, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponse, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponse, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponse, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponse, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponse, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponse, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponse, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsQuery, GetFunnelMetricsResponse, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceError, GetGenaiTraceErrors, GetGenaiTraceResponse, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponse, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponse, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponse, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponse, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponse, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponse, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponse, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsError, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponse, GetGroupedPageMetricsResponses, GetHealthData, GetHealthError, GetHealthErrors, GetHealthResponse, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponse, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponse, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponse, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponse, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponse, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlError, GetIpAccessControlErrors, GetIpAccessControlResponse, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationError, GetIpGeolocationErrors, GetIpGeolocationResponse, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponse, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponse, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanError, GetLatestScanErrors, GetLatestScanResponse, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentError, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponse, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponse, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextError, GetLogContextErrors, GetLogContextResponse, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponse, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeError, GetMetricsOverTimeErrors, GetMetricsOverTimeResponse, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponse, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponse, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponse, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnRequest, GetOrCreateDsnResponse, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponse, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponse, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponse, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponse, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponse, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponse, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponse, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsError, GetPerformanceMetricsErrors, GetPerformanceMetricsResponse, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponse, GetPgUpgradeLogsResponses, GetPgUpgradeResponse, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsError, GetPipelineStatsErrors, GetPipelineStatsResponse, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponse, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponse, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponse, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponse, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponse, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponse, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingError, GetPricingErrors, GetPricingResponse, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponse, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponse, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponse, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponse, GetProjectResponses, GetProjectsData, GetProjectSecretsQuery, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponse, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysError, GetProjectSessionReplaysErrors, GetProjectSessionReplaysQuery, GetProjectSessionReplaysResponse, GetProjectSessionReplaysResponse2, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthError, GetProjectsHealthErrors, GetProjectsHealthResponse, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponse, GetProjectsMonitorHealthResponses, GetProjectsResponse, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponse, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponse, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponse, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponse, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponse, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponse, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponse, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdError, GetProxyLogByIdErrors, GetProxyLogByIdResponse, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdError, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponse, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsError, GetProxyLogsErrors, GetProxyLogsResponse, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponse, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponse, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponse, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaError, GetQuotaErrors, GetQuotaResponse, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponse, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponse, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponse, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponse, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponse, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponse, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponse, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponse, GetRepositoryTagsResponses, GetRequest, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponse, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponse, GetResolvedEnvironmentVariableValueResponses, GetResponse, GetRestoreCapabilitiesData, GetRestoreCapabilitiesError, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponse, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunError, GetRestoreRunErrors, GetRestoreRunResponse, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponse, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponse, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponse, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponse, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceError, GetS3SourceErrors, GetS3SourceResponse, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponse, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponse, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentError, GetScanByDeploymentErrors, GetScanByDeploymentResponse, GetScanByDeploymentResponses, GetScanData, GetScanError, GetScanErrors, GetScanResponse, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesError, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponse, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponse, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponse, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponse, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponse, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponse, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponse, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponse, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponse, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponse, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponse, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponse, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponse, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponse, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayError, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsError, GetSessionReplayEventsErrors, GetSessionReplayEventsResponse, GetSessionReplayEventsResponses, GetSessionReplayResponse, GetSessionReplayResponse2, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponse, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponse, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponse, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponse, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponse, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponse, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponse, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsError, GetTimeBucketStatsErrors, GetTimeBucketStatsResponse, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsError, GetTodayStatsErrors, GetTodayStatsResponse, GetTodayStatsResponses, GetTraceData, GetTraceError, GetTraceErrors, GetTraceResponse, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceError, GetUnifiedTraceErrors, GetUnifiedTraceResponse, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponse, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsQuery, GetUniqueEventsResponse, GetUniqueEventsResponses, GetUpdateCapabilityData, GetUpdateCapabilityErrors, GetUpdateCapabilityResponse, GetUpdateCapabilityResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponse, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponse, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderError, GetUsageByProviderErrors, GetUsageByProviderResponse, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentError, GetUsageRecentErrors, GetUsageRecentResponse, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryError, GetUsageSummaryErrors, GetUsageSummaryResponse, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesError, GetUsageTimeseriesErrors, GetUsageTimeseriesResponse, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsError, GetUsageTopModelsErrors, GetUsageTopModelsResponse, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponse, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponse, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponse, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponse, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponse, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponse, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsError, GetVisitorSessionsErrors, GetVisitorSessionsQuery, GetVisitorSessionsResponse, GetVisitorSessionsResponse2, GetVisitorSessionsResponses, GetVisitorsResponse, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponse, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponse, GetWebhookResponses, GitPushEvent, GitRefResponse, GitSourcePlan, GlobalConversationResponse, GlobalEventStatsResponse, GlobalMrrResponse, GlobalRecentEventResponse, GlobalRevenueSummaryResponse, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponse, GrantProjectAccessResponses, GroupedPageMetric, GroupedPageMetricsQuery, GroupedPageMetricsResponse, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponse, HasAnalyticsEventsResponse2, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponse, HasErrorGroupsResponse2, HasErrorGroupsResponses, HasEventsQuery, HasEventsResponse, HasMetricsQuery, HasMetricsResponse, HasPerformanceMetricsData, HasPerformanceMetricsError, HasPerformanceMetricsErrors, HasPerformanceMetricsResponse, HasPerformanceMetricsResponses, HealthCheckConfiguration, HealthCheckEntryResponse, HealthResponse, HealthStatus, HealthSummary, HeartbeatApiRequest, HeartbeatResponse, HierarchyLevel, HistogramSummary, HostnameChange, HostnamePreviewResponse, HourlyPageSessions, HourlyVisitsQuery, HttpChallengeDebugResponse, ImportCredentials, ImportExecutionStatus, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceRequest, ImportExternalServiceResponse, ImportExternalServiceResponses, ImportOutcomeResponse, ImportPlan, ImportRowErrorResponse, ImportSelector, ImportSource, ImportSourceCapabilities, ImportSourceInfo, ImportStatusResponse, IncidentBucket, IncidentBucketedResponse, IncidentResponse, IncidentUpdateResponse, IncrRequest, IncrResponse, IngestLogsByPathData, IngestLogsByPathError, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsError, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathError, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsError, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponse, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathError, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesError, IngestTracesErrors, IngestTracesResponses, InitAuthResponse, InitSessionReplayData, InitSessionReplayError, InitSessionReplayErrors, InitSessionReplayResponse, InitSessionReplayResponses, Insight, InsightSeverity, InsightsResponse, InsightStatus, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponse, InspectDropArchiveResponses, IntegrationResponse, IpAccessControlQuery, IpAccessControlResponse, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponse, JobStatusResponse2, JobStatusResponses, JobSummaryResponse, JoinTokenStatusResponse, JourneyEvent, JourneySession, KeysRequest, KeysResponse, KillJobBody, KillJobData, KillJobErrors, KillJobResponse, KillJobResponses, KnownAiAgentsResponse, KvDelData, KvDelErrors, KvDelResponse, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponse, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponse, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponse, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponse, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponse, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponse, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponse, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponse, KvStatusResponse2, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponse, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponse, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponse, LatestRunForSourceResponses, LemonSqueezyConfig, LetsEncryptSettings, LineContext, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponse, LinkCustomDomainToCertificateResponses, LinkServiceRequest, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponse, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponse, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponse, ListAgentsResponse2, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponse, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponse, ListAlertRulesResponses, ListAlertsData, ListAlertsError, ListAlertsErrors, ListAlertsResponse, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponse, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponse, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysQuery, ListApiKeysResponse, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsQuery, ListAuditLogsResponse, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponse, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsError, ListBackupAlertsErrors, ListBackupAlertsResponse, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenError, ListBackupChildrenErrors, ListBackupChildrenResponse, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesError, ListBackupSchedulesErrors, ListBackupSchedulesResponse, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponse, ListBackupsForScheduleResponses, ListBlobsQuery, ListBlobsResponse, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponse, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponse, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponse, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponse, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponse, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponse, ListCustomDomainsForProjectResponses, ListCustomDomainsResponse, ListDashboardsData, ListDashboardsError, ListDashboardsErrors, ListDashboardsResponse, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponse, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensQuery, ListDeploymentTokensResponse, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponse, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponse, ListDomainsResponse2, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponse, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponse, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponse, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponse, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesQuery, ListEntitiesResponse, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsQuery, ListErrorEventsResponse, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsQuery, ListErrorGroupsResponse, ListErrorGroupsResponses, ListEventsData, ListEventsResponse, ListEventsResponses, ListEventTypesData, ListEventTypesResponse, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponse, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponse, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsError, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponse, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponse, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponse, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponse, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponse, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponse, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsError, ListInsightsErrors, ListInsightsResponse, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlError, ListIpAccessControlErrors, ListIpAccessControlResponse, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponse, ListJobsResponse2, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsError, ListKnownAiAgentsErrors, ListKnownAiAgentsResponse, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponse, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponse, ListMcpsResponse2, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysError, ListMetricLabelKeysErrors, ListMetricLabelKeysResponse, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesError, ListMetricLabelValuesErrors, ListMetricLabelValuesResponse, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesError, ListMetricNamesErrors, ListMetricNamesResponse, ListMetricNamesResponses, ListModelsData, ListModelsError, ListModelsErrors, ListModelsResponse, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponse, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponse, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponse, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponse, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponse, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponse, ListOnDemandCertsResponse2, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponse, ListOrdersResponse2, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponse, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponse, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponse, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponse, ListPresetsResponse2, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponse, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponse, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansError, ListProjectScansErrors, ListProjectScansResponse, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponse, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponse, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponse, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponse, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysError, ListProviderKeysErrors, ListProviderKeysResponse, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponse, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponse, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponse, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponse, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponse, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponse, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponse, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponse, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponse, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListRunsResponse, ListS3SourcesData, ListS3SourcesError, ListS3SourcesErrors, ListS3SourcesResponse, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponse, ListSandboxesResponse2, ListSandboxesResponses, ListScansQuery, ListScheduleRunJobsData, ListScheduleRunJobsError, ListScheduleRunJobsErrors, ListScheduleRunJobsResponse, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsError, ListScheduleRunsErrors, ListScheduleRunsResponse, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesError, ListScheduleServicesErrors, ListScheduleServicesResponse, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponse, ListSecretsResponse2, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponse, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponse, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesError, ListServiceSchedulesErrors, ListServiceSchedulesResponse, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponse, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponse, ListSkillsResponse2, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsError, ListSourceBackupsErrors, ListSourceBackupsResponse, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponse, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponse, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponse, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponse, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponse, ListSyncedRepositoriesResponses, ListTagsResponse, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponse, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponse, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponse, ListTeamsResponses, ListTemplatesQuery, ListTemplatesResponse, ListUsersData, ListUsersErrors, ListUsersResponse, ListUsersResponses, ListVulnerabilitiesQuery, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponse, ListWebhooksResponses, LiveVisitorInfo, LiveVisitorsListResponse, LocationCount, LocationGranularity, LocationInfo, LoginData, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogLevel, LogoutData, LogoutErrors, LogoutResponses, LogRecord, LogSearchLine, LogSeverity, LogSource, LogsQuery, LogsResponse, LogStream, LookupDnsARecordsData, LookupDnsARecordsError, LookupDnsARecordsErrors, LookupDnsARecordsResponse, LookupDnsARecordsResponses, ManagedDomainResponse, ManualAction, ManualActionTiming, McpDefinitionResponse, MessageContent, MessagePart, MessageResponse, MeteredMode, MetricAggregation, MetricBucket, MetricDataPoint, MetricsOverTimeResponse, MetricsQuery, MetricsRangeQuery, MetricsStatusResponse, MetricsStoreKind, MetricsSummaryResponse, MetricType, MfaRequiredResponse, MfaSetupResponse, MfaVerificationRequest, MigrationStep, MigrationSummary, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenRequest, MintEnrollmentTokenResponse, MintEnrollmentTokenResponse2, MintEnrollmentTokenResponses, MiscResult, MkdirBody, MkdirData, MkdirErrors, MkdirResponse, MkdirResponses, ModelInfo, ModelListResponse, ModelPricing, ModelUsage, MonitoringSettings, MonitoringSettingsMasked, MonitorResponse, MonitorStatus, MrrBucketResponse, MultiNodeSettings, MultiNodeSettingsMasked, MxResult, NavEntry, NavSection, NetworkConfiguration, NetworkMode, NixpacksPresetConfig, NixpacksProvider, NodeContainerListResponse, NodeContainerResponse, NodeCostInfo, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponse, NodeHeartbeatResponses, NodeInfoResponse, NodeListResponse, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponse, NodeMetricsGetRangeResponses, NotificationPreferencesResponse, NotificationProviderResponse, ObservabilityCompressionSettings, ObservabilityEvent, ObservabilityFullEventData, ObservabilityFullEventError, ObservabilityFullEventErrors, ObservabilityFullEventResponse, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsError, ObservabilityListEventsErrors, ObservabilityListEventsResponse, ObservabilityListEventsResponses, ObservabilityRetentionSettings, OidcCallbackData, OidcProviderResponse, OidcProvidersListResponse, OidcProviderSummary, OidcProviderUserResponse, OidcRoleMappingResponse, OidcTestConnectionResponse, OnDemandCertAttemptResponse, OnDemandCertRow, OnDemandTlsSettings, OpenAiError, OpenAiErrorResponse, OperatingSystemCount, OperationResultResponse, OperationResultsResponse, OtelDashboardResponse, OtelDashboardsResponse, OtelMetricAlertRuleResponse, OtelMetricAlertsResponse, OtelMetricLabelKeysResponse, OtelMetricLabelValuesResponse, OtelMetricNamesResponse, OtelMetricsResponse, OutlierAlgorithm, OutlierParams, OverprovisioningAssessment, OverprovisioningVerdict, PageActivityBucket, PageCountryStats, PageFlowEntry, PageFlowQuery, PageFlowResponse, PageHourlySessionsQuery, PageHourlySessionsResponse, PagePathDetailQuery, PagePathDetailResponse, PagePathInfo, PagePathSparkline, PagePathSparklinePoint, PagePathsQuery, PagePathsResponse, PagePathsSparklineQuery, PagePathsSparklineResponse, PagePathVisitorsQuery, PagePathVisitorsResponse, PageReferrerStats, PagesComparisonResponse, PageSessionComparison, PageSessionStats, PageSessionStatsQuery, PageTransition, PageVisit, PageVisitorSession, PaginatedEmailsResponse, PaginatedEntitiesResponse, PaginatedErrorEventsResponse, PaginatedErrorGroupsResponse, PaginatedEventsResponse, PaginatedExternalImagesResponse, PaginatedProjectList, PaginatedStaticBundlesResponse, Pagination, PaginationMeta, PaginationParams, PasswordProtectionConfig, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponse, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponse, PatchPreviewGatewaySettingsResponses, PatchSettingsRequest, PathVisitors, PathVisitorsAnalyticsQuery, PathVisitorsResponse, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponse, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponse, PauseSandboxResponses, PeerEntry, PeerListResponse, PendingActionResponse, PerformanceMetricsQuery, PerformanceMetricsResponse, PermissionInfo, PgUpgradeLogResponse, PgUpgradeResponse, PipelineStats, PipelineStatsResponse, PlanComplexity, PlanMetadata, PlanRestoreData, PlanRestoreError, PlanRestoreErrors, PlanRestoreResponse, PlanRestoreResponses, PlanSourceBackup, PlanTarget, PlatformInfo, PluginManifest, PortMapping, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponse, PostDnsAckResponses, PostgresWalHealth, PresetConfigSchema, PresetInfo, PresetResponse, PreviewAlertData, PreviewAlertError, PreviewAlertErrors, PreviewAlertResponse, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponse, PreviewFunnelMetricsResponses, PreviewGatewaySettings, PreviewGatewaySettingsMasked, PreviewGatewaySettingsResponse, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponse, PreviewHostnameModeResponses, PreviewShareLinkBody, PreviewShareLinkResponse, PricingResponse, ProblemDetails, ProjectAccessResponse, ProjectConfiguration, ProjectDashboardAnalytics, ProjectDsnResponse, ProjectHealthSummary, ProjectInfo, ProjectMonitorHealth, ProjectPresetResponse, ProjectQuery, ProjectRef, ProjectResponse, ProjectSecretEnvironmentInfo, ProjectSecretResponse, ProjectServiceInfo, ProjectsHealthResponse, ProjectsMonitorHealthResponse, ProjectStatisticsResponse, ProjectStatsBreakdown, ProjectType, ProjectUsageInfoResponse, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentRequest, PromoteDeploymentResponse, PromoteDeploymentResponses, PropertyBreakdownItem, PropertyBreakdownQuery, PropertyBreakdownResponse, PropertyColumn, PropertyTimelineItem, PropertyTimelineQuery, PropertyTimelineResponse, Protocol, ProviderCatalogDto, ProviderCatalogResponse, ProviderConfig, ProviderConfigMasked, ProviderDeletionCheckResponse, ProviderDescriptor, ProviderKeyResponse, ProviderMetadata, ProviderResponse, ProviderUsage, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponse, ProvisionDomainResponses, ProvisionResponse, ProxyLogResponse, ProxyLogsPaginatedResponse, PublicHostnameStrategy, PublicPresetResponse, PublicRepositoryInfo, PurgeLogsRequest, PurgeProjectLogsData, PurgeProjectLogsError, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushedExternalImageResponse, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponse, PushExternalImageResponses, PushImageRequest, QueryDataData, QueryDataErrors, QueryDataRequest, QueryDataResponse, QueryDataResponse2, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesError, QueryGenaiTracesErrors, QueryGenaiTracesResponse, QueryGenaiTracesResponses, QueryLogsData, QueryLogsError, QueryLogsErrors, QueryLogsResponse, QueryLogsResponses, QueryMetricsData, QueryMetricsError, QueryMetricsErrors, QueryMetricsResponse, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsError, QuerySpanStatsErrors, QuerySpanStatsResponse, QuerySpanStatsResponses, QueryTracesData, QueryTracesError, QueryTracesErrors, QueryTracesResponse, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesError, QueryTraceSummariesErrors, QueryTraceSummariesResponse, QueryTraceSummariesResponses, QuotaResponse, RateLimitConfig, RateLimitSettings, ReachabilityStatus, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponse, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponse, ReadFileResponse2, ReadFileResponses, ReadRowsQuery, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecentActivityQuery, RecentActivityResponse, RecentEventResponse, RecentQueryParams, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponse, RecordEventMetricsResponses, RecordExposureRequest, RecordExposureResponse, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponse, RecordFlagExposureResponses, RecordListResponse, RecordSpeedMetricsData, RecordSpeedMetricsError, RecordSpeedMetricsErrors, RecordSpeedMetricsResponse, RecordSpeedMetricsResponses, RecoveryTarget, ReferrerCount, ReferrersAnalyticsQuery, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponse, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnRequest, RegenerateDsnResponse, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponse, RegisterExternalImageResponses, RegisterImageRequest, RegisterNodeApiRequest, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponse, RegisterNodeResponse2, RegisterNodeResponses, RegisterRequest, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponse, ReinstallGitlabWebhookResponses, ReinstallWebhookResponse, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponse, RejectPendingActionResponses, ReleaseCheckResult, ReleaseListResponse, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponse, ReloadPluginsResponses, ReloadResponse, RemoteDeploymentResponse, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponse, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponse, RemoveManagedDomainResponses, RemoveNodeResponse, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponse, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponse, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationRequest, RenameConversationResponse, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponse, RenewDomainResponses, RepositoryListQuery, RepositoryListResponse, RepositoryPresetResponse, RepositoryResponse, RepositorySyncStartedResponse, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponse, RequestPasswordResetResponses, RequestRow, RequiredPasswordChangeRequest, RequiredPasswordChangeResponse, ResetPasswordData, ResetPasswordErrors, ResetPasswordRequest, ResetPasswordResponse, ResetPasswordResponses, ResetPgStatStatementsRequest, ResetPgStatStatementsResponse, ResizeSandboxBody, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponse, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, ResolvedEnvVarResponse, ResolvedEnvVarSource, ResourceCounts, ResourceFootprint, ResourceInfo, ResourceLimitApplyResult, ResourceLimits, ResourceLimitsResponse, ResourceLimitsUpdateResponse, ResourcesBody, RestartContainerData, RestartContainerErrors, RestartContainerResponse, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponse, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponse, RestartSandboxResponses, RestoreCapabilities, RestoreCapabilitiesResponse, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponse, RestoreFlagResponses, RestorePlan, RestoreRequestMode, RestoreRunView, RestoreUserData, RestoreUserErrors, RestoreUserResponse, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponse, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponse, ResumeSandboxResponses, RetentionCleanupFailure, RetentionCleanupReport, RetryClusterData, RetryClusterErrors, RetryClusterRequest, RetryClusterResponse, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponse, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponse, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponse, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponse, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponse, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponse, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponse, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponse, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponse, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponse, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponse, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponse, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponse, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponse, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponse, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponse, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponse, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponse, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponse, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponse, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponse, RevenueRotateTokenResponses, RevenueRow, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponse, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponse, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponse, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponse, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponse, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponse, RevokeProjectAccessResponses, RiskLevel, RoleInfo, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponse, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponse, RollbackToDeploymentResponses, RootfsCacheEntry, RootfsGcData, RootfsGcReport, RootfsGcResponses, RootfsReport, RootfsReportData, RootfsReportResponses, RootfsVmEntry, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponse, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponse, RotateDeploymentTokenResponses, RouteRefreshResponse, RouteResponse, RouteRole, RouteUser, RouteUserWithRoles, RunBackupForSourceData, RunBackupForSourceError, RunBackupForSourceErrors, RunBackupForSourceResponse, RunBackupForSourceResponses, RunBackupRequest, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponse, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupError, RunExternalServiceBackupErrors, RunExternalServiceBackupRequest, RunExternalServiceBackupResponse, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowError, RunScheduleNowErrors, RunScheduleNowResponse, RunScheduleNowResponses, S3ConnectionTestResponse, S3CredentialsResponse, S3SourceResponse, S3SourceResponseWritable, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponse, SandboxCreatePreviewLinkResponses, SandboxDomainResponse, SandboxEvent, SandboxEventsResponse, SandboxInner, SandboxResponse, SandboxRoute, SandboxStatusResponse, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenRequest, SaveAgentTokenResponse, SaveAgentTokenResponse2, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponse, SaveAiProviderCredentialResponses, SaveCredentialRequest, SaveCredentialResponse, ScalewayCredentialsRequest, ScanResponse, ScheduleRunEntry, ScheduleRunJobEntry, ScheduleRunListResponse, ScheduleRunResponse, ScheduleRunSummary, ScheduleRunSummaryList, ScreenshotSettings, SearchLogsData, SearchLogsError, SearchLogsErrors, SearchLogsRequest, SearchLogsResponse, SearchLogsResponse2, SearchLogsResponses, SearchMode, Seasonality, SecretResponse, SecurityConfig, SecurityHeadersConfig, SecurityHeadersSettings, SelfUpdateAttempt, SelfUpdateBlocker, SelfUpdatePhase, SelfUpdateRestartMode, SelfUpdateSettings, SelfUpdateStatus, SendEmailData, SendEmailErrors, SendEmailRequestBody, SendEmailResponse, SendEmailResponseBody, SendEmailResponses, SendMessageRequest, SensitiveConfigValueResponse, SensitiveMcpConfigValueResponse, SensitiveValueResponse, SentryChunkUploadResponse, SentryCreateReleaseRequest, SentryEventRequest, SentryEventResponse, SentryReleaseFileResponse, SentryReleaseProjectRef, SentryReleaseResponse, SeriesStateEntry, ServiceAccessInfo, ServiceAction, ServiceAlertRuleResponse, ServiceBackupEntryResponse, ServiceBackupListResponse, ServiceCreateAlertRuleRequest, ServiceHealthResponse, ServiceHealthStatusBatchResponse, ServiceHealthStatusEntryResponse, ServiceMemberInfo, ServiceParameter, ServicePlan, ServiceResourceLimits, ServiceRuntimeReport, ServiceStatsReport, ServiceTypeInfo, ServiceTypeRoute, ServiceUpdateAlertRuleRequest, SesCredentialsRequest, SessionDetails, SessionDetailsQuery, SessionEvent, SessionEventDto, SessionEventsQuery, SessionEventsResponse, SessionLogsQuery, SessionLogsResponse, SessionReplayEventsRequest, SessionReplayInfoDto, SessionReplayInitRequest, SessionReplayInitResponse, SessionReplayWithEventsDto, SessionReplayWithVisitorDto, SessionRequestLog, SessionSummary, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponse, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceError, SetDefaultS3SourceErrors, SetDefaultS3SourceResponse, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentRequest, SetFlagEnvironmentResponse, SetFlagEnvironmentResponses, SetPreviewPasswordBody, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponse, SetPreviewPasswordResponse2, SetPreviewPasswordResponses, SetRequest, SetResponse, SettingsUpdateResponse, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeRequest, SetupDnsChallengeResponse, SetupDnsChallengeResponse2, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsRequest, SetupDnsResponse, SetupDnsResponse2, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponse, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponse, SetupMfaResponses, SiblingRef, SkillDefinitionResponse, SlackConfig, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponse, SleepEnvironmentResponses, SlowQueriesResponse, SlowQueryRow, SmartFilter, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponse, SmokeTestAgentResponses, SmokeTestResponse, SmtpCredentialsRequest, SmtpEncryptionRoute, SmtpResult, SourceArchiveUpload, SourceBackupEntry, SourceBackupIndexResponse, SourceBody, SourceFileListResponse, SourceFileResponse, SourceMapListResponse, SourceMapResponse, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponse, SourceSandboxResponses, SourceType, SpanEvent, SpanKind, SpanRecord, SpanRow, SpanStats, SpanStatsResponse, SpanStatusCode, SpeedMetricsPayload, SpeedSegmentFilters, StaleSlot, StartAnalysisData, StartAnalysisErrors, StartAnalysisRequest, StartAnalysisResponse, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponse, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeRequest, StartPgUpgradeResponse, StartPgUpgradeResponses, StartRestoreData, StartRestoreError, StartRestoreErrors, StartRestoreRequest, StartRestoreResponse, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponse, StartServiceResponses, StartUpdateData, StartUpdateError, StartUpdateErrors, StartUpdateRequest, StartUpdateResponse, StartUpdateResponse2, StartUpdateResponses, StaticBundleResponse, StaticParams, StaticPresetConfig, StatPathData, StatPathErrors, StatPathResponse, StatPathResponses, StatResponse, StatsFilters, StatusBucket, StatusBucketedResponse, StatusCodeCount, StatusCodesQuery, StatusPageOverview, StepConversionResponse, StepResourceType, StepResult, StepUpResponse, StopContainerData, StopContainerErrors, StopContainerResponse, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponse, StopSandboxResponses, StopSequence, StopServiceData, StopServiceErrors, StopServiceResponse, StopServiceResponses, StorageQuota, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, StripeConfig, SupervisorKind, SyncedRepositoryListQuery, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponse, SyncRepositoriesResponses, SyntaxResult, TagInfo, TagListResponse, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsError, TailLogsErrors, TailLogsRequest, TailLogsResponses, TargetRecommendation, TeamListResponse, TeamMemberResponse, TeamResponse, TeamRole, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponse, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponse, TeardownEnvironmentResponses, TemplateResponse, TestEmailRequest, TestEmailResponse, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponse, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponse, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponse, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdError, TestProviderKeyByIdErrors, TestProviderKeyByIdResponse, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineError, TestProviderKeyInlineErrors, TestProviderKeyInlineResponse, TestProviderKeyInlineResponses, TestProviderKeyRequest, TestProviderKeyResponse, TestProviderResponse, TestProviderResponse2, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewError, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponse, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionError, TestS3SourceConnectionErrors, TestS3SourceConnectionResponse, TestS3SourceConnectionResponses, TimeBucketStats, TimeBucketStatsResponse, TimeseriesBucket, TimeseriesQueryParams, TlsMode, TodayStatsResponse, ToggleAiDataAccessRequest, ToggleDeploymentMetricsRequest, ToggleServiceMetricsRequest, TokenRenewalRequest, ToolCallEvent, ToolInfo, ToolResultEvent, TopModelsQueryParams, TraceProjectRef, TracesResponse, TraceSummariesResponse, TraceSummary, TrackClickData, TrackClickErrors, TrackedLinkResponse, TrackingEventResponse, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentRequest, TriggerAgentResponse, TriggerAgentResponses, TriggerDigestResponse, TriggerPipelinePayload, TriggerPipelineResponse, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponse, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanError, TriggerScanErrors, TriggerScanRequest, TriggerScanResponse, TriggerScanResponse2, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponse, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponse, TriggerWeeklyDigestResponses, TtlRequest, TtlResponse, TxtRecord, UiManifest, UiRoute, UndrainNodeResponse, UnifiedTrace, UniqueCountsQuery, UniqueCountsResponse, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponse, UnlinkServiceFromProjectResponses, UnsupportedFeature, UpdateAdminGateRequest, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponse, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderRequest, UpdateAiProviderResponse, UpdateAiProviderResponse2, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertError, UpdateAlertErrors, UpdateAlertResponse, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleRequest, UpdateAlertRuleResponse, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyRequest, UpdateApiKeyResponse, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployRequest, UpdateAutomaticDeployResponse, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleError, UpdateBackupScheduleErrors, UpdateBackupScheduleRequest, UpdateBackupScheduleResponse, UpdateBackupScheduleResponses, UpdateBlobRequest, UpdateBlobResponse, UpdateCapabilityResponse, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderRequest, UpdateCloudflareProviderResponse, UpdateCloudflareProviderResponses, UpdateConfigBody, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponse, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainRequest, UpdateCustomDomainResponse, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardError, UpdateDashboardErrors, UpdateDashboardRequest, UpdateDashboardResponse, UpdateDashboardResponses, UpdateDeploymentConfigRequest, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenRequest, UpdateDeploymentTokenResponse, UpdateDeploymentTokenResponses, UpdateDnsProviderRequest, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderRequest, UpdateEmailProviderResponse, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsRequest, UpdateEnvironmentSettingsResponse, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainRequest, UpdateEnvironmentSubdomainResponse, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableRequest, UpdateEnvironmentVariableResponse, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupRequest, UpdateErrorGroupResponses, UpdateExternalServiceRequest, UpdateFlagData, UpdateFlagErrors, UpdateFlagRequest, UpdateFlagResponse, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponse, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsRequest, UpdateGitSettingsResponse, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponse, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponse, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusRequest, UpdateIncidentStatusResponse, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlError, UpdateIpAccessControlErrors, UpdateIpAccessControlRequest, UpdateIpAccessControlResponse, UpdateIpAccessControlResponses, UpdateKvRequest, UpdateKvResponse, UpdateManagedDomainApiRequest, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponse, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpRequest, UpdateMcpResponse, UpdateMcpResponses, UpdateMemberRoleRequest, UpdateMetricAlertRequest, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderRequest, UpdateNotificationEmailProviderResponse, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponse, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderRequest, UpdateOidcProviderResponse, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesRequest, UpdatePreferencesResponse, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponse, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponse, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretRequest, UpdateProjectSecretResponse, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsRequest, UpdateProjectSettingsResponse, UpdateProjectSettingsResponses, UpdateProviderCredentialsRequest, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyError, UpdateProviderKeyErrors, UpdateProviderKeyRequest, UpdateProviderKeyResponse, UpdateProviderKeyResponses, UpdateProviderRequest, UpdateProviderResponse, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteRequest, UpdateRouteResponse, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceError, UpdateS3SourceErrors, UpdateS3SourceRequest, UpdateS3SourceResponse, UpdateS3SourceResponses, UpdateSecretBody, UpdateSelfData, UpdateSelfErrors, UpdateSelfRequest, UpdateSelfResponse, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponse, UpdateServiceResourcesResponses, UpdateServiceResponse, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationError, UpdateSessionDurationErrors, UpdateSessionDurationRequest, UpdateSessionDurationResponse, UpdateSessionDurationResponse2, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponse, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillRequest, UpdateSkillResponse, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderRequest, UpdateSlackProviderResponse, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsError, UpdateSpeedMetricsErrors, UpdateSpeedMetricsPayload, UpdateSpeedMetricsResponse, UpdateSpeedMetricsResponses, UpdateStatusResponse, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponse, UpdateTeamMemberRoleResponses, UpdateTeamRequest, UpdateTeamResponse, UpdateTeamResponses, UpdateTokenRequest, UpdateTokenResponse, UpdateUserData, UpdateUserErrors, UpdateUserRequest, UpdateUserResponse, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderRequest, UpdateWebhookProviderResponse, UpdateWebhookProviderResponses, UpdateWebhookRequestBody, UpdateWebhookResponse, UpdateWebhookResponses, UpgradeExternalServiceRequest, UpgradePreviewGatewayData, UpgradePreviewGatewayResponse, UpgradePreviewGatewayResponses, UpgradeRequest, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponse, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponse, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponse, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponse, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponse, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponse, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponse, UploadStaticBundleResponses, UpsertAgentRequest, UpsertSecretData, UpsertSecretErrors, UpsertSecretRequest, UpsertSecretResponse, UpsertSecretResponses, UptimeDataPoint, UptimeHistoryResponse, UsageFilter, UsageInfo, UsageLogEntry, UsageLogPage, UsageQueryParams, UsageSource, UsageSummary, UserResponse, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponse, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailRequest, ValidateEmailResponse, ValidateEmailResponse2, ValidateEmailResponses, ValidationLevel, ValidationReport, ValidationResponse, ValidationResult, ValidationStatus, ValidationSummary, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponse, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponse, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponse, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponse, VerifyMfaChallengeResponses, VerifyMfaRequest, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpRequest, VerifyStepUpResponse, VerifyStepUpResponses, ViewItem, ViewsOverTime, ViewsOverTimeQuery, VisitorDetails, VisitorFacets, VisitorFacetsQuery, VisitorFacetValue, VisitorInfo, VisitorJourneyQuery, VisitorJourneyResponse, VisitorLocationsQuery, VisitorRecord, VisitorSegmentFilters, VisitorSessionsQuery, VisitorSessionsResponse, VisitorsListQuery, VisitorsResponse, VisitorStats, VisitorWithGeolocation, VolumeMount, VolumeType, VulnerabilityResponse, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponse, WakeEnvironmentResponses, WalWarning, WalWarningSeverity, WebhookConfig, WebhookDeliveryResponse, WebhookResponse, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerRequest, WebhookTriggerResponse, WebhookTriggerResponse2, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunRequest, WorkflowDryRunResponse, WorkflowDryRunResponses, WorkloadDescriptor, WorkloadId, WorkloadStatus, WorkloadType, WriteFileBody, WriteFileData, WriteFileErrors, WriteFileResponse, WriteFileResponses, WriteFilesBody, WriteFilesData, WriteFilesErrors, WriteFilesResponse, WriteFilesResponse2, WriteFilesResponses, ZoneListResponse } from './types.gen'; diff --git a/web/src/api/client/sdk.gen.ts b/web/src/api/client/sdk.gen.ts index 3f4e8bfd0..30c060103 100644 --- a/web/src/api/client/sdk.gen.ts +++ b/web/src/api/client/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, type ClientMeta, formDataBodySerializer, type Options as Options2, type RequestResult, type ServerSentEventsResult, type TDataShape } from './client'; import { client } from './client.gen'; -import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesErrors, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsErrors, QuerySpanStatsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TerminalData, TerminalErrors, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; +import type { AcknowledgeAlarmData, AcknowledgeAlarmErrors, AcknowledgeAlarmResponses, ActivateAiProviderData, ActivateAiProviderErrors, ActivateAiProviderResponses, ActivateApiKeyData, ActivateApiKeyErrors, ActivateApiKeyResponses, ActivateConnectionData, ActivateConnectionErrors, ActivateConnectionResponses, ActivateProviderData, ActivateProviderErrors, ActivateProviderResponses, AddClusterMemberData, AddClusterMemberErrors, AddClusterMemberResponses, AddContextData, AddContextErrors, AddContextResponses, AddEnvironmentDomainData, AddEnvironmentDomainErrors, AddEnvironmentDomainResponses, AddEventsData, AddEventsErrors, AddEventsResponses, AddManagedDomainData, AddManagedDomainErrors, AddManagedDomainResponses, AddSessionReplayEventsData, AddSessionReplayEventsErrors, AddSessionReplayEventsResponses, AddTeamMemberData, AddTeamMemberErrors, AddTeamMemberResponses, AdminDrainNodeData, AdminDrainNodeErrors, AdminDrainNodeResponses, AdminDrainStatusData, AdminDrainStatusErrors, AdminDrainStatusResponses, AdminGetNodeData, AdminGetNodeErrors, AdminGetNodeResponses, AdminListNodeContainersData, AdminListNodeContainersErrors, AdminListNodeContainersResponses, AdminListNodesData, AdminListNodesErrors, AdminListNodesResponses, AdminRemoveNodeData, AdminRemoveNodeErrors, AdminRemoveNodeResponses, AdminUndrainNodeData, AdminUndrainNodeErrors, AdminUndrainNodeResponses, ApplyHostnameModeData, ApplyHostnameModeErrors, ApplyHostnameModeResponses, ArchiveConversationData, ArchiveConversationErrors, ArchiveConversationResponses, ArchiveFlagData, ArchiveFlagErrors, ArchiveFlagResponses, AssignRoleData, AssignRoleErrors, AssignRoleResponses, AttachScheduleServicesData, AttachScheduleServicesErrors, AttachScheduleServicesResponses, BlobCopyData, BlobCopyErrors, BlobCopyResponses, BlobDeleteData, BlobDeleteErrors, BlobDeleteResponses, BlobDisableData, BlobDisableErrors, BlobDisableResponses, BlobDownloadData, BlobDownloadErrors, BlobDownloadResponses, BlobEnableData, BlobEnableErrors, BlobEnableResponses, BlobHeadData, BlobHeadErrors, BlobHeadResponses, BlobListData, BlobListErrors, BlobListResponses, BlobPutData, BlobPutErrors, BlobPutResponses, BlobStatusData, BlobStatusErrors, BlobStatusResponses, BlobUpdateData, BlobUpdateErrors, BlobUpdateResponses, CancelBackupData, CancelBackupErrors, CancelBackupResponses, CancelData, CancelDeploymentData, CancelDeploymentErrors, CancelDeploymentResponses, CancelDomainOrderData, CancelDomainOrderErrors, CancelDomainOrderResponses, CancelErrors, CancelPgUpgradeData, CancelPgUpgradeErrors, CancelPgUpgradeResponses, CancelResponses, CancelRunData, CancelRunErrors, CancelRunResponses, CancelScheduleRunData, CancelScheduleRunErrors, CancelScheduleRunResponses, ChangePasswordSelfData, ChangePasswordSelfErrors, ChangePasswordSelfResponses, ChangeProjectSourceData, ChangeProjectSourceErrors, ChangeProjectSourceResponses, ChangeRequiredPasswordData, ChangeRequiredPasswordErrors, ChangeRequiredPasswordResponses, ChatCompletionsData, ChatCompletionsErrors, ChatCompletionsResponses, CheckAnalyticsHasEventsData, CheckAnalyticsHasEventsErrors, CheckAnalyticsHasEventsResponses, CheckCommitExistsData, CheckCommitExistsErrors, CheckCommitExistsResponses, CheckDomainStatusData, CheckDomainStatusErrors, CheckDomainStatusResponses, CheckExplorerSupportData, CheckExplorerSupportErrors, CheckExplorerSupportResponses, CheckForUpdateData, CheckForUpdateErrors, CheckForUpdateResponses, CheckIpBlockedData, CheckIpBlockedErrors, CheckIpBlockedResponses, CheckProviderDeletionSafetyData, CheckProviderDeletionSafetyErrors, CheckProviderDeletionSafetyResponses, ChunkUploadOptionsData, ChunkUploadOptionsResponses, CleanupExpiredBackupsData, CleanupExpiredBackupsErrors, CleanupExpiredBackupsResponses, ClearPreviewPasswordData, ClearPreviewPasswordErrors, ClearPreviewPasswordResponses, CliDeviceApproveData, CliDeviceApproveErrors, CliDeviceApproveResponses, CliDeviceDenyData, CliDeviceDenyErrors, CliDeviceDenyResponses, CliDeviceLookupData, CliDeviceLookupErrors, CliDeviceLookupResponses, CliDevicePollData, CliDevicePollErrors, CliDevicePollResponses, CliDeviceStartData, CliDeviceStartErrors, CliDeviceStartResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CmdData, CmdErrors, CmdKillData, CmdKillErrors, CmdKillResponses, CmdLogsData, CmdLogsErrors, CmdLogsResponses, CmdResponses, ConfirmPendingActionData, ConfirmPendingActionErrors, ConfirmPendingActionResponses, ContainerMetricsGetHistoryData, ContainerMetricsGetHistoryErrors, ContainerMetricsGetHistoryResponses, CreateAgentData, CreateAgentErrors, CreateAgentResponses, CreateAlertData, CreateAlertErrors, CreateAlertResponses, CreateAlertRuleData, CreateAlertRuleErrors, CreateAlertRuleResponses, CreateApiKeyData, CreateApiKeyErrors, CreateApiKeyResponses, CreateBackupScheduleData, CreateBackupScheduleErrors, CreateBackupScheduleResponses, CreateBitbucketProviderData, CreateBitbucketProviderErrors, CreateBitbucketProviderResponses, CreateCloudflareProviderData, CreateCloudflareProviderErrors, CreateCloudflareProviderResponses, CreateConversationData, CreateConversationErrors, CreateConversationResponses, CreateCustomDomainData, CreateCustomDomainErrors, CreateCustomDomainResponses, CreateDashboardData, CreateDashboardErrors, CreateDashboardResponses, CreateDeploymentTokenData, CreateDeploymentTokenErrors, CreateDeploymentTokenResponses, CreateDnsProviderData, CreateDnsProviderErrors, CreateDnsProviderResponses, CreateDomainData, CreateDomainErrors, CreateDomainResponses, CreateDsnData, CreateDsnErrors, CreateDsnResponses, CreateEmailDomainData, CreateEmailDomainErrors, CreateEmailDomainResponses, CreateEmailProviderData, CreateEmailProviderErrors, CreateEmailProviderResponses, CreateEnvironmentData, CreateEnvironmentErrors, CreateEnvironmentResponses, CreateEnvironmentVariableData, CreateEnvironmentVariableErrors, CreateEnvironmentVariableResponses, CreateFlagData, CreateFlagErrors, CreateFlagResponses, CreateFunnelData, CreateFunnelErrors, CreateFunnelResponses, CreateGenericProviderData, CreateGenericProviderErrors, CreateGenericProviderResponses, CreateGiteaPatProviderData, CreateGiteaPatProviderErrors, CreateGiteaPatProviderResponses, CreateGithubPatProviderData, CreateGithubPatProviderErrors, CreateGithubPatProviderResponses, CreateGitlabOauthProviderData, CreateGitlabOauthProviderErrors, CreateGitlabOauthProviderResponses, CreateGitlabPatProviderData, CreateGitlabPatProviderErrors, CreateGitlabPatProviderResponses, CreateGitProviderData, CreateGitProviderErrors, CreateGitProviderResponses, CreateGlobalMcpData, CreateGlobalMcpErrors, CreateGlobalMcpResponses, CreateGlobalSkillData, CreateGlobalSkillErrors, CreateGlobalSkillResponses, CreateIncidentData, CreateIncidentErrors, CreateIncidentResponses, CreateIpAccessControlData, CreateIpAccessControlErrors, CreateIpAccessControlResponses, CreateMcpData, CreateMcpErrors, CreateMcpResponses, CreateMonitorData, CreateMonitorErrors, CreateMonitorResponses, CreateNotificationEmailProviderData, CreateNotificationEmailProviderErrors, CreateNotificationEmailProviderResponses, CreateNotificationProviderData, CreateNotificationProviderErrors, CreateNotificationProviderResponses, CreateOidcProviderData, CreateOidcProviderErrors, CreateOidcProviderResponses, CreateOidcRoleMappingData, CreateOidcRoleMappingResponses, CreateOrRecreateOrderData, CreateOrRecreateOrderErrors, CreateOrRecreateOrderResponses, CreatePlanData, CreatePlanErrors, CreatePlanResponses, CreatePrData, CreatePrErrors, CreateProjectData, CreateProjectErrors, CreateProjectFromTemplateData, CreateProjectFromTemplateErrors, CreateProjectFromTemplateResponses, CreateProjectReleaseData, CreateProjectReleaseErrors, CreateProjectReleaseResponses, CreateProjectResponses, CreateProjectSecretData, CreateProjectSecretErrors, CreateProjectSecretResponses, CreateProviderKeyData, CreateProviderKeyErrors, CreateProviderKeyResponses, CreatePrResponses, CreateReleaseData, CreateReleaseErrors, CreateReleaseResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateS3SourceData, CreateS3SourceErrors, CreateS3SourceResponses, CreateSandboxData, CreateSandboxErrors, CreateSandboxResponses, CreateServiceData, CreateServiceErrors, CreateServiceResponses, CreateSkillData, CreateSkillErrors, CreateSkillResponses, CreateSlackProviderData, CreateSlackProviderErrors, CreateSlackProviderResponses, CreateTeamData, CreateTeamErrors, CreateTeamResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWebhookData, CreateWebhookErrors, CreateWebhookProviderData, CreateWebhookProviderErrors, CreateWebhookProviderResponses, CreateWebhookResponses, DeactivateApiKeyData, DeactivateApiKeyErrors, DeactivateApiKeyResponses, DeactivateConnectionData, DeactivateConnectionErrors, DeactivateConnectionResponses, DeactivateProviderData, DeactivateProviderErrors, DeactivateProviderResponses, DeleteAgentData, DeleteAgentErrors, DeleteAgentResponses, DeleteAlertData, DeleteAlertErrors, DeleteAlertResponses, DeleteAlertRuleData, DeleteAlertRuleErrors, DeleteAlertRuleResponses, DeleteApiKeyData, DeleteApiKeyErrors, DeleteApiKeyResponses, DeleteBackupData, DeleteBackupErrors, DeleteBackupResponses, DeleteBackupScheduleData, DeleteBackupScheduleErrors, DeleteBackupScheduleResponses, DeleteConnectionData, DeleteConnectionErrors, DeleteConnectionResponses, DeleteCustomDomainData, DeleteCustomDomainErrors, DeleteCustomDomainResponses, DeleteDashboardData, DeleteDashboardErrors, DeleteDashboardResponses, DeleteDeploymentTokenData, DeleteDeploymentTokenErrors, DeleteDeploymentTokenResponses, DeleteDnsProviderData, DeleteDnsProviderErrors, DeleteDnsProviderResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailDomainData, DeleteEmailDomainErrors, DeleteEmailDomainResponses, DeleteEmailProviderData, DeleteEmailProviderErrors, DeleteEmailProviderResponses, DeleteEnvironmentData, DeleteEnvironmentDomainData, DeleteEnvironmentDomainErrors, DeleteEnvironmentDomainResponses, DeleteEnvironmentErrors, DeleteEnvironmentResponses, DeleteEnvironmentVariableData, DeleteEnvironmentVariableErrors, DeleteEnvironmentVariableResponses, DeleteExternalImageData, DeleteExternalImageErrors, DeleteExternalImageResponses, DeleteFunnelData, DeleteFunnelErrors, DeleteFunnelResponses, DeleteGitProviderData, DeleteGitProviderErrors, DeleteGitProviderResponses, DeleteGlobalMcpData, DeleteGlobalMcpErrors, DeleteGlobalMcpResponses, DeleteGlobalSkillData, DeleteGlobalSkillErrors, DeleteGlobalSkillResponses, DeleteIpAccessControlData, DeleteIpAccessControlErrors, DeleteIpAccessControlResponses, DeleteMcpData, DeleteMcpErrors, DeleteMcpResponses, DeleteMonitorData, DeleteMonitorErrors, DeleteMonitorResponses, DeleteNotificationProviderData, DeleteNotificationProviderErrors, DeleteNotificationProviderResponses, DeleteOidcProviderData, DeleteOidcProviderResponses, DeleteOidcRoleMappingData, DeleteOidcRoleMappingResponses, DeletePreferencesData, DeletePreferencesErrors, DeletePreferencesResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteProjectSecretData, DeleteProjectSecretErrors, DeleteProjectSecretResponses, DeleteProviderKeyData, DeleteProviderKeyErrors, DeleteProviderKeyResponses, DeleteProviderSafelyData, DeleteProviderSafelyErrors, DeleteProviderSafelyResponses, DeleteReleaseSourceFilesData, DeleteReleaseSourceFilesErrors, DeleteReleaseSourceFilesResponses, DeleteReleaseSourceMapsData, DeleteReleaseSourceMapsErrors, DeleteReleaseSourceMapsResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteS3SourceData, DeleteS3SourceErrors, DeleteS3SourceResponses, DeleteScanData, DeleteScanErrors, DeleteScanResponses, DeleteSecretData, DeleteSecretErrors, DeleteSecretResponses, DeleteServiceData, DeleteServiceErrors, DeleteServiceResponses, DeleteSessionReplayData, DeleteSessionReplayErrors, DeleteSessionReplayResponses, DeleteSkillData, DeleteSkillErrors, DeleteSkillResponses, DeleteSourceMapData, DeleteSourceMapErrors, DeleteSourceMapResponses, DeleteStaticBundleData, DeleteStaticBundleErrors, DeleteStaticBundleResponses, DeleteTeamData, DeleteTeamErrors, DeleteTeamResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWebhookData, DeleteWebhookErrors, DeleteWebhookResponses, DeployFromImageData, DeployFromImageErrors, DeployFromImageResponses, DeployFromImageUploadData, DeployFromImageUploadErrors, DeployFromImageUploadResponses, DeployFromStaticData, DeployFromStaticErrors, DeployFromStaticResponses, DeployFromUploadedSourceData, DeployFromUploadedSourceErrors, DeployFromUploadedSourceResponses, DeploymentMetricsGetLatestData, DeploymentMetricsGetLatestErrors, DeploymentMetricsGetLatestResponses, DeploymentMetricsGetRangeData, DeploymentMetricsGetRangeErrors, DeploymentMetricsGetRangeResponses, DeploymentMetricsToggleData, DeploymentMetricsToggleErrors, DeploymentMetricsToggleResponses, DestroySandboxData, DestroySandboxErrors, DestroySandboxResponses, DetachScheduleServiceData, DetachScheduleServiceErrors, DetachScheduleServiceResponses, DetectPublicPresetsData, DetectPublicPresetsErrors, DetectPublicPresetsResponses, DisableBackupScheduleData, DisableBackupScheduleErrors, DisableBackupScheduleResponses, DisableMfaData, DisableMfaErrors, DisableMfaResponses, DiscoverWorkloadsData, DiscoverWorkloadsErrors, DiscoverWorkloadsResponses, DomainData, DomainErrors, DomainResponses, DownloadGlobalSkillArchiveData, DownloadGlobalSkillArchiveErrors, DownloadGlobalSkillArchiveResponses, DownloadObjectData, DownloadObjectErrors, DownloadObjectResponses, DownloadSkillArchiveData, DownloadSkillArchiveErrors, DownloadSkillArchiveResponses, EmailStatusData, EmailStatusErrors, EmailStatusResponses, EmbeddingsData, EmbeddingsErrors, EmbeddingsResponses, EnableBackupScheduleData, EnableBackupScheduleErrors, EnableBackupScheduleResponses, EnrichVisitorData, EnrichVisitorErrors, EnrichVisitorResponses, ExecData, ExecDetachedData, ExecDetachedErrors, ExecDetachedResponses, ExecErrors, ExecResponses, ExecuteDeploymentOperationData, ExecuteDeploymentOperationErrors, ExecuteDeploymentOperationResponses, ExecuteImportData, ExecuteImportErrors, ExecuteImportResponses, ExtendTimeoutData, ExtendTimeoutErrors, ExtendTimeoutResponses, ExternalServiceEnablePgStatStatementsData, ExternalServiceEnablePgStatStatementsErrors, ExternalServiceEnablePgStatStatementsResponses, ExternalServiceMetricsByDatabaseData, ExternalServiceMetricsByDatabaseErrors, ExternalServiceMetricsByDatabaseResponses, ExternalServiceMetricsCreateAlertRuleData, ExternalServiceMetricsCreateAlertRuleErrors, ExternalServiceMetricsCreateAlertRuleResponses, ExternalServiceMetricsDeleteAlertRuleData, ExternalServiceMetricsDeleteAlertRuleErrors, ExternalServiceMetricsDeleteAlertRuleResponses, ExternalServiceMetricsGetAlertRulesData, ExternalServiceMetricsGetAlertRulesErrors, ExternalServiceMetricsGetAlertRulesResponses, ExternalServiceMetricsGetLatestData, ExternalServiceMetricsGetLatestErrors, ExternalServiceMetricsGetLatestResponses, ExternalServiceMetricsGetRangeData, ExternalServiceMetricsGetRangeErrors, ExternalServiceMetricsGetRangeResponses, ExternalServiceMetricsStatusData, ExternalServiceMetricsStatusErrors, ExternalServiceMetricsStatusResponses, ExternalServiceMetricsToggleData, ExternalServiceMetricsToggleErrors, ExternalServiceMetricsToggleResponses, ExternalServiceMetricsUpdateAlertRuleData, ExternalServiceMetricsUpdateAlertRuleErrors, ExternalServiceMetricsUpdateAlertRuleResponses, ExternalServiceResetPgStatStatementsData, ExternalServiceResetPgStatStatementsErrors, ExternalServiceResetPgStatStatementsResponses, FinalizeOrderData, FinalizeOrderErrors, FinalizeOrderResponses, FinalizeProjectReleaseData, FinalizeProjectReleaseErrors, FinalizeProjectReleaseResponses, FindConversationData, FindConversationErrors, FindConversationResponses, GenerateJoinTokenData, GenerateJoinTokenErrors, GenerateJoinTokenResponses, GeneratePresetDockerfileData, GeneratePresetDockerfileErrors, GeneratePresetDockerfileResponses, GetAccessInfoData, GetAccessInfoErrors, GetAccessInfoResponses, GetActiveVisitorsData, GetActiveVisitorsErrors, GetActiveVisitorsResponses, GetActivityGraphData, GetActivityGraphErrors, GetActivityGraphResponses, GetAdminGateData, GetAdminGateErrors, GetAdminGateResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetAggregatedBucketsData, GetAggregatedBucketsErrors, GetAggregatedBucketsResponses, GetAiAgentBreakdownData, GetAiAgentBreakdownErrors, GetAiAgentBreakdownResponses, GetAiAgentPagesData, GetAiAgentPagesErrors, GetAiAgentPagesResponses, GetAiAgentTimelineData, GetAiAgentTimelineErrors, GetAiAgentTimelineResponses, GetAiDataAccessData, GetAiDataAccessErrors, GetAiDataAccessResponses, GetAiPageBreakdownData, GetAiPageBreakdownErrors, GetAiPageBreakdownResponses, GetAiStatusBreakdownData, GetAiStatusBreakdownErrors, GetAiStatusBreakdownResponses, GetAlertData, GetAlertErrors, GetAlertResponses, GetAlertRuleData, GetAlertRuleErrors, GetAlertRuleResponses, GetAllRepositoriesByNameData, GetAllRepositoriesByNameErrors, GetAllRepositoriesByNameResponses, GetAnalyticsActiveVisitorsData, GetAnalyticsActiveVisitorsErrors, GetAnalyticsActiveVisitorsResponses, GetAnalyticsEventsCountData, GetAnalyticsEventsCountErrors, GetAnalyticsEventsCountResponses, GetAnalyticsSessionEventsData, GetAnalyticsSessionEventsErrors, GetAnalyticsSessionEventsResponses, GetAnalyticsVisitorSessionsData, GetAnalyticsVisitorSessionsErrors, GetAnalyticsVisitorSessionsResponses, GetApiKeyData, GetApiKeyErrors, GetApiKeyPermissionsData, GetApiKeyPermissionsErrors, GetApiKeyPermissionsResponses, GetApiKeyResponses, GetAuditLogData, GetAuditLogErrors, GetAuditLogResponses, GetBackupData, GetBackupErrors, GetBackupResponses, GetBackupScheduleData, GetBackupScheduleErrors, GetBackupScheduleResponses, GetBranchesByRepositoryIdData, GetBranchesByRepositoryIdErrors, GetBranchesByRepositoryIdResponses, GetBucketedIncidentsData, GetBucketedIncidentsErrors, GetBucketedIncidentsResponses, GetBucketedStatusData, GetBucketedStatusErrors, GetBucketedStatusResponses, GetChallengeTokenData, GetChallengeTokenErrors, GetChallengeTokenResponses, GetChatReadinessData, GetChatReadinessErrors, GetChatReadinessResponses, GetCliStatusData, GetCliStatusErrors, GetCliStatusResponses, GetClusterHealthData, GetClusterHealthErrors, GetClusterHealthResponses, GetClusterMemberData, GetClusterMemberErrors, GetClusterMemberResponses, GetCmdData, GetCmdErrors, GetCmdResponses, GetContainerDetailData, GetContainerDetailErrors, GetContainerDetailResponses, GetContainerEnvironmentVariableData, GetContainerEnvironmentVariableErrors, GetContainerEnvironmentVariableResponses, GetContainerLogsByIdData, GetContainerLogsByIdErrors, GetContainerLogsData, GetContainerLogsErrors, GetContainerMetricsData, GetContainerMetricsErrors, GetContainerMetricsResponses, GetConversationData, GetConversationDetailData, GetConversationDetailErrors, GetConversationDetailResponses, GetConversationErrors, GetConversationResponses, GetConversationsData, GetConversationsErrors, GetConversationsResponses, GetCronByIdData, GetCronByIdErrors, GetCronByIdResponses, GetCronExecutionsData, GetCronExecutionsErrors, GetCronExecutionsResponses, GetCrossProjectTraceSiblingsData, GetCrossProjectTraceSiblingsErrors, GetCrossProjectTraceSiblingsResponses, GetCurrentMonitorStatusData, GetCurrentMonitorStatusErrors, GetCurrentMonitorStatusResponses, GetCurrentUserData, GetCurrentUserErrors, GetCurrentUserResponses, GetCustomDomainData, GetCustomDomainErrors, GetCustomDomainResponses, GetDashboardData, GetDashboardErrors, GetDashboardProjectsAnalyticsData, GetDashboardProjectsAnalyticsErrors, GetDashboardProjectsAnalyticsResponses, GetDashboardResponses, GetDeliveryData, GetDeliveryErrors, GetDeliveryResponses, GetDeploymentContainerLogContentData, GetDeploymentContainerLogContentErrors, GetDeploymentContainerLogContentResponses, GetDeploymentData, GetDeploymentErrors, GetDeploymentJobLogsData, GetDeploymentJobLogsErrors, GetDeploymentJobLogsResponses, GetDeploymentJobsData, GetDeploymentJobsErrors, GetDeploymentJobsResponses, GetDeploymentOperationsData, GetDeploymentOperationsErrors, GetDeploymentOperationsResponses, GetDeploymentOperationStatusData, GetDeploymentOperationStatusErrors, GetDeploymentOperationStatusResponses, GetDeploymentResponses, GetDeploymentTokenData, GetDeploymentTokenErrors, GetDeploymentTokenResponses, GetDiskStatusData, GetDiskStatusErrors, GetDiskStatusResponses, GetDnsChangesData, GetDnsChangesErrors, GetDnsChangesResponses, GetDnsProviderData, GetDnsProviderErrors, GetDnsProviderResponses, GetDomainByHostData, GetDomainByHostErrors, GetDomainByHostResponses, GetDomainByIdData, GetDomainByIdErrors, GetDomainByIdResponses, GetDomainByNameData, GetDomainByNameErrors, GetDomainByNameResponses, GetDomainData, GetDomainDnsRecordsData, GetDomainDnsRecordsErrors, GetDomainDnsRecordsResponses, GetDomainErrors, GetDomainOrderData, GetDomainOrderErrors, GetDomainOrderResponses, GetDomainResponses, GetEmailData, GetEmailErrors, GetEmailEventsData, GetEmailEventsErrors, GetEmailEventsResponses, GetEmailLinksData, GetEmailLinksErrors, GetEmailLinksResponses, GetEmailProviderData, GetEmailProviderErrors, GetEmailProviderResponses, GetEmailResponses, GetEmailStatsData, GetEmailStatsErrors, GetEmailStatsResponses, GetEmailTrackingData, GetEmailTrackingErrors, GetEmailTrackingResponses, GetEmailTrackingStatusData, GetEmailTrackingStatusErrors, GetEmailTrackingStatusResponses, GetEntityInfoData, GetEntityInfoErrors, GetEntityInfoResponses, GetEnvironmentCronsData, GetEnvironmentCronsErrors, GetEnvironmentCronsResponses, GetEnvironmentData, GetEnvironmentDomainsData, GetEnvironmentDomainsErrors, GetEnvironmentDomainsResponses, GetEnvironmentErrors, GetEnvironmentResponses, GetEnvironmentsData, GetEnvironmentsErrors, GetEnvironmentsResponses, GetEnvironmentVariablesData, GetEnvironmentVariablesErrors, GetEnvironmentVariablesResponses, GetEnvironmentVariableValueData, GetEnvironmentVariableValueErrors, GetEnvironmentVariableValueResponses, GetErrorDashboardStatsData, GetErrorDashboardStatsErrors, GetErrorDashboardStatsResponses, GetErrorEventData, GetErrorEventErrors, GetErrorEventResponses, GetErrorGroupData, GetErrorGroupErrors, GetErrorGroupResponses, GetErrorStatsData, GetErrorStatsErrors, GetErrorStatsResponses, GetErrorTimeSeriesData, GetErrorTimeSeriesErrors, GetErrorTimeSeriesResponses, GetEventDetailData, GetEventDetailErrors, GetEventDetailResponses, GetEventEntriesData, GetEventEntriesErrors, GetEventEntriesResponses, GetEventsCountData, GetEventsCountErrors, GetEventsCountResponses, GetEventsTimelineData, GetEventsTimelineErrors, GetEventsTimelineResponses, GetEventTypeBreakdownData, GetEventTypeBreakdownErrors, GetEventTypeBreakdownResponses, GetEventVisitorsData, GetEventVisitorsErrors, GetEventVisitorsResponses, GetExternalImageData, GetExternalImageErrors, GetExternalImageResponses, GetFileData, GetFileErrors, GetFileResponses, GetFlagData, GetFlagErrors, GetFlagResponses, GetFlagSnapshotData, GetFlagSnapshotErrors, GetFlagSnapshotResponses, GetFunnelMetricsData, GetFunnelMetricsErrors, GetFunnelMetricsResponses, GetGenaiTraceData, GetGenaiTraceErrors, GetGenaiTraceResponses, GetGeneralStatsData, GetGeneralStatsErrors, GetGeneralStatsResponses, GetGitProviderData, GetGitProviderErrors, GetGitProviderResponses, GetGlobalEventsData, GetGlobalEventsErrors, GetGlobalEventsResponses, GetGlobalEventStatsData, GetGlobalEventStatsErrors, GetGlobalEventStatsResponses, GetGlobalMcpData, GetGlobalMcpErrors, GetGlobalMcpResponses, GetGlobalSandboxStatusData, GetGlobalSandboxStatusErrors, GetGlobalSandboxStatusResponses, GetGlobalSkillData, GetGlobalSkillErrors, GetGlobalSkillResponses, GetGroupedPageMetricsData, GetGroupedPageMetricsErrors, GetGroupedPageMetricsResponses, GetHealthData, GetHealthErrors, GetHealthResponses, GetHourlyVisitsData, GetHourlyVisitsErrors, GetHourlyVisitsResponses, GetHttpChallengeDebugData, GetHttpChallengeDebugErrors, GetHttpChallengeDebugResponses, GetImportStatusData, GetImportStatusErrors, GetImportStatusResponses, GetIncidentData, GetIncidentErrors, GetIncidentResponses, GetIncidentUpdatesData, GetIncidentUpdatesErrors, GetIncidentUpdatesResponses, GetIpAccessControlData, GetIpAccessControlErrors, GetIpAccessControlResponses, GetIpGeolocationData, GetIpGeolocationErrors, GetIpGeolocationResponses, GetJoinTokenStatusData, GetJoinTokenStatusErrors, GetJoinTokenStatusResponses, GetLastDeploymentData, GetLastDeploymentErrors, GetLastDeploymentResponses, GetLatestScanData, GetLatestScanErrors, GetLatestScanResponses, GetLatestScansPerEnvironmentData, GetLatestScansPerEnvironmentErrors, GetLatestScansPerEnvironmentResponses, GetLiveVisitorsListData, GetLiveVisitorsListErrors, GetLiveVisitorsListResponses, GetLogContextData, GetLogContextErrors, GetLogContextResponses, GetMcpData, GetMcpErrors, GetMcpResponses, GetMetricsOverTimeData, GetMetricsOverTimeErrors, GetMetricsOverTimeResponses, GetMonitorData, GetMonitorErrors, GetMonitorResponses, GetNotificationProviderData, GetNotificationProviderErrors, GetNotificationProviderResponses, GetOnDemandCertStatusData, GetOnDemandCertStatusErrors, GetOnDemandCertStatusResponses, GetOrCreateDsnData, GetOrCreateDsnErrors, GetOrCreateDsnResponses, GetPageFlowData, GetPageFlowErrors, GetPageFlowResponses, GetPageHourlySessionsData, GetPageHourlySessionsErrors, GetPageHourlySessionsResponses, GetPagePathDetailData, GetPagePathDetailErrors, GetPagePathDetailResponses, GetPagePathsData, GetPagePathsErrors, GetPagePathsResponses, GetPagePathsSparklinesData, GetPagePathsSparklinesErrors, GetPagePathsSparklinesResponses, GetPagePathVisitorsData, GetPagePathVisitorsErrors, GetPagePathVisitorsResponses, GetPendingActionData, GetPendingActionErrors, GetPendingActionResponses, GetPerformanceMetricsData, GetPerformanceMetricsErrors, GetPerformanceMetricsResponses, GetPgUpgradeData, GetPgUpgradeErrors, GetPgUpgradeLogsData, GetPgUpgradeLogsErrors, GetPgUpgradeLogsResponses, GetPgUpgradeResponses, GetPipelineStatsData, GetPipelineStatsErrors, GetPipelineStatsResponses, GetPlatformInfoData, GetPlatformInfoErrors, GetPlatformInfoResponses, GetPostgresWalHealthData, GetPostgresWalHealthErrors, GetPostgresWalHealthResponses, GetPreferencesData, GetPreferencesErrors, GetPreferencesResponses, GetPreviewGatewayLogsData, GetPreviewGatewayLogsResponses, GetPreviewGatewaySettingsData, GetPreviewGatewaySettingsResponses, GetPreviewGatewayStatusData, GetPreviewGatewayStatusResponses, GetPricingData, GetPricingErrors, GetPricingResponses, GetPrivateIpData, GetPrivateIpErrors, GetPrivateIpResponses, GetProjectAlarmsSummaryData, GetProjectAlarmsSummaryErrors, GetProjectAlarmsSummaryResponses, GetProjectBySlugData, GetProjectBySlugErrors, GetProjectBySlugResponses, GetProjectData, GetProjectDeploymentsData, GetProjectDeploymentsErrors, GetProjectDeploymentsResponses, GetProjectErrors, GetProjectResponses, GetProjectsData, GetProjectsErrors, GetProjectServiceEnvironmentVariablesData, GetProjectServiceEnvironmentVariablesErrors, GetProjectServiceEnvironmentVariablesResponses, GetProjectSessionReplaysData, GetProjectSessionReplaysErrors, GetProjectSessionReplaysResponses, GetProjectsHealthData, GetProjectsHealthErrors, GetProjectsHealthResponses, GetProjectsMonitorHealthData, GetProjectsMonitorHealthErrors, GetProjectsMonitorHealthResponses, GetProjectsResponses, GetProjectStatisticsData, GetProjectStatisticsErrors, GetProjectStatisticsResponses, GetProjectTemplateData, GetProjectTemplateErrors, GetProjectTemplateResponses, GetPropertyBreakdownData, GetPropertyBreakdownErrors, GetPropertyBreakdownResponses, GetPropertyTimelineData, GetPropertyTimelineErrors, GetPropertyTimelineResponses, GetProviderConnectionsData, GetProviderConnectionsErrors, GetProviderConnectionsResponses, GetProviderMetadataData, GetProviderMetadataErrors, GetProviderMetadataResponses, GetProvidersMetadataData, GetProvidersMetadataErrors, GetProvidersMetadataResponses, GetProxyLogByIdData, GetProxyLogByIdErrors, GetProxyLogByIdResponses, GetProxyLogByRequestIdData, GetProxyLogByRequestIdErrors, GetProxyLogByRequestIdResponses, GetProxyLogsData, GetProxyLogsErrors, GetProxyLogsResponses, GetPublicBranchesData, GetPublicBranchesErrors, GetPublicBranchesResponses, GetPublicIpData, GetPublicIpErrors, GetPublicIpResponses, GetPublicRepositoryData, GetPublicRepositoryErrors, GetPublicRepositoryResponses, GetQueryContainerInfoData, GetQueryContainerInfoErrors, GetQueryContainerInfoResponses, GetQuotaData, GetQuotaErrors, GetQuotaResponses, GetRecentActivityData, GetRecentActivityErrors, GetRecentActivityResponses, GetRemoteExternalImageData, GetRemoteExternalImageErrors, GetRemoteExternalImageResponses, GetRepositoryBranchesData, GetRepositoryBranchesErrors, GetRepositoryBranchesResponses, GetRepositoryByIdData, GetRepositoryByIdErrors, GetRepositoryByIdResponses, GetRepositoryByNameData, GetRepositoryByNameErrors, GetRepositoryByNameResponses, GetRepositoryPresetByNameData, GetRepositoryPresetByNameErrors, GetRepositoryPresetByNameResponses, GetRepositoryPresetLiveData, GetRepositoryPresetLiveErrors, GetRepositoryPresetLiveResponses, GetRepositoryTagsData, GetRepositoryTagsErrors, GetRepositoryTagsResponses, GetResolvedEnvironmentVariablesData, GetResolvedEnvironmentVariablesErrors, GetResolvedEnvironmentVariablesResponses, GetResolvedEnvironmentVariableValueData, GetResolvedEnvironmentVariableValueErrors, GetResolvedEnvironmentVariableValueResponses, GetRestoreCapabilitiesData, GetRestoreCapabilitiesErrors, GetRestoreCapabilitiesResponses, GetRestoreRunData, GetRestoreRunErrors, GetRestoreRunResponses, GetRouteData, GetRouteErrors, GetRouteResponses, GetRunData, GetRunErrors, GetRunResponses, GetRunWithLogsData, GetRunWithLogsErrors, GetRunWithLogsResponses, GetS3CredentialsData, GetS3CredentialsErrors, GetS3CredentialsResponses, GetS3SourceData, GetS3SourceErrors, GetS3SourceResponses, GetSandboxData, GetSandboxErrors, GetSandboxResponses, GetSandboxStatusData, GetSandboxStatusErrors, GetSandboxStatusResponses, GetScanByDeploymentData, GetScanByDeploymentErrors, GetScanByDeploymentResponses, GetScanData, GetScanErrors, GetScanResponses, GetScanVulnerabilitiesData, GetScanVulnerabilitiesErrors, GetScanVulnerabilitiesResponses, GetServiceBySlugData, GetServiceBySlugErrors, GetServiceBySlugResponses, GetServiceData, GetServiceEnvironmentVariableData, GetServiceEnvironmentVariableErrors, GetServiceEnvironmentVariableResponses, GetServiceEnvironmentVariablesData, GetServiceEnvironmentVariablesErrors, GetServiceEnvironmentVariablesResponses, GetServiceErrors, GetServiceHealthStatusData, GetServiceHealthStatusErrors, GetServiceHealthStatusResponses, GetServicePreviewEnvironmentVariableNamesData, GetServicePreviewEnvironmentVariableNamesErrors, GetServicePreviewEnvironmentVariableNamesResponses, GetServicePreviewEnvironmentVariablesMaskedData, GetServicePreviewEnvironmentVariablesMaskedErrors, GetServicePreviewEnvironmentVariablesMaskedResponses, GetServiceResponses, GetServiceRuntimeData, GetServiceRuntimeErrors, GetServiceRuntimeResponses, GetServiceStatsData, GetServiceStatsErrors, GetServiceStatsResponses, GetServiceTypeParametersData, GetServiceTypeParametersErrors, GetServiceTypeParametersResponses, GetServiceTypesData, GetServiceTypesErrors, GetServiceTypesResponses, GetSessionDetailsData, GetSessionDetailsErrors, GetSessionDetailsResponses, GetSessionEventsData, GetSessionEventsErrors, GetSessionEventsResponses, GetSessionLogsData, GetSessionLogsErrors, GetSessionLogsResponses, GetSessionReplayData, GetSessionReplayErrors, GetSessionReplayEventsData, GetSessionReplayEventsErrors, GetSessionReplayEventsResponses, GetSessionReplayResponses, GetSettingsData, GetSettingsErrors, GetSettingsResponses, GetSkillData, GetSkillErrors, GetSkillResponses, GetSlowQueriesData, GetSlowQueriesErrors, GetSlowQueriesResponses, GetStaticBundleData, GetStaticBundleErrors, GetStaticBundleResponses, GetStatusOverviewData, GetStatusOverviewErrors, GetStatusOverviewResponses, GetTagsByRepositoryIdData, GetTagsByRepositoryIdErrors, GetTagsByRepositoryIdResponses, GetTeamData, GetTeamErrors, GetTeamResponses, GetTimeBucketStatsData, GetTimeBucketStatsErrors, GetTimeBucketStatsResponses, GetTodayStatsData, GetTodayStatsErrors, GetTodayStatsResponses, GetTraceData, GetTraceErrors, GetTraceResponses, GetUnifiedTraceData, GetUnifiedTraceErrors, GetUnifiedTraceResponses, GetUniqueCountsData, GetUniqueCountsErrors, GetUniqueCountsResponses, GetUniqueEventsData, GetUniqueEventsErrors, GetUniqueEventsResponses, GetUpdateCapabilityData, GetUpdateCapabilityErrors, GetUpdateCapabilityResponses, GetUpdateStatusData, GetUpdateStatusErrors, GetUpdateStatusResponses, GetUptimeHistoryData, GetUptimeHistoryErrors, GetUptimeHistoryResponses, GetUsageByProviderData, GetUsageByProviderErrors, GetUsageByProviderResponses, GetUsageRecentData, GetUsageRecentErrors, GetUsageRecentResponses, GetUsageSummaryData, GetUsageSummaryErrors, GetUsageSummaryResponses, GetUsageTimeseriesData, GetUsageTimeseriesErrors, GetUsageTimeseriesResponses, GetUsageTopModelsData, GetUsageTopModelsErrors, GetUsageTopModelsResponses, GetVisitorByGuidData, GetVisitorByGuidErrors, GetVisitorByGuidResponses, GetVisitorByIdData, GetVisitorByIdErrors, GetVisitorByIdResponses, GetVisitorDetailsData, GetVisitorDetailsErrors, GetVisitorDetailsResponses, GetVisitorFacetsData, GetVisitorFacetsErrors, GetVisitorFacetsResponses, GetVisitorInfoData, GetVisitorInfoErrors, GetVisitorInfoResponses, GetVisitorJourneyData, GetVisitorJourneyErrors, GetVisitorJourneyResponses, GetVisitorsData, GetVisitorsErrors, GetVisitorSessionsData, GetVisitorSessionsErrors, GetVisitorSessionsResponses, GetVisitorsResponses, GetVisitorStatsData, GetVisitorStatsErrors, GetVisitorStatsResponses, GetWebhookData, GetWebhookErrors, GetWebhookResponses, GrantProjectAccessData, GrantProjectAccessErrors, GrantProjectAccessResponses, HandleGitProviderOauthCallbackData, HandleGitProviderOauthCallbackErrors, HasAnalyticsEventsData, HasAnalyticsEventsErrors, HasAnalyticsEventsResponses, HasErrorGroupsData, HasErrorGroupsErrors, HasErrorGroupsResponses, HasPerformanceMetricsData, HasPerformanceMetricsErrors, HasPerformanceMetricsResponses, ImportExternalServiceData, ImportExternalServiceErrors, ImportExternalServiceResponses, IngestLogsByPathData, IngestLogsByPathErrors, IngestLogsByPathResponses, IngestLogsData, IngestLogsErrors, IngestLogsResponses, IngestMetricsByPathData, IngestMetricsByPathErrors, IngestMetricsByPathResponses, IngestMetricsData, IngestMetricsErrors, IngestMetricsResponses, IngestSentryEnvelopeData, IngestSentryEnvelopeErrors, IngestSentryEnvelopeResponses, IngestSentryEventData, IngestSentryEventErrors, IngestSentryEventResponses, IngestTracesByPathData, IngestTracesByPathErrors, IngestTracesByPathResponses, IngestTracesData, IngestTracesErrors, IngestTracesResponses, InitSessionReplayData, InitSessionReplayErrors, InitSessionReplayResponses, InspectDropArchiveData, InspectDropArchiveErrors, InspectDropArchiveResponses, JobLogsData, JobLogsErrors, JobLogsResponses, JobStatusData, JobStatusErrors, JobStatusResponses, KillJobData, KillJobErrors, KillJobResponses, KvDelData, KvDelErrors, KvDelResponses, KvDisableData, KvDisableErrors, KvDisableResponses, KvEnableData, KvEnableErrors, KvEnableResponses, KvExpireData, KvExpireErrors, KvExpireResponses, KvGetData, KvGetErrors, KvGetResponses, KvIncrData, KvIncrErrors, KvIncrResponses, KvKeysData, KvKeysErrors, KvKeysResponses, KvSetData, KvSetErrors, KvSetResponses, KvStatusData, KvStatusErrors, KvStatusResponses, KvTtlData, KvTtlErrors, KvTtlResponses, KvUpdateData, KvUpdateErrors, KvUpdateResponses, LatestRunForSourceData, LatestRunForSourceErrors, LatestRunForSourceResponses, LinkCustomDomainToCertificateData, LinkCustomDomainToCertificateErrors, LinkCustomDomainToCertificateResponses, LinkServiceToProjectData, LinkServiceToProjectErrors, LinkServiceToProjectResponses, ListAgentRunsData, ListAgentRunsErrors, ListAgentRunsResponses, ListAgentsData, ListAgentsErrors, ListAgentsResponses, ListAiProvidersData, ListAiProvidersErrors, ListAiProvidersResponses, ListAlertRulesData, ListAlertRulesErrors, ListAlertRulesResponses, ListAlertsData, ListAlertsErrors, ListAlertsResponses, ListAllConversationsData, ListAllConversationsErrors, ListAllConversationsResponses, ListAllRunsData, ListAllRunsErrors, ListAllRunsResponses, ListApiKeysData, ListApiKeysErrors, ListApiKeysResponses, ListAuditLogsData, ListAuditLogsErrors, ListAuditLogsResponses, ListAvailableContainersData, ListAvailableContainersErrors, ListAvailableContainersResponses, ListBackupAlertsData, ListBackupAlertsErrors, ListBackupAlertsResponses, ListBackupChildrenData, ListBackupChildrenErrors, ListBackupChildrenResponses, ListBackupSchedulesData, ListBackupSchedulesErrors, ListBackupSchedulesResponses, ListBackupsForScheduleData, ListBackupsForScheduleErrors, ListBackupsForScheduleResponses, ListCommitsByRepositoryIdData, ListCommitsByRepositoryIdErrors, ListCommitsByRepositoryIdResponses, ListConnectionsData, ListConnectionsErrors, ListConnectionsResponses, ListContainersAtPathData, ListContainersAtPathErrors, ListContainersAtPathResponses, ListContainersData, ListContainersErrors, ListContainersResponses, ListConversationsData, ListConversationsErrors, ListConversationsResponses, ListCustomDomainsForProjectData, ListCustomDomainsForProjectErrors, ListCustomDomainsForProjectResponses, ListDashboardsData, ListDashboardsErrors, ListDashboardsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDeploymentContainerLogsData, ListDeploymentContainerLogsErrors, ListDeploymentContainerLogsResponses, ListDeploymentTokensData, ListDeploymentTokensErrors, ListDeploymentTokensResponses, ListDnsProvidersData, ListDnsProvidersErrors, ListDnsProvidersResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListDsnsData, ListDsnsErrors, ListDsnsResponses, ListEmailDomainsData, ListEmailDomainsErrors, ListEmailDomainsResponses, ListEmailProvidersData, ListEmailProvidersErrors, ListEmailProvidersResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEnrollmentTokensData, ListEnrollmentTokensErrors, ListEnrollmentTokensResponses, ListEntitiesData, ListEntitiesErrors, ListEntitiesResponses, ListErrorEventsData, ListErrorEventsErrors, ListErrorEventsResponses, ListErrorGroupsData, ListErrorGroupsErrors, ListErrorGroupsResponses, ListEventsData, ListEventsResponses, ListEventTypesData, ListEventTypesResponses, ListExternalImagesData, ListExternalImagesErrors, ListExternalImagesResponses, ListExternalPluginsData, ListExternalPluginsErrors, ListExternalPluginsResponses, ListExternalServiceBackupsData, ListExternalServiceBackupsErrors, ListExternalServiceBackupsResponses, ListFlagsData, ListFlagsErrors, ListFlagsResponses, ListFunnelsData, ListFunnelsErrors, ListFunnelsResponses, ListGitProvidersData, ListGitProvidersErrors, ListGitProvidersResponses, ListGlobalMcpsData, ListGlobalMcpsErrors, ListGlobalMcpsResponses, ListGlobalSkillsData, ListGlobalSkillsErrors, ListGlobalSkillsResponses, ListIncidentsData, ListIncidentsErrors, ListIncidentsResponses, ListInsightsData, ListInsightsErrors, ListInsightsResponses, ListIpAccessControlData, ListIpAccessControlErrors, ListIpAccessControlResponses, ListJobsData, ListJobsErrors, ListJobsResponses, ListKnownAiAgentsData, ListKnownAiAgentsErrors, ListKnownAiAgentsResponses, ListManagedDomainsData, ListManagedDomainsErrors, ListManagedDomainsResponses, ListMcpsData, ListMcpsErrors, ListMcpsResponses, ListMetricLabelKeysData, ListMetricLabelKeysErrors, ListMetricLabelKeysResponses, ListMetricLabelValuesData, ListMetricLabelValuesErrors, ListMetricLabelValuesResponses, ListMetricNamesData, ListMetricNamesErrors, ListMetricNamesResponses, ListModelsData, ListModelsErrors, ListModelsResponses, ListMonitorsData, ListMonitorsErrors, ListMonitorsResponses, ListNotificationProvidersData, ListNotificationProvidersErrors, ListNotificationProvidersResponses, ListOidcProvidersData, ListOidcProvidersResponses, ListOidcProviderUsersData, ListOidcProviderUsersErrors, ListOidcProviderUsersResponses, ListOidcRoleMappingsData, ListOidcRoleMappingsResponses, ListOnDemandCertsData, ListOnDemandCertsErrors, ListOnDemandCertsResponses, ListOrdersData, ListOrdersErrors, ListOrdersResponses, ListPeersData, ListPeersErrors, ListPeersResponses, ListPendingActionsData, ListPendingActionsErrors, ListPendingActionsResponses, ListPgUpgradesData, ListPgUpgradesErrors, ListPgUpgradesResponses, ListPresetsData, ListPresetsErrors, ListPresetsResponses, ListProjectAccessData, ListProjectAccessErrors, ListProjectAccessResponses, ListProjectAlarmsData, ListProjectAlarmsErrors, ListProjectAlarmsResponses, ListProjectScansData, ListProjectScansErrors, ListProjectScansResponses, ListProjectSecretsData, ListProjectSecretsErrors, ListProjectSecretsResponses, ListProjectServicesData, ListProjectServicesErrors, ListProjectServicesResponses, ListProjectTemplatesData, ListProjectTemplatesErrors, ListProjectTemplatesResponses, ListProjectTemplateTagsData, ListProjectTemplateTagsErrors, ListProjectTemplateTagsResponses, ListProviderKeysData, ListProviderKeysErrors, ListProviderKeysResponses, ListProviderZonesData, ListProviderZonesErrors, ListProviderZonesResponses, ListPublicProvidersData, ListPublicProvidersResponses, ListReleaseFilesData, ListReleaseFilesErrors, ListReleaseFilesResponses, ListReleasesData, ListReleasesErrors, ListReleasesResponses, ListRemoteExternalImagesData, ListRemoteExternalImagesErrors, ListRemoteExternalImagesResponses, ListRepositoriesByConnectionData, ListRepositoriesByConnectionErrors, ListRepositoriesByConnectionResponses, ListRepositoriesByProviderData, ListRepositoriesByProviderErrors, ListRepositoriesByProviderResponses, ListRestoreRunsForServiceData, ListRestoreRunsForServiceResponses, ListRootContainersData, ListRootContainersErrors, ListRootContainersResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListS3SourcesData, ListS3SourcesErrors, ListS3SourcesResponses, ListSandboxesData, ListSandboxesResponses, ListScheduleRunJobsData, ListScheduleRunJobsErrors, ListScheduleRunJobsResponses, ListScheduleRunsData, ListScheduleRunsErrors, ListScheduleRunsResponses, ListScheduleServicesData, ListScheduleServicesErrors, ListScheduleServicesResponses, ListSecretsData, ListSecretsErrors, ListSecretsResponses, ListServiceHealthStatusesData, ListServiceHealthStatusesErrors, ListServiceHealthStatusesResponses, ListServiceProjectsData, ListServiceProjectsErrors, ListServiceProjectsResponses, ListServiceSchedulesData, ListServiceSchedulesErrors, ListServiceSchedulesResponses, ListServicesData, ListServicesErrors, ListServicesResponses, ListSkillsData, ListSkillsErrors, ListSkillsResponses, ListSourceBackupsData, ListSourceBackupsErrors, ListSourceBackupsResponses, ListSourceFilesData, ListSourceFilesErrors, ListSourceFilesResponses, ListSourceMapsData, ListSourceMapsErrors, ListSourceMapsResponses, ListSourcesData, ListSourcesErrors, ListSourcesResponses, ListStaticBundlesData, ListStaticBundlesErrors, ListStaticBundlesResponses, ListSyncedRepositoriesData, ListSyncedRepositoriesErrors, ListSyncedRepositoriesResponses, ListTeamMembersData, ListTeamMembersErrors, ListTeamMembersResponses, ListTeamProjectsData, ListTeamProjectsErrors, ListTeamProjectsResponses, ListTeamsData, ListTeamsErrors, ListTeamsResponses, ListUsersData, ListUsersErrors, ListUsersResponses, ListWebhooksData, ListWebhooksErrors, ListWebhooksResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutErrors, LogoutResponses, LookupDnsARecordsData, LookupDnsARecordsErrors, LookupDnsARecordsResponses, MintEnrollmentTokenData, MintEnrollmentTokenErrors, MintEnrollmentTokenResponses, MkdirData, MkdirErrors, MkdirResponses, NodeHeartbeatData, NodeHeartbeatErrors, NodeHeartbeatResponses, NodeMetricsGetRangeData, NodeMetricsGetRangeErrors, NodeMetricsGetRangeResponses, ObservabilityFullEventData, ObservabilityFullEventErrors, ObservabilityFullEventResponses, ObservabilityListEventsData, ObservabilityListEventsErrors, ObservabilityListEventsResponses, OidcCallbackData, PatchAdminGateData, PatchAdminGateErrors, PatchAdminGateResponses, PatchPreviewGatewaySettingsData, PatchPreviewGatewaySettingsResponses, PauseDeploymentData, PauseDeploymentErrors, PauseDeploymentResponses, PauseSandboxData, PauseSandboxErrors, PauseSandboxResponses, PlanRestoreData, PlanRestoreErrors, PlanRestoreResponses, PostDnsAckData, PostDnsAckErrors, PostDnsAckResponses, PreviewAlertData, PreviewAlertErrors, PreviewAlertResponses, PreviewFunnelMetricsData, PreviewFunnelMetricsErrors, PreviewFunnelMetricsResponses, PreviewHostnameModeData, PreviewHostnameModeErrors, PreviewHostnameModeResponses, PromoteClusterMemberData, PromoteClusterMemberErrors, PromoteClusterMemberResponses, PromoteDeploymentData, PromoteDeploymentErrors, PromoteDeploymentResponses, ProvisionDomainData, ProvisionDomainErrors, ProvisionDomainResponses, PurgeProjectLogsData, PurgeProjectLogsErrors, PurgeProjectLogsResponses, PushExternalImageData, PushExternalImageErrors, PushExternalImageResponses, QueryDataData, QueryDataErrors, QueryDataResponses, QueryGenaiTracesData, QueryGenaiTracesErrors, QueryGenaiTracesResponses, QueryLogsData, QueryLogsErrors, QueryLogsResponses, QueryMetricsData, QueryMetricsErrors, QueryMetricsResponses, QuerySpanStatsData, QuerySpanStatsErrors, QuerySpanStatsResponses, QueryTracesData, QueryTracesErrors, QueryTracesResponses, QueryTraceSummariesData, QueryTraceSummariesErrors, QueryTraceSummariesResponses, ReadEntityRowsData, ReadEntityRowsErrors, ReadEntityRowsResponses, ReadFileData, ReadFileErrors, ReadFileResponses, ReAnalyzeData, ReAnalyzeErrors, ReAnalyzeResponses, RecordConsoleEventData, RecordConsoleEventErrors, RecordConsoleEventResponses, RecordEventMetricsData, RecordEventMetricsErrors, RecordEventMetricsResponses, RecordFlagExposureData, RecordFlagExposureErrors, RecordFlagExposureResponses, RecordSpeedMetricsData, RecordSpeedMetricsErrors, RecordSpeedMetricsResponses, RefreshRouteTableData, RefreshRouteTableErrors, RefreshRouteTableResponses, RegenerateDsnData, RegenerateDsnErrors, RegenerateDsnResponses, RegisterExternalImageData, RegisterExternalImageErrors, RegisterExternalImageResponses, RegisterNodeData, RegisterNodeErrors, RegisterNodeResponses, ReinstallGitlabWebhookData, ReinstallGitlabWebhookErrors, ReinstallGitlabWebhookResponses, RejectPendingActionData, RejectPendingActionErrors, RejectPendingActionResponses, ReloadPluginsData, ReloadPluginsErrors, ReloadPluginsResponses, RemoveClusterMemberData, RemoveClusterMemberErrors, RemoveClusterMemberResponses, RemoveManagedDomainData, RemoveManagedDomainErrors, RemoveManagedDomainResponses, RemoveRoleData, RemoveRoleErrors, RemoveRoleResponses, RemoveTeamMemberData, RemoveTeamMemberErrors, RemoveTeamMemberResponses, RenameConversationData, RenameConversationErrors, RenameConversationResponses, RenewDomainData, RenewDomainErrors, RenewDomainResponses, RequestPasswordResetData, RequestPasswordResetErrors, RequestPasswordResetResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, ResizeSandboxData, ResizeSandboxErrors, ResizeSandboxResponses, ResolveAlarmData, ResolveAlarmErrors, ResolveAlarmResponses, RestartContainerData, RestartContainerErrors, RestartContainerResponses, RestartPreviewGatewayData, RestartPreviewGatewayResponses, RestartSandboxData, RestartSandboxErrors, RestartSandboxResponses, RestoreFlagData, RestoreFlagErrors, RestoreFlagResponses, RestoreUserData, RestoreUserErrors, RestoreUserResponses, ResumeDeploymentData, ResumeDeploymentErrors, ResumeDeploymentResponses, ResumeSandboxData, ResumeSandboxErrors, ResumeSandboxResponses, RetryClusterData, RetryClusterErrors, RetryClusterResponses, RetryDeliveryData, RetryDeliveryErrors, RetryDeliveryResponses, RetryPgUpgradeData, RetryPgUpgradeErrors, RetryPgUpgradeResponses, RetryRunData, RetryRunErrors, RetryRunResponses, RevealGlobalMcpConfigData, RevealGlobalMcpConfigErrors, RevealGlobalMcpConfigResponses, RevealMcpConfigData, RevealMcpConfigErrors, RevealMcpConfigResponses, RevealNotificationProviderConfigData, RevealNotificationProviderConfigErrors, RevealNotificationProviderConfigResponses, RevealServiceParameterData, RevealServiceParameterErrors, RevealServiceParameterResponses, RevenueCreateIntegrationData, RevenueCreateIntegrationErrors, RevenueCreateIntegrationResponses, RevenueDeleteIntegrationData, RevenueDeleteIntegrationResponses, RevenueGlobalEventsData, RevenueGlobalEventsResponses, RevenueImportInvoicesCsvData, RevenueImportInvoicesCsvErrors, RevenueImportInvoicesCsvResponses, RevenueImportSubscriptionsCsvData, RevenueImportSubscriptionsCsvErrors, RevenueImportSubscriptionsCsvResponses, RevenueListIntegrationsData, RevenueListIntegrationsResponses, RevenueListProvidersData, RevenueListProvidersResponses, RevenueMetricsCustomersData, RevenueMetricsCustomersResponses, RevenueMetricsGlobalMrrData, RevenueMetricsGlobalMrrResponses, RevenueMetricsGlobalSummaryData, RevenueMetricsGlobalSummaryResponses, RevenueMetricsMrrData, RevenueMetricsMrrResponses, RevenueMetricsSummaryData, RevenueMetricsSummaryResponses, RevenueRecentEventsData, RevenueRecentEventsResponses, RevenueRotateTokenData, RevenueRotateTokenResponses, RevenueUpdateConfigData, RevenueUpdateConfigErrors, RevenueUpdateConfigResponses, RevenueUpdateSecretData, RevenueUpdateSecretErrors, RevenueUpdateSecretResponses, RevokeDsnData, RevokeDsnErrors, RevokeDsnResponses, RevokeEnrollmentTokenData, RevokeEnrollmentTokenErrors, RevokeEnrollmentTokenResponses, RevokeJoinTokenData, RevokeJoinTokenErrors, RevokeJoinTokenResponses, RevokeProjectAccessData, RevokeProjectAccessErrors, RevokeProjectAccessResponses, RollbackPgUpgradeData, RollbackPgUpgradeErrors, RollbackPgUpgradeResponses, RollbackToDeploymentData, RollbackToDeploymentErrors, RollbackToDeploymentResponses, RootfsGcData, RootfsGcResponses, RootfsReportData, RootfsReportResponses, RotateApiKeyData, RotateApiKeyErrors, RotateApiKeyResponses, RotateDeploymentTokenData, RotateDeploymentTokenErrors, RotateDeploymentTokenResponses, RunBackupForSourceData, RunBackupForSourceErrors, RunBackupForSourceResponses, RunConnectionHealthCheckData, RunConnectionHealthCheckErrors, RunConnectionHealthCheckResponses, RunExternalServiceBackupData, RunExternalServiceBackupErrors, RunExternalServiceBackupResponses, RunScheduleNowData, RunScheduleNowErrors, RunScheduleNowResponses, SandboxCreatePreviewLinkData, SandboxCreatePreviewLinkErrors, SandboxCreatePreviewLinkResponses, SaveAgentTokenData, SaveAgentTokenErrors, SaveAgentTokenResponses, SaveAiProviderCredentialData, SaveAiProviderCredentialErrors, SaveAiProviderCredentialResponses, SearchLogsData, SearchLogsErrors, SearchLogsResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetAiDataAccessData, SetAiDataAccessErrors, SetAiDataAccessResponses, SetDefaultS3SourceData, SetDefaultS3SourceErrors, SetDefaultS3SourceResponses, SetFlagEnvironmentData, SetFlagEnvironmentErrors, SetFlagEnvironmentResponses, SetPreviewPasswordData, SetPreviewPasswordErrors, SetPreviewPasswordResponses, SetupDnsChallengeData, SetupDnsChallengeErrors, SetupDnsChallengeResponses, SetupDnsData, SetupDnsErrors, SetupDnsResponses, SetupEmailTrackingData, SetupEmailTrackingErrors, SetupEmailTrackingResponses, SetupMfaData, SetupMfaErrors, SetupMfaResponses, SleepEnvironmentData, SleepEnvironmentErrors, SleepEnvironmentResponses, SmokeTestAgentData, SmokeTestAgentErrors, SmokeTestAgentResponses, SourceSandboxData, SourceSandboxErrors, SourceSandboxResponses, StartAnalysisData, StartAnalysisErrors, StartAnalysisResponses, StartContainerData, StartContainerErrors, StartContainerResponses, StartFixData, StartFixErrors, StartFixResponses, StartGitProviderOauthData, StartGitProviderOauthErrors, StartOidcLoginBySlugData, StartOidcLoginBySlugErrors, StartPgUpgradeData, StartPgUpgradeErrors, StartPgUpgradeResponses, StartRestoreData, StartRestoreErrors, StartRestoreResponses, StartServiceData, StartServiceErrors, StartServiceResponses, StartUpdateData, StartUpdateErrors, StartUpdateResponses, StatPathData, StatPathErrors, StatPathResponses, StopContainerData, StopContainerErrors, StopContainerResponses, StopSandboxData, StopSandboxErrors, StopSandboxResponses, StopServiceData, StopServiceErrors, StopServiceResponses, StreamContainerMetricsData, StreamContainerMetricsErrors, StreamContainerMetricsResponses, StreamEventsData, StreamEventsErrors, StreamEventsResponses, StreamRunEventsData, StreamRunEventsErrors, StreamRunEventsResponses, SyncRepositoriesData, SyncRepositoriesErrors, SyncRepositoriesResponses, TailDeploymentJobLogsData, TailDeploymentJobLogsErrors, TailLogsData, TailLogsErrors, TailLogsResponses, TeardownDeploymentData, TeardownDeploymentErrors, TeardownDeploymentResponses, TeardownEnvironmentData, TeardownEnvironmentErrors, TeardownEnvironmentResponses, TestNotificationProviderData, TestNotificationProviderErrors, TestNotificationProviderResponses, TestOidcProviderData, TestOidcProviderResponses, TestProviderConnectionData, TestProviderConnectionErrors, TestProviderConnectionResponses, TestProviderData, TestProviderErrors, TestProviderKeyByIdData, TestProviderKeyByIdErrors, TestProviderKeyByIdResponses, TestProviderKeyInlineData, TestProviderKeyInlineErrors, TestProviderKeyInlineResponses, TestProviderResponses, TestS3ConnectionPreviewData, TestS3ConnectionPreviewErrors, TestS3ConnectionPreviewResponses, TestS3SourceConnectionData, TestS3SourceConnectionErrors, TestS3SourceConnectionResponses, TrackClickData, TrackClickErrors, TrackOpenData, TrackOpenErrors, TrackOpenResponses, TriggerAgentData, TriggerAgentErrors, TriggerAgentResponses, TriggerProjectPipelineData, TriggerProjectPipelineErrors, TriggerProjectPipelineResponses, TriggerScanData, TriggerScanErrors, TriggerScanResponses, TriggerServiceHealthCheckData, TriggerServiceHealthCheckErrors, TriggerServiceHealthCheckResponses, TriggerWeeklyDigestData, TriggerWeeklyDigestErrors, TriggerWeeklyDigestResponses, UnlinkServiceFromProjectData, UnlinkServiceFromProjectErrors, UnlinkServiceFromProjectResponses, UpdateAgentData, UpdateAgentErrors, UpdateAgentResponses, UpdateAiProviderData, UpdateAiProviderErrors, UpdateAiProviderResponses, UpdateAlertData, UpdateAlertErrors, UpdateAlertResponses, UpdateAlertRuleData, UpdateAlertRuleErrors, UpdateAlertRuleResponses, UpdateApiKeyData, UpdateApiKeyErrors, UpdateApiKeyResponses, UpdateAutomaticDeployData, UpdateAutomaticDeployErrors, UpdateAutomaticDeployResponses, UpdateBackupScheduleData, UpdateBackupScheduleErrors, UpdateBackupScheduleResponses, UpdateCloudflareProviderData, UpdateCloudflareProviderErrors, UpdateCloudflareProviderResponses, UpdateConnectionTokenData, UpdateConnectionTokenErrors, UpdateConnectionTokenResponses, UpdateCustomDomainData, UpdateCustomDomainErrors, UpdateCustomDomainResponses, UpdateDashboardData, UpdateDashboardErrors, UpdateDashboardResponses, UpdateDeploymentTokenData, UpdateDeploymentTokenErrors, UpdateDeploymentTokenResponses, UpdateEmailProviderData, UpdateEmailProviderErrors, UpdateEmailProviderResponses, UpdateEnvironmentSettingsData, UpdateEnvironmentSettingsErrors, UpdateEnvironmentSettingsResponses, UpdateEnvironmentSubdomainData, UpdateEnvironmentSubdomainErrors, UpdateEnvironmentSubdomainResponses, UpdateEnvironmentVariableData, UpdateEnvironmentVariableErrors, UpdateEnvironmentVariableResponses, UpdateErrorGroupData, UpdateErrorGroupErrors, UpdateErrorGroupResponses, UpdateFlagData, UpdateFlagErrors, UpdateFlagResponses, UpdateFunnelData, UpdateFunnelErrors, UpdateFunnelResponses, UpdateGitProviderCredentialsData, UpdateGitProviderCredentialsErrors, UpdateGitProviderCredentialsResponses, UpdateGitSettingsData, UpdateGitSettingsErrors, UpdateGitSettingsResponses, UpdateGlobalMcpData, UpdateGlobalMcpErrors, UpdateGlobalMcpResponses, UpdateGlobalSkillData, UpdateGlobalSkillErrors, UpdateGlobalSkillResponses, UpdateIncidentStatusData, UpdateIncidentStatusErrors, UpdateIncidentStatusResponses, UpdateIpAccessControlData, UpdateIpAccessControlErrors, UpdateIpAccessControlResponses, UpdateManagedDomainData, UpdateManagedDomainErrors, UpdateManagedDomainResponses, UpdateMcpData, UpdateMcpErrors, UpdateMcpResponses, UpdateNotificationEmailProviderData, UpdateNotificationEmailProviderErrors, UpdateNotificationEmailProviderResponses, UpdateNotificationProviderData, UpdateNotificationProviderErrors, UpdateNotificationProviderResponses, UpdateOidcProviderData, UpdateOidcProviderResponses, UpdatePreferencesData, UpdatePreferencesErrors, UpdatePreferencesResponses, UpdateProjectData, UpdateProjectDeploymentConfigData, UpdateProjectDeploymentConfigErrors, UpdateProjectDeploymentConfigResponses, UpdateProjectErrors, UpdateProjectResponses, UpdateProjectSecretData, UpdateProjectSecretErrors, UpdateProjectSecretResponses, UpdateProjectSettingsData, UpdateProjectSettingsErrors, UpdateProjectSettingsResponses, UpdateProviderData, UpdateProviderErrors, UpdateProviderKeyData, UpdateProviderKeyErrors, UpdateProviderKeyResponses, UpdateProviderResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateS3SourceData, UpdateS3SourceErrors, UpdateS3SourceResponses, UpdateSelfData, UpdateSelfErrors, UpdateSelfResponses, UpdateServiceData, UpdateServiceErrors, UpdateServiceResourcesData, UpdateServiceResourcesErrors, UpdateServiceResourcesResponses, UpdateServiceResponses, UpdateSessionDurationData, UpdateSessionDurationErrors, UpdateSessionDurationResponses, UpdateSettingsData, UpdateSettingsErrors, UpdateSettingsResponses, UpdateSkillData, UpdateSkillErrors, UpdateSkillResponses, UpdateSlackProviderData, UpdateSlackProviderErrors, UpdateSlackProviderResponses, UpdateSpeedMetricsData, UpdateSpeedMetricsErrors, UpdateSpeedMetricsResponses, UpdateTeamData, UpdateTeamErrors, UpdateTeamMemberRoleData, UpdateTeamMemberRoleErrors, UpdateTeamMemberRoleResponses, UpdateTeamResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateWebhookData, UpdateWebhookErrors, UpdateWebhookProviderData, UpdateWebhookProviderErrors, UpdateWebhookProviderResponses, UpdateWebhookResponses, UpgradePreviewGatewayData, UpgradePreviewGatewayResponses, UpgradeServiceData, UpgradeServiceErrors, UpgradeServiceResponses, UploadGlobalSkillData, UploadGlobalSkillErrors, UploadGlobalSkillResponses, UploadReleaseFileData, UploadReleaseFileErrors, UploadReleaseFileResponses, UploadSkillData, UploadSkillErrors, UploadSkillResponses, UploadSourceFileData, UploadSourceFileErrors, UploadSourceFileResponses, UploadSourceMapData, UploadSourceMapErrors, UploadSourceMapResponses, UploadStaticBundleData, UploadStaticBundleErrors, UploadStaticBundleResponses, UpsertSecretData, UpsertSecretErrors, UpsertSecretResponses, ValidateConnectionData, ValidateConnectionErrors, ValidateConnectionResponses, ValidateEmailData, ValidateEmailErrors, ValidateEmailResponses, VerifyAndEnableMfaData, VerifyAndEnableMfaErrors, VerifyAndEnableMfaResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses, VerifyEmailData, VerifyEmailErrors, VerifyEmailResponses, VerifyManagedDomainData, VerifyManagedDomainErrors, VerifyManagedDomainResponses, VerifyMfaChallengeData, VerifyMfaChallengeErrors, VerifyMfaChallengeResponses, VerifyStepUpData, VerifyStepUpErrors, VerifyStepUpResponses, WakeEnvironmentData, WakeEnvironmentErrors, WakeEnvironmentResponses, WebhookTriggerData, WebhookTriggerErrors, WebhookTriggerResponses, WorkflowDryRunData, WorkflowDryRunErrors, WorkflowDryRunResponses, WriteFileData, WriteFileErrors, WriteFileResponses, WriteFilesData, WriteFilesErrors, WriteFilesResponses } from './types.gen'; export type Options = Options2 & { /** @@ -7288,6 +7288,33 @@ export const downloadGlobalSkillArchive = ...options }); +/** + * Report whether a release update can be applied from the console. + */ +export const getUpdateCapability = (options?: Options): RequestResult => (options?.client ?? client).get({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update', + ...options +}); + +/** + * Install a release and restart the server. + * + * Returns as soon as the attempt is accepted: the download and swap run in the + * background and the process then exits so its supervisor restarts it on the + * new binary. Poll `GET /settings/update` for progress — after the restart, + * `last_attempt` carries the outcome. + */ +export const startUpdate = (options: Options): RequestResult => (options.client ?? client).post({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + /** * Report whether a newer temps release is available for this install. */ @@ -7297,6 +7324,16 @@ export const getUpdateStatus = (options?: ...options }); +/** + * Ask the release API for the newest version on this install's channel, now, + * instead of waiting for the background notifier's next pass. + */ +export const checkForUpdate = (options?: Options): RequestResult => (options?.client ?? client).post({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/settings/update/check', + ...options +}); + export const listTeams = (options?: Options): RequestResult => (options?.client ?? client).get({ security: [{ scheme: 'bearer', type: 'http' }], url: '/teams', @@ -7520,7 +7557,7 @@ export const removeRole = (options: Option ...options }); -export const listSandboxes = (options?: Options): RequestResult => (options?.client ?? client).get({ +export const listSandboxes = (options?: Options): RequestResult => (options?.client ?? client).get({ security: [{ scheme: 'bearer', type: 'http' }], url: '/v1/sandboxes', ...options @@ -7852,15 +7889,6 @@ export const stopSandbox = (options: Optio ...options }); -/** - * Attach an interactive terminal to a sandbox. - */ -export const terminal = (options: Options): RequestResult => (options.client ?? client).get({ - security: [{ scheme: 'bearer', type: 'http' }], - url: '/v1/sandboxes/{id}/terminal', - ...options -}); - /** * Kill a running command (`@vercel/sandbox`-compatible). The SDK * calls `POST /v1/sandboxes/{id}/{cmdId}/kill` — note the path has the diff --git a/web/src/api/client/types.gen.ts b/web/src/api/client/types.gen.ts index 87aa417d3..490b3b1ce 100644 --- a/web/src/api/client/types.gen.ts +++ b/web/src/api/client/types.gen.ts @@ -1105,6 +1105,16 @@ export type AppSettings = { require_mfa_for_admins?: boolean; screenshots?: ScreenshotSettings; security_headers?: SecurityHeadersSettings; + /** + * One-click "Update now" from the console. Enabled by default; an admin + * can turn it off here to keep upgrades on the CLI/config-management path. + * + * This is the *soft* switch — it is stored in the database, so whoever can + * write settings can also turn it back on. Operators who need an upgrade + * path that no console session can re-open should start the server with + * `--disable-self-update`, which wins over this field unconditionally. + */ + self_update?: SelfUpdateSettings; /** * Set to `true` by `temps setup` (all modes) once initial configuration * has been applied. The web onboarding wizard reads this from the server @@ -1189,6 +1199,13 @@ export type AppSettingsResponse = { require_mfa_for_admins: boolean; screenshots: ScreenshotSettings; security_headers: SecurityHeadersSettings; + /** + * Whether admins may apply a release from the console. This is the + * database-backed toggle only — a server started with + * `--disable-self-update` refuses regardless of what this says, which + * `GET /settings/update` reports as the authoritative answer. + */ + self_update: SelfUpdateSettings; /** * Whether `temps setup` has been run at least once. The web onboarding * wizard checks this field on load and skips itself when true. @@ -13244,6 +13261,34 @@ export type ReinstallWebhookResponse = { message: string; }; +/** + * Outcome of an operator-triggered release check. + */ +export type ReleaseCheckResult = { + /** + * Channel that was queried. + */ + channel: string; + /** + * Version tag of the running binary. + */ + current_version: string; + /** + * Newest release published on that channel, if any could be resolved. + */ + latest_version?: string | null; + /** + * Release-notes page for `latest_version`. + */ + release_url?: string | null; + /** + * True when `latest_version` is strictly newer than what is running. + * False on a channel whose newest release is older — which is normal and + * expected right after switching a nightly box onto stable. + */ + update_available: boolean; +}; + export type ReleaseListResponse = { releases: Array; }; @@ -14543,6 +14588,88 @@ export type SecurityHeadersSettings = { x_xss_protection?: string; }; +/** + * A single update attempt. Persisted to `/self-update.json` so the + * result survives the restart it causes. + */ +export type SelfUpdateAttempt = { + /** + * Operator-facing failure reason. Always set when `status` is `Failed`. + */ + error?: string | null; + /** + * When the outcome was decided. `None` while still `Pending`. + */ + finished_at?: string | null; + /** + * Version the attempt started from. + */ + from_version: string; + /** + * Where the replaced binary was kept, so a bad release can be reverted by + * hand (`mv `). Set once the swap completes. + */ + previous_binary_path?: string | null; + started_at: string; + status: SelfUpdateStatus; + /** + * Version the attempt targeted. `None` if it failed before resolving one. + */ + to_version?: string | null; + /** + * User who clicked the button. `None` for attempts started by the CLI. + */ + triggered_by_user_id?: number | null; +}; + +/** + * Why a one-click update is unavailable. Exactly one is reported — the most + * fundamental blocker wins, so the operator fixes the real problem first + * rather than clearing one only to hit the next. + */ +export type SelfUpdateBlocker = 'disabled_by_flag' | 'disabled_by_setting' | 'not_supported' | 'binary_not_writable' | 'unsupported_platform' | 'in_progress'; + +/** + * Where an in-flight update has got to. Polled by the console so a long + * download shows progress instead of an indefinite spinner. + */ +export type SelfUpdatePhase = 'idle' | 'resolving' | 'downloading' | 'verifying' | 'installing' | 'restarting' | 'pending_restart' | 'failed'; + +/** + * What happens to the running process once the new binary is in place. + */ +export type SelfUpdateRestartMode = 'automatic' | 'manual'; + +/** + * Controls the console's one-click "Update now" action. + */ +export type SelfUpdateSettings = { + /** + * Release channel this install tracks: `stable`, `beta` or `nightly`. + * + * `None` (the default) means "infer from the running version tag", which + * is what the CLI has always done — a `-nightly.` build tracks nightly, a + * `-beta.N` build tracks beta, a plain tag tracks stable. Setting it + * explicitly pins the channel, so an operator can move a nightly box back + * onto stable without reinstalling. + */ + channel?: string | null; + /** + * Allow admins to apply a release and restart the server from the console. + * `true` by default: the action is permission-gated, audited, and only + * ever installs an official release whose published SHA-256 matches. + * + * Turning this off hides nothing — the console still shows the update + * banner and the manual command, it just refuses to run it for you. + */ + enabled?: boolean; +}; + +/** + * Outcome of an update attempt, as persisted in the journal. + */ +export type SelfUpdateStatus = 'pending' | 'succeeded' | 'installed_pending_restart' | 'failed'; + export type SendEmailRequestBody = { /** * BCC recipients @@ -16182,6 +16309,37 @@ export type StartRestoreRequest = RestoreRequestMode & { s3_source_id?: number | null; }; +/** + * Optional pin for the version to install. + */ +export type StartUpdateRequest = { + /** + * Release tag to install (e.g. `v0.2.0`). Omit to take the newest release + * on the channel this install already tracks. + */ + version?: string | null; +}; + +/** + * Acknowledgement that an update was accepted and is running. + */ +export type StartUpdateResponse = { + /** + * Version the server is running as it accepts this request. + */ + current_version: string; + /** + * How long to allow for the server to come back before treating the + * restart as failed. `0` when nothing restarts. + */ + estimated_restart_secs: number; + message: string; + /** + * `automatic` (temps restarts itself) or `manual` (installed only). + */ + restart_mode: SelfUpdateRestartMode; +}; + export type StatResponse = { exists: boolean; is_dir: boolean; @@ -16408,6 +16566,11 @@ export type StripeConfig = { product_allowlist?: Array; }; +/** + * What (if anything) will restart the process after it exits. + */ +export type SupervisorKind = 'systemd' | 'launchd' | 'container' | 'none'; + export type SyncedRepositoryListQuery = { direction?: string | null; git_provider_connection_id?: number | null; @@ -17341,6 +17504,77 @@ export type UpdateBlobResponse = { success: boolean; }; +/** + * Whether this install can apply a release update on request, and how the last + * attempt went. + * + * Deliberately answerable even when the answer is "no": an operator who cannot + * use the button still needs to know *why* and what to run instead, so this + * never 404s or returns an empty body when the feature is unavailable. + */ +export type UpdateCapabilityResponse = { + /** + * Whether the *caller* holds `platform:update`. Distinct from `can_apply`, + * which describes the server: the console shows the action only when both + * are true, so a reader is never offered a button that would 403. + */ + allowed: boolean; + /** + * Binary that would be replaced. + */ + binary_path: string; + blocker?: null | SelfUpdateBlocker; + /** + * True only when a request would actually download, install and restart. + */ + can_apply: boolean; + /** + * Non-blocking warning to show with the confirmation (split topology). + */ + caveat?: string | null; + /** + * Channel actually tracked, after applying the configured override or + * falling back to inference from the running version tag. + */ + channel: string; + /** + * True when `channel` was set explicitly in settings rather than inferred. + */ + channel_is_pinned: boolean; + /** + * Version tag of the running binary. Always present — the version page + * needs it whether or not an update exists. + */ + current_version: string; + last_attempt?: null | SelfUpdateAttempt; + /** + * The equivalent command to run by hand. Always present. + */ + manual_command: string; + /** + * Phase of an in-flight attempt: `idle` when none is running. + */ + phase: SelfUpdatePhase; + /** + * Failure detail while `phase` is `failed`. + */ + phase_error?: string | null; + /** + * Operator-facing explanation of `blocker`. + */ + reason?: string | null; + /** + * `automatic` when applying an update also restarts temps; `manual` when + * it only installs the binary and the operator restarts on their own + * schedule. Lets the console set expectations before the click. + */ + restart_mode: SelfUpdateRestartMode; + /** + * What would restart the process: `systemd`, `launchd`, `container`, `none`. + */ + supervisor: SupervisorKind; +}; + export type UpdateCloudflareProviderRequest = { config: CloudflareConfig; enabled?: boolean | null; @@ -47531,6 +47765,70 @@ export type DownloadGlobalSkillArchiveResponses = { export type DownloadGlobalSkillArchiveResponse = DownloadGlobalSkillArchiveResponses[keyof DownloadGlobalSkillArchiveResponses]; +export type GetUpdateCapabilityData = { + body?: never; + path?: never; + query?: never; + url: '/settings/update'; +}; + +export type GetUpdateCapabilityErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; +}; + +export type GetUpdateCapabilityResponses = { + /** + * Self-update capability for this install + */ + 200: UpdateCapabilityResponse; +}; + +export type GetUpdateCapabilityResponse = GetUpdateCapabilityResponses[keyof GetUpdateCapabilityResponses]; + +export type StartUpdateData = { + body: StartUpdateRequest; + path?: never; + query?: never; + url: '/settings/update'; +}; + +export type StartUpdateErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; + /** + * Update unavailable or already running + */ + 409: ProblemDetails; + /** + * This process cannot apply updates + */ + 501: ProblemDetails; +}; + +export type StartUpdateError = StartUpdateErrors[keyof StartUpdateErrors]; + +export type StartUpdateResponses = { + /** + * Update accepted; the server will restart + */ + 202: StartUpdateResponse; +}; + +export type StartUpdateResponse2 = StartUpdateResponses[keyof StartUpdateResponses]; + export type GetUpdateStatusData = { body?: never; path?: never; @@ -47558,6 +47856,43 @@ export type GetUpdateStatusResponses = { export type GetUpdateStatusResponse = GetUpdateStatusResponses[keyof GetUpdateStatusResponses]; +export type CheckForUpdateData = { + body?: never; + path?: never; + query?: never; + url: '/settings/update/check'; +}; + +export type CheckForUpdateErrors = { + /** + * Unauthorized + */ + 401: unknown; + /** + * Insufficient permissions + */ + 403: unknown; + /** + * This process cannot check for updates + */ + 501: ProblemDetails; + /** + * The release API could not be reached + */ + 502: ProblemDetails; +}; + +export type CheckForUpdateError = CheckForUpdateErrors[keyof CheckForUpdateErrors]; + +export type CheckForUpdateResponses = { + /** + * Result of the release check + */ + 200: ReleaseCheckResult; +}; + +export type CheckForUpdateResponse = CheckForUpdateResponses[keyof CheckForUpdateResponses]; + export type ListTeamsData = { body?: never; path?: never; diff --git a/web/src/api/platformSettings.ts b/web/src/api/platformSettings.ts index 44e402665..d186bef1a 100644 --- a/web/src/api/platformSettings.ts +++ b/web/src/api/platformSettings.ts @@ -229,6 +229,10 @@ export async function updatePlatformSettings( monitoring: updated.monitoring, observability_compression: updated.observability_compression, observability_retention: updated.observability_retention, + // Must be sent on every save: the server deserializes `AppSettings` with + // `#[serde(default)]`, so omitting this field would silently re-enable + // console updates whenever any other settings page is saved. + self_update: updated.self_update, } const result = await updateSettings({ body }) if (result.error) { diff --git a/web/src/components/alerts/UpdateAvailableBanner.tsx b/web/src/components/alerts/UpdateAvailableBanner.tsx index 0b83df7b1..e05c34300 100644 --- a/web/src/components/alerts/UpdateAvailableBanner.tsx +++ b/web/src/components/alerts/UpdateAvailableBanner.tsx @@ -1,5 +1,7 @@ import { Button } from '@/components/ui/button' import { useUpdateStatus } from '@/hooks/useUpdateStatus' +import { useSelfUpdateCapability } from '@/hooks/useSelfUpdate' +import { UpdateNowDialog } from '@/components/alerts/UpdateNowDialog' import { ArrowUpCircle, X } from 'lucide-react' import { useState } from 'react' import { cn } from '@/lib/utils' @@ -28,6 +30,17 @@ export function UpdateAvailableBanner() { // Seed from storage once; the setter below keeps render state and storage // in sync when the user dismisses. const [dismissedVersion, setDismissedVersion] = useState(readDismissedVersion) + const [updateOpen, setUpdateOpen] = useState(false) + // Only asked for once there is something to update to, so an up-to-date + // install never pays for the check. + const { data: capability } = useSelfUpdateCapability({ + enabled: Boolean(data?.update_available), + }) + + // Offered to anyone holding `platform:update`, even when the server itself + // cannot apply it — the dialog then explains why and gives the command to + // run instead, which is more use than a button that silently isn't there. + const canOfferUpdate = Boolean(capability?.allowed) if (!data?.update_available || !data.latest_version) { return null @@ -52,53 +65,78 @@ export function UpdateAvailableBanner() { // Informational (not a warning): same thin single-line strip as the // disk-space banner, but with a calm blue treatment. return ( -
- -

- Update available - - {' '}— {data.latest_version} - - - {' '}— temps {data.current_version} →{' '} - {data.latest_version} - {data.channel && ` on the ${data.channel} channel`} - -

- {data.release_url && ( + <> +
+ +

+ Update available + + {' '} + — {data.latest_version} + + + {' '} + — temps + {data.current_version} + →{' '} + {data.latest_version} + {data.channel && ` on the ${data.channel} channel`} + +

+ {canOfferUpdate && ( + + )} + {data.release_url && ( + + Release notes + + )} - Release notes + How to upgrade - )} - - How to upgrade - - -
+ +
+ + {/* Mounted unconditionally with an `open` prop so the dialog keeps its + watch state if the banner re-renders mid-update. */} + + ) } diff --git a/web/src/components/alerts/UpdateNowDialog.tsx b/web/src/components/alerts/UpdateNowDialog.tsx new file mode 100644 index 000000000..dec10aa90 --- /dev/null +++ b/web/src/components/alerts/UpdateNowDialog.tsx @@ -0,0 +1,419 @@ +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from '@/components/ui/alert-dialog' +import { Button } from '@/components/ui/button' +import { CopyButton } from '@/components/ui/copy-button' +import { + useInvalidateUpdateStatus, + useSelfUpdateCapability, + useStartSelfUpdate, +} from '@/hooks/useSelfUpdate' +import type { + SelfUpdateAttempt, + SelfUpdatePhase, + SelfUpdateRestartMode, +} from '@/api/client/types.gen' +import { + AlertTriangle, + ArrowUpCircle, + CheckCircle2, + Loader2, + Terminal, + XCircle, +} from 'lucide-react' +import { useEffect, useMemo, useRef, useState } from 'react' + +/** How often the server is asked where the update has got to. */ +const POLL_MS = 2000 + +/** Extra time allowed on top of the server's own estimate before we stop + * waiting and tell the user to go look at the host. */ +const RESTART_GRACE_SECS = 60 + +const PHASE_LABEL: Record = { + idle: 'Starting…', + resolving: 'Finding the release…', + downloading: 'Downloading…', + verifying: 'Verifying checksum…', + installing: 'Installing…', + restarting: 'Restarting the server…', + pending_restart: 'Installed — waiting for you to restart temps', + failed: 'Failed', +} + +interface UpdateNowDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + /** Version tag the server reports as newest, for the confirmation copy. */ + latestVersion?: string | null + currentVersion?: string | null +} + +/** + * Confirm-and-watch dialog for applying a release from the console. + * + * The interesting part is what happens after "Update and restart": the server + * deliberately stops answering partway through, so this keeps polling across + * the downtime and reports the recorded outcome once it is back. It never + * closes itself on success — a stale console bundle is still loaded in the + * browser, so the user is offered an explicit reload. + */ +export function UpdateNowDialog({ + open, + onOpenChange, + latestVersion, + currentVersion, +}: UpdateNowDialogProps) { + const [watching, setWatching] = useState(false) + const [waitedTooLong, setWaitedTooLong] = useState(false) + // `last_attempt` as it looked before we started, so a result left over from a + // previous update is never mistaken for this one's. + const baselineAttemptRef = useRef(null) + const deadlineRef = useRef(null) + + const { data: capability, isPending: capabilityPending } = + useSelfUpdateCapability({ + enabled: open, + pollMs: watching ? POLL_MS : undefined, + }) + const startUpdate = useStartSelfUpdate() + const invalidateUpdateStatus = useInvalidateUpdateStatus() + + const attempt = capability?.last_attempt ?? null + const isOurResult = + watching && + attempt != null && + attempt.status !== 'pending' && + attempt.started_at !== baselineAttemptRef.current + + const result: SelfUpdateAttempt | null = isOurResult ? attempt : null + + // Stop polling once the attempt resolves, and refresh the banner's own + // "update available" state so it disappears after a successful upgrade. + useEffect(() => { + if (result) { + setWatching(false) + deadlineRef.current = null + invalidateUpdateStatus() + } + }, [result, invalidateUpdateStatus]) + + // Give up waiting eventually. A server that never comes back is a real + // outcome and must be reported as one, not as a spinner that runs forever. + useEffect(() => { + if (!watching) { + setWaitedTooLong(false) + return + } + const timer = setInterval(() => { + if (deadlineRef.current && Date.now() > deadlineRef.current) { + setWaitedTooLong(true) + } + }, 1000) + return () => clearInterval(timer) + }, [watching]) + + const blockedReason = useMemo(() => { + if (!capability) return null + if (!capability.allowed) { + return 'Your account does not have permission to update the platform (platform:update).' + } + if (!capability.can_apply) { + return capability.reason ?? 'Updating from the console is not available.' + } + return null + }, [capability]) + + const handleStart = async () => { + baselineAttemptRef.current = capability?.last_attempt?.started_at ?? null + setWaitedTooLong(false) + try { + const started = await startUpdate.mutateAsync({ body: {} }) + deadlineRef.current = + Date.now() + + ((started?.estimated_restart_secs ?? 45) + RESTART_GRACE_SECS) * 1000 + setWatching(true) + } catch { + // The mutation's error is rendered below; nothing to do here. + } + } + + const handleClose = (next: boolean) => { + if (!next) { + setWatching(false) + deadlineRef.current = null + } + onOpenChange(next) + } + + const phase = capability?.phase ?? 'idle' + const startError = startUpdate.error + + return ( + + + + + {result?.status === 'succeeded' || + result?.status === 'installed_pending_restart' ? ( + + ) : result?.status === 'failed' ? ( + + ) : ( + + )} + {result?.status === 'succeeded' + ? 'Update complete' + : result?.status === 'installed_pending_restart' + ? 'Update installed' + : result?.status === 'failed' + ? 'Update failed' + : watching + ? 'Updating temps' + : 'Update temps'} + + +
+ {result ? ( + + ) : watching ? ( + + ) : ( + + )} + + {startError ? ( +

+ {errorDetail(startError)} +

+ ) : null} +
+
+
+ + + {result?.status === 'succeeded' ? ( + <> + Close + + + ) : result ? ( + Close + ) : watching ? ( + Hide + ) : ( + <> + Cancel + + + )} + +
+
+ ) +} + +function ConfirmBody({ + currentVersion, + latestVersion, + blockedReason, + caveat, + manualCommand, + binaryPath, + restartMode, + loading, +}: { + currentVersion?: string | null + latestVersion?: string | null + blockedReason: string | null + caveat: string | null + manualCommand: string + binaryPath: string + restartMode?: SelfUpdateRestartMode + loading: boolean +}) { + const willRestart = restartMode !== 'manual' + return ( + <> +

+ temps will download{' '} + + {latestVersion ?? 'the latest release'} + + , verify its checksum and replace the binary + {currentVersion && ( + <> + {' '} + (currently {currentVersion}) + + )} + {willRestart ? ', then restart.' : '.'} +

+

+ {willRestart + ? 'The server — including proxied traffic to your deployed apps — is unavailable for a few seconds while it restarts. The previous binary is kept alongside the new one so you can roll back by hand.' + : 'Nothing goes offline: temps keeps serving the current version until you restart it yourself, which is when the new version takes over. The previous binary is kept alongside the new one so you can roll back by hand.'} +

+ + {caveat && ( +

+ + {caveat} +

+ )} + + {loading ? ( +

Checking this server…

+ ) : ( + blockedReason && ( +
+

+ + {blockedReason} +

+
+ + + {manualCommand} + + +
+
+ ) + )} + + {binaryPath && !blockedReason && ( +

+ Replaces {binaryPath} +

+ )} + + ) +} + +function WatchingBody({ + phase, + waitedTooLong, + expectRestart, +}: { + phase: SelfUpdatePhase + waitedTooLong: boolean + expectRestart: boolean +}) { + return ( + <> +

+ + {PHASE_LABEL[phase] ?? 'Working…'} +

+

+ {expectRestart + ? 'The console loses contact with the server while it restarts — that is expected. This dialog reports the result as soon as it is back.' + : 'temps stays up while this runs; the new version takes over when you restart it.'} +

+ {waitedTooLong && expectRestart && ( +

+ + + The server has not come back yet. Check the service on the host ( + systemctl status temps and{' '} + journalctl -u temps). The + previous binary was kept as a{' '} + .bak file next to the current + one. + +

+ )} + + ) +} + +function ResultBody({ result }: { result: SelfUpdateAttempt }) { + if (result.status === 'installed_pending_restart') { + // The most important case to be blunt about: the bytes are on disk but the + // running server is unchanged, and only the operator can finish the job. + return ( + <> +

+ {result.to_version} is + installed, but temps is still running{' '} + {result.from_version}. +

+

+ Nothing on this host restarts temps automatically, so the update goes + live the next time you restart it yourself. +

+ {result.previous_binary_path && ( +

+ Previous binary kept at{' '} + {result.previous_binary_path} +

+ )} + + ) + } + if (result.status === 'succeeded') { + return ( + <> +

+ temps is now running{' '} + {result.to_version} (was{' '} + {result.from_version}). +

+

+ Reload the console to pick up the matching web assets. +

+ + ) + } + return ( + <> +

{result.error ?? 'The update did not complete.'}

+

+ The server is still running{' '} + {result.from_version}. +

+ + ) +} + +/** Pull the Problem Details `detail` out of a failed mutation. */ +function errorDetail(error: unknown): string { + const problem = error as { detail?: string; message?: string } | null + return problem?.detail ?? problem?.message ?? 'Could not start the update.' +} diff --git a/web/src/components/dashboard/Sidebar.tsx b/web/src/components/dashboard/Sidebar.tsx index 11ee01350..549e3807f 100644 --- a/web/src/components/dashboard/Sidebar.tsx +++ b/web/src/components/dashboard/Sidebar.tsx @@ -18,6 +18,7 @@ import { Activity, AlarmClock, ArrowLeft, + ArrowUpCircle, BadgeCheck, BarChart3, Bell, @@ -179,6 +180,7 @@ const settingsGroups: SettingsGroupDef[] = [ label: 'General', items: [ { title: 'Platform', url: '/settings', icon: Settings2 }, + { title: 'Version', url: '/settings/version', icon: ArrowUpCircle }, { title: 'AI Providers', url: '/settings/ai-providers', icon: Sparkles }, { title: 'Notifications', url: '/settings/notifications', icon: Bell }, ], diff --git a/web/src/hooks/useSelfUpdate.ts b/web/src/hooks/useSelfUpdate.ts new file mode 100644 index 000000000..20c45f29e --- /dev/null +++ b/web/src/hooks/useSelfUpdate.ts @@ -0,0 +1,79 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { + checkForUpdateMutation, + getUpdateCapabilityOptions, + getUpdateCapabilityQueryKey, + getUpdateStatusQueryKey, + startUpdateMutation, +} from '@/api/client/@tanstack/react-query.gen' + +/** + * Whether this server can install a release on request, which version and + * channel it is on, and how the last attempt went. + * + * Cheap (in-memory state plus one settings read), but not free, so it is only + * fetched where the answer is actually used — pass `enabled: false` to skip it. + * While an update is running, `pollMs` turns this into the progress feed: the + * server reports `phase` as it downloads, verifies and installs. + */ +export function useSelfUpdateCapability({ + enabled = true, + pollMs, +}: { enabled?: boolean; pollMs?: number } = {}) { + return useQuery({ + ...getUpdateCapabilityOptions(), + enabled, + refetchInterval: pollMs, + staleTime: pollMs ? 0 : 60 * 1000, + // Deliberately keep retrying while polling: under automatic restart the + // server is EXPECTED to stop answering mid-update, and giving up on the + // first failure would strand the UI on "connection lost" exactly when the + // user most needs to see the outcome. + retry: pollMs ? true : false, + retryDelay: 2000, + }) +} + +/** + * Start an update. Resolves as soon as the server accepts it — the install (and + * the restart, where the server does that) happen afterwards, observable + * through {@link useSelfUpdateCapability}. + */ +export function useStartSelfUpdate() { + const queryClient = useQueryClient() + + return useMutation({ + ...startUpdateMutation(), + onSuccess: () => { + // The capability now reports a running attempt; refetch so polling starts + // from the real phase rather than the stale idle snapshot. + queryClient.invalidateQueries({ queryKey: getUpdateCapabilityQueryKey() }) + }, + }) +} + +/** + * Query the release API immediately rather than waiting for the server's own + * periodic check. Republishes the shared update notice, so the banner and the + * version page never disagree. + */ +export function useCheckForUpdate() { + const queryClient = useQueryClient() + + return useMutation({ + ...checkForUpdateMutation(), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: getUpdateStatusQueryKey() }) + queryClient.invalidateQueries({ queryKey: getUpdateCapabilityQueryKey() }) + }, + }) +} + +/** Drop the cached "update available" notice once the server is back. */ +export function useInvalidateUpdateStatus() { + const queryClient = useQueryClient() + return () => { + queryClient.invalidateQueries({ queryKey: getUpdateStatusQueryKey() }) + queryClient.invalidateQueries({ queryKey: getUpdateCapabilityQueryKey() }) + } +} diff --git a/web/src/pages/settings/VersionPage.tsx b/web/src/pages/settings/VersionPage.tsx new file mode 100644 index 000000000..365efe98c --- /dev/null +++ b/web/src/pages/settings/VersionPage.tsx @@ -0,0 +1,489 @@ +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card' +import { CopyButton } from '@/components/ui/copy-button' +import { Label } from '@/components/ui/label' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { Skeleton } from '@/components/ui/skeleton' +import { Switch } from '@/components/ui/switch' +import { UpdateNowDialog } from '@/components/alerts/UpdateNowDialog' +import { useBreadcrumbs } from '@/contexts/BreadcrumbContext' +import { usePageTitle } from '@/hooks/usePageTitle' +import { + useCheckForUpdate, + useSelfUpdateCapability, +} from '@/hooks/useSelfUpdate' +import { useSettings, useUpdateSettings } from '@/hooks/useSettings' +import { useUpdateStatus } from '@/hooks/useUpdateStatus' +import { + AlertTriangle, + ArrowUpCircle, + CheckCircle2, + Info, + Loader2, + RefreshCw, + Terminal, + XCircle, +} from 'lucide-react' +import { useEffect, useState } from 'react' +import { toast } from 'sonner' + +/** Channels the server knows how to track, worst-to-best stability last. */ +const CHANNELS = [ + { + value: 'stable', + label: 'Stable', + hint: 'Tagged releases only. Recommended for production.', + }, + { + value: 'beta', + label: 'Beta', + hint: 'Pre-release cuts plus stable. Excludes nightly builds.', + }, + { + value: 'nightly', + label: 'Nightly', + hint: 'Automated daily builds from main. Least stable.', + }, +] as const + +/** Sentinel for "no explicit channel — follow the running version's tag". */ +const INHERIT = '__inherit__' + +/** + * Version and updates page. + * + * One place to answer "what am I running, is there something newer, and can I + * install it from here" — which previously required reading a banner, the + * release page and the host's service manager. + */ +export function VersionPage() { + const { setBreadcrumbs } = useBreadcrumbs() + const { data: settings } = useSettings() + const updateSettings = useUpdateSettings() + const { data: capability, isPending } = useSelfUpdateCapability() + const { data: status } = useUpdateStatus() + const checkForUpdate = useCheckForUpdate() + const [updateOpen, setUpdateOpen] = useState(false) + + useEffect(() => { + setBreadcrumbs([ + { label: 'Settings', href: '/settings' }, + { label: 'Version' }, + ]) + }, [setBreadcrumbs]) + + usePageTitle('Version') + + const selfUpdate = settings?.self_update + const enabled = selfUpdate?.enabled ?? true + // A launch flag beats the database, so the toggle is inert (and says so) + // rather than pretending to control something it doesn't. + const overriddenByFlag = capability?.blocker === 'disabled_by_flag' + + const saveSelfUpdate = async ( + patch: { enabled?: boolean; channel?: string | null }, + message: string + ) => { + try { + await updateSettings.mutateAsync({ + self_update: { + enabled: patch.enabled ?? enabled, + channel: + patch.channel !== undefined + ? patch.channel + : (selfUpdate?.channel ?? null), + }, + }) + toast.success(message) + } catch { + // useUpdateSettings surfaces the failure toast. + } + } + + const latest = checkForUpdate.data + const canApply = Boolean(capability?.can_apply && capability?.allowed) + + return ( +
+ + + Version + + What this server is running, and what is available on its channel. + + + + {isPending ? ( +
+ + +
+ ) : ( + <> +
+
+
+ + {capability?.current_version ?? 'unknown'} + + {capability?.channel} + {!capability?.channel_is_pinned && ( + + (from the installed version) + + )} +
+

+ Managed by{' '} + {capability?.supervisor}{' '} + ·{' '} + {capability?.restart_mode === 'manual' + ? 'updates install but do not restart temps' + : 'updates restart temps automatically'} +

+
+ +
+ + {capability?.binary_path && ( +

+ Binary{' '} + {capability.binary_path} +

+ )} + + setUpdateOpen(true)} + /> + + )} +
+
+ + + + Release channel + + Which releases this server tracks. Changing it takes effect on the + next check. + + + + + + {/* Switching to a more stable channel usually means the newest + release there is OLDER than what is running, which looks like a + bug unless we say so first. */} +

+ + + Moving to a more stable channel does not downgrade this server. + Its newest release may be older than what you are running, in + which case nothing is offered until that channel catches up. + +

+
+
+ + + + Updating from the console + + Whether admins can install a release from here. The banner and the + manual command are shown either way. + + + +
+
+ +

+ Requires the platform:update{' '} + permission. Every attempt is audited. +

+
+ + saveSelfUpdate( + { enabled: next }, + next + ? 'Updates can now be applied from the console' + : 'Console updates disabled' + ) + } + /> +
+ + {overriddenByFlag && ( +

+ + + This server was started with{' '} + --disable-self-update, which + overrides this setting. Remove the flag and restart temps to + allow console updates. + +

+ )} + + {capability && !capability.can_apply && !overriddenByFlag && ( +
+

+ + {capability.reason} +

+ +
+ )} + + {capability?.caveat && ( +

+ + {capability.caveat} +

+ )} +
+
+ + {capability?.last_attempt && ( + + )} + + +
+ ) +} + +/** + * Pull the human-readable reason out of a failed request. + * + * The API returns RFC 7807 Problem Details, and `String(err)` on that object + * renders "[object Object]" — i.e. the user is told something failed but never + * why, which is exactly the state this page exists to avoid. + */ +function problemDetail(error: unknown): string | null { + if (!error) return null + const problem = error as { detail?: string; title?: string; message?: string } + return ( + problem.detail ?? + problem.title ?? + problem.message ?? + 'The release check failed.' + ) +} + +function ManualCommand({ command }: { command: string }) { + return ( +
+ + + {command} + + +
+ ) +} + +function UpdateAvailability({ + latestVersion, + updateAvailable, + currentVersion, + releaseUrl, + checked, + error, + canApply, + onUpdate, +}: { + latestVersion: string | null + updateAvailable: boolean + currentVersion: string | null + releaseUrl: string | null + checked: boolean + error: string | null + canApply: boolean + onUpdate: () => void +}) { + if (error) { + return ( +

+ + {error} +

+ ) + } + + if (updateAvailable && latestVersion) { + return ( +
+

+ + + {latestVersion} is available + {currentVersion && ( + <> + {' '} + (you have {currentVersion}) + + )} + {releaseUrl && ( + <> + {' · '} + + Release notes + + + )} + +

+ {canApply && ( + + )} +
+ ) + } + + // Distinguish "we asked and there is nothing" from "we haven't asked yet", + // so a stale page never reads as a fresh all-clear. + return ( +

+ + + {checked + ? `Up to date${latestVersion ? ` — the newest release on this channel is ${latestVersion}` : ''}.` + : 'No newer release has been found. The server re-checks periodically, or check now.'} + +

+ ) +} + +function LastAttemptCard({ + attempt, +}: { + attempt: NonNullable< + ReturnType['data'] + >['last_attempt'] +}) { + if (!attempt) return null + + const tone = + attempt.status === 'succeeded' + ? 'text-green-700 dark:text-green-400' + : attempt.status === 'failed' + ? 'text-destructive' + : 'text-amber-700 dark:text-amber-400' + + const label = + attempt.status === 'succeeded' + ? 'Succeeded' + : attempt.status === 'failed' + ? 'Failed' + : attempt.status === 'installed_pending_restart' + ? 'Installed — restart temps to apply' + : 'In progress' + + return ( + + + Last update attempt + + +

{label}

+

+ {attempt.from_version} + {attempt.to_version && ( + <> + {' → '} + {attempt.to_version} + + )} + {' · '} + {new Date(attempt.started_at).toLocaleString()} +

+ {attempt.error &&

{attempt.error}

} + {attempt.previous_binary_path && ( +

+ Previous binary kept at{' '} + {attempt.previous_binary_path} +

+ )} +
+
+ ) +}