diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..47562f4
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,16 @@
+version: 2.1
+# Build and test on CircleCI (as the other QRun-IO repos); GitHub Actions also
+# runs .github/workflows/ci.yml and publishes on version tags.
+jobs:
+ build:
+ docker:
+ - image: cimg/node:22.12
+ steps:
+ - checkout
+ - run: npm ci
+ - run: npm run build
+ - run: npm test
+workflows:
+ build:
+ jobs:
+ - build
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..6313b56
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..ccf9143
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,28 @@
+name: ci
+on:
+ pull_request:
+ push:
+ branches: [main]
+permissions:
+ contents: read
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm
+ - run: npm ci
+ - name: Generated client is up to date with the vendored document
+ run: |
+ npm run generate
+ git diff --exit-code packages/ui-api-client/src/schema.ts
+ - run: npm run build
+ - run: npm test
+ - name: Mock server smoke test (Prism on the merged document)
+ run: |
+ npx prism mock --port 4010 packages/ui-api-client/openapi/qqq-v1.json > prism.log 2>&1 &
+ for i in $(seq 1 30); do curl -fsS http://127.0.0.1:4010/qqq/v1/version && break; sleep 1; done
+ curl -fsS http://127.0.0.1:4010/qqq/v1/metaData/authentication
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..59f698d
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,33 @@
+name: publish
+# Publishes the three packages to GitHub Packages (npm.pkg.github.com, scope @qrun-io)
+# when a version tag (v*) is pushed. The tag must match the client package version.
+on:
+ push:
+ tags: ['v*']
+permissions:
+ contents: read
+ packages: write
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ registry-url: https://npm.pkg.github.com
+ scope: '@qrun-io'
+ - run: npm ci
+ - run: npm run build
+ - run: npm test
+ - name: Tag matches the client version
+ run: test "v$(node -p "require('./packages/ui-api-client/package.json').version")" = "${GITHUB_REF_NAME}"
+ - run: npm publish -w @qrun-io/qqq-ui-api-client --tag rc
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - run: npm publish -w @qrun-io/qqq-ui-api-conformance --tag rc
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - run: npm publish -w @qrun-io/qqq-cli --tag rc
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e828b52
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+dist/
+*.tgz
+.env
+.spec-src/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b8fcf46
--- /dev/null
+++ b/README.md
@@ -0,0 +1,137 @@
+# qqq-cli
+
+The reference command-line client for [QQQ](https://github.com/QRun-IO/qqq) applications, and the kit for writing your own CLI, TUI or native client. Everything here talks to a QQQ server only through the **UI API** (`/qqq/v1`), the API the web UI uses too.
+
+| Package | What it is |
+|---|---|
+| [`@qrun-io/qqq-cli`](packages/cli) | `qqq`, the reference CLI: device-code sign-in, apps, tables, filtered queries, records, processes, jobs, and a live event stream |
+| [`@qrun-io/qqq-ui-api-client`](packages/ui-api-client) | A typed TypeScript client, generated from the merged UI API document (core plus extensions). It also does OAuth2 device-flow sign-in, token refresh, and reads the realtime (SSE) stream |
+| [`@qrun-io/qqq-ui-api-conformance`](packages/conformance) | A black-box conformance suite you can run against any server, plus `qqq-dev-idp`, a local OIDC provider for testing native clients |
+
+The packages are published to GitHub Packages:
+
+```sh
+echo "@qrun-io:registry=https://npm.pkg.github.com" >> ~/.npmrc
+npm install -g @qrun-io/qqq-cli@rc
+```
+
+Requires Node.js 20 or later and a QQQ server with UI API 1.6.0 or later (QQQ 4.1.0-RC.15 or later).
+
+## The CLI
+
+```console
+$ qqq login --server https://admin.example.com
+To sign in to https://admin.example.com, open:
+
+ https://auth.example.com/device?code=ED84-CC03
+
+and confirm the code ED84-CC03 (it expires in 10 minutes).
+Waiting for approval...
+Signed in to https://admin.example.com as darin@example.com.
+
+$ qqq tables --app peopleApp
+name label insert edit delete
+------- -------- ------ ---- ------
+person Person yes yes yes
+pet Pet yes yes yes
+
+$ qqq query person --where "firstName ~ a" --where "id < 100" --order -id --limit 5
+Id First Name Last Name Annual Salary ...
+5 Morgan Sample $1,500,000.00
+3 Casey Sample $300,000.00
+(2 records)
+
+$ qqq get person 1
+$ qqq run greetInteractive --records 1,2 --value greetingPrefix=Hi
+$ qqq jobs --all
+$ qqq tail --channel table:person
+```
+
+| Command | UI API operations |
+|---|---|
+| `login` | `getAuthenticationMetaData`, then the provider's device-authorization grant with `values.nativeClientId` |
+| `whoami` | `getVersion`, `getMetaData` |
+| `apps`, `tables [--app]` | `getMetaData` |
+| `query
[--where "field OP value"]... [--or] [--order [-]field] [--limit n] [--fields a,b]` | `getTableMetaData`, `queryTable` |
+| `get ` | `getTableMetaData`, `getRecord` |
+| `run [--value k=v]... [--records ids]` | `getProcessMetaData`, `initProcess`, `stepProcess`, `getProcessStatus` |
+| `jobs [--all]` | `listJobs` |
+| `tail [--channel ...]` | `openRealtimeStream`, `updateRealtimeSubscriptions` (`user:me`, plus your channels) |
+
+Add `--json` for machine-readable output. Errors print the server's `message`, `code` and `traceId`.
+
+Where things are kept:
+- **Tokens** go in `~/.config/qqq-cli/credentials.json` (mode 0600), one entry per server. The CLI refreshes the access token at the provider before it expires, and once more on a 401.
+- **`QQQ_TOKEN`** overrides the stored token with any bearer token, such as a QQQ access token exchanged for a JWT, or a session UUID.
+- **`QQQ_SERVER`** sets the default server.
+
+Every request carries `X-QQQ-Client: cli/qqq-cli `, so the server's audits attribute it to the CLI.
+
+## Writing a client
+
+```ts
+import { createUiApiClient, unwrap, getNativeSignInConfig, deviceSignIn } from '@qrun-io/qqq-ui-api-client'
+
+const config = await getNativeSignInConfig('https://admin.example.com')
+const tokens = await deviceSignIn(config, (p) => console.log(`Open ${p.verificationUriComplete}`))
+const api = createUiApiClient({ baseUrl: 'https://admin.example.com', token: () => tokens.accessToken, clientChannel: 'tui/my-tui 1.0' })
+
+const page = await unwrap(api.POST('/qqq/v1/table/{tableName}/query', {
+ params: { path: { tableName: 'person' } },
+ body: { filter: { criteria: [{ fieldName: 'lastName', operator: 'STARTS_WITH', values: ['K'] }], limit: 20 } },
+}))
+```
+
+Paths, parameters, bodies and responses are typed from the document. Read the QQQ docs before you write a client:
+- [`UI-API-CLIENTS.md`](https://github.com/QRun-IO/qqq/blob/develop/docs/UI-API-CLIENTS.md) covers authentication, errors, widgets, processes, capabilities and validation.
+- [`UI-API-CHANGELOG.md`](https://github.com/QRun-IO/qqq/blob/develop/docs/UI-API-CHANGELOG.md) covers versioning.
+
+## Mock server
+
+`npm run mock` serves the merged document with [Prism](https://github.com/stoplightio/prism) on http://127.0.0.1:4010, so you can build a client without a server. Responses come from the document's examples and schemas.
+
+## Conformance suite
+
+```sh
+qqq-ui-api-conformance --server https://admin.example.com # public checks only
+qqq-ui-api-conformance --server https://admin.example.com --token "$T" # all read-only checks
+```
+
+The suite only reads. It never writes. It checks that:
+- the version and the served document agree;
+- every operation has a unique operationId and every `$ref` resolves;
+- every extension the server lists has operations;
+- requests without credentials or with forged tokens (`alg: none`, garbage) get a 401 with the error schema;
+- metadata, table metadata (with `clientCapabilities`), query, count, record, jobs and realtime responses validate against the document;
+- a 404 has the error schema, and `X-Request-Id` comes back as `traceId`.
+
+## Testing a client locally
+
+`qqq-dev-idp` is a small OIDC provider for **local development only**: device grant, refresh and RS256 JWTs, with one issuer per client, as Authentik does it. Run it with the QQQ sample app:
+
+```sh
+npx qqq-dev-idp --port 9400 --client sample-app --client sample-cli --user you@example.com --groups admins --auto-approve
+
+# in a qqq checkout (QQQ 4.1.0-RC.15 or later)
+export OAUTH2_BASE_URL=http://localhost:9400/application/o/sample-app/ OAUTH2_CLIENT_ID=sample-app OAUTH2_CLIENT_SECRET=dev \
+ OAUTH2_SCOPES="openid profile email offline_access" \
+ OAUTH2_NATIVE_CLIENT_ID=sample-cli OAUTH2_NATIVE_CLIENT_BASE_URL=http://localhost:9400/application/o/sample-cli/
+./mvnw -f qqq-sample-project/pom.xml compile exec:java -Dexec.mainClass=com.kingsrook.sampleapp.SampleJavalinServer -Dqqq.sample.port=8077
+
+qqq login --server http://localhost:8077
+```
+
+## Development
+
+```sh
+npm ci
+npm run spec:merge -- ... # or a server's /qqq/v1/openapi.json
+npm run generate # regenerate packages/ui-api-client/src/schema.ts
+npm run build && npm test
+```
+
+Releases: push a tag `v`. The `publish` workflow publishes the three packages to GitHub Packages.
+
+## License
+
+Apache-2.0
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..9e5e7e0
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2971 @@
+{
+ "name": "qqq-cli-workspace",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "qqq-cli-workspace",
+ "license": "Apache-2.0",
+ "workspaces": [
+ "packages/ui-api-client",
+ "packages/conformance",
+ "packages/cli"
+ ],
+ "devDependencies": {
+ "@stoplight/prism-cli": "5.16.0",
+ "@types/node": "22.15.3",
+ "typescript": "5.8.3",
+ "yaml": "2.9.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@faker-js/faker": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.6.0.tgz",
+ "integrity": "sha512-3RQHgEtvL1Frl/d1cSreo7qhJ3Gk1OdNUai/CtZ8G+wYeRQnJih3s9xJ9/kgYekPQRdwgh0HXRPqMlzWGwivIQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fakerjs"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0",
+ "npm": ">=10"
+ }
+ },
+ "node_modules/@jsdevtools/ono": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
+ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jsep-plugin/assignment": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.4.0.tgz",
+ "integrity": "sha512-nw2Px23Eirx0PFTVoPrb3FEq9Wkmg6vxcDtt38MtBCf1G0tjLCB9cK+3seOXyiw+6+aalgYhvJabQbWwMVKlEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ },
+ "peerDependencies": {
+ "jsep": "^0.4.0||^1.0.0"
+ }
+ },
+ "node_modules/@jsep-plugin/regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.1.0.tgz",
+ "integrity": "sha512-2Vkbda+XRjK6VTI6Lrh0sNBuMT8mZ51EhqMvO+V2rSdmqjs7NAGssxPZfkL23EFzYfSrvxyd1ZjOdqPQMM50og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ },
+ "peerDependencies": {
+ "jsep": "^0.4.0||^1.0.0"
+ }
+ },
+ "node_modules/@nodable/entities": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.1.0.tgz",
+ "integrity": "sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodable"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@qrun-io/qqq-cli": {
+ "resolved": "packages/cli",
+ "link": true
+ },
+ "node_modules/@qrun-io/qqq-ui-api-client": {
+ "resolved": "packages/ui-api-client",
+ "link": true
+ },
+ "node_modules/@qrun-io/qqq-ui-api-conformance": {
+ "resolved": "packages/conformance",
+ "link": true
+ },
+ "node_modules/@redocly/ajv": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz",
+ "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js-replace": "^1.0.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@redocly/config": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz",
+ "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@redocly/openapi-core": {
+ "version": "1.34.21",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.21.tgz",
+ "integrity": "sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/ajv": "8.11.2",
+ "@redocly/config": "0.22.0",
+ "colorette": "1.4.0",
+ "https-proxy-agent": "7.0.6",
+ "js-levenshtein": "1.1.6",
+ "js-yaml": "4.3.2",
+ "minimatch": "5.1.9",
+ "pluralize": "8.0.0",
+ "yaml-ast-parser": "0.0.43"
+ },
+ "engines": {
+ "node": ">=18.17.0",
+ "npm": ">=9.5.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/@redocly/openapi-core/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/js-yaml": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@scarf/scarf": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
+ "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@stoplight/http-spec": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/http-spec/-/http-spec-7.1.0.tgz",
+ "integrity": "sha512-Z2XqKX2SV8a1rrgSzFqccX2TolfcblT+l4pNvUU+THaLl50tKDoeidwWWZTzYUzqU0+UV97ponvqEbWWN3PaXg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/json": "^3.18.1",
+ "@stoplight/json-schema-generator": "1.0.2",
+ "@stoplight/types": "14.1.0",
+ "@types/json-schema": "7.0.11",
+ "@types/swagger-schema-official": "~2.0.22",
+ "@types/type-is": "^1.6.3",
+ "fnv-plus": "^1.3.1",
+ "lodash": "^4.17.21",
+ "openapi3-ts": "^2.0.2",
+ "postman-collection": "^4.1.3",
+ "tslib": "^2.6.2",
+ "type-is": "^1.6.18"
+ },
+ "engines": {
+ "node": ">=14.13"
+ }
+ },
+ "node_modules/@stoplight/http-spec/node_modules/@stoplight/types": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.0.tgz",
+ "integrity": "sha512-fL8Nzw03+diALw91xHEHA5Q0WCGeW9WpPgZQjodNUWogAgJ56aJs03P9YzsQ1J6fT7/XjDqHMgn7/RlsBzB/SQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/json": {
+ "version": "3.21.7",
+ "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz",
+ "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/ordered-object-literal": "^1.0.3",
+ "@stoplight/path": "^1.3.2",
+ "@stoplight/types": "^13.6.0",
+ "jsonc-parser": "~2.2.1",
+ "lodash": "^4.17.21",
+ "safe-stable-stringify": "^1.1"
+ },
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
+ "node_modules/@stoplight/json-schema-generator": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-schema-generator/-/json-schema-generator-1.0.2.tgz",
+ "integrity": "sha512-FzSLFoIZc6Lmw3oRE7kU6YUrl5gBmUs//rY59jdFipBoSyTPv5NyqeyTg5mvT6rY1F3qTLU3xgzRi/9Pb9eZpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-fetch": "^3.1.5",
+ "json-promise": "1.1.x",
+ "minimist": "1.2.6",
+ "mkdirp": "0.5.x",
+ "pretty-data": "0.40.x"
+ },
+ "bin": {
+ "json-schema-generator": "bin/cli.js"
+ }
+ },
+ "node_modules/@stoplight/json-schema-merge-allof": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-schema-merge-allof/-/json-schema-merge-allof-0.7.8.tgz",
+ "integrity": "sha512-JTDt6GYpCWQSb7+UW1P91IAp/pcLWis0mmEzWVFcLsrNgtUYK7JLtYYz0ZPSR4QVL0fJ0YQejM+MPq5iNDFO4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "compute-lcm": "^1.1.0",
+ "json-schema-compare": "^0.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/@stoplight/json-schema-ref-parser": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-10.0.0.tgz",
+ "integrity": "sha512-EibmayoGsMCIJOEKNvmsrAq37/M7A/rceY8ZAKX8rhwPThgkJ4QTPF0VhgGyfuq9P6i0EQQXM/x6nL7S2uPGsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jsdevtools/ono": "^7.1.3",
+ "@stoplight/path": "^1.3.2",
+ "@stoplight/yaml": "^4.0.2",
+ "call-me-maybe": "^1.0.1",
+ "url": "^0.11.3"
+ }
+ },
+ "node_modules/@stoplight/json-schema-sampler": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-schema-sampler/-/json-schema-sampler-0.3.0.tgz",
+ "integrity": "sha512-G7QImi2xr9+8iPEg0D9YUi1BWhIiiEm19aMb91oWBSdxuhezOAqqRP3XNY6wczHV9jLWW18f+KkghTy9AG0BQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.7",
+ "json-pointer": "^0.6.1"
+ }
+ },
+ "node_modules/@stoplight/json/node_modules/@stoplight/types": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz",
+ "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/ordered-object-literal": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz",
+ "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@stoplight/path": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz",
+ "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@stoplight/prism-cli": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/prism-cli/-/prism-cli-5.16.0.tgz",
+ "integrity": "sha512-lkkchTfCVwRjo4GC/lDOK4dFZ8Sxggw4O0V5lpiIKPHRpm1MFnLDsjA55PuP5EZHcmV0jpcQn/qVBOoN2YRVtg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/json": "3.21.7",
+ "@stoplight/json-schema-ref-parser": "10.0.0",
+ "@stoplight/prism-core": "^5.16.0",
+ "@stoplight/prism-http": "^5.16.0",
+ "@stoplight/prism-http-server": "^5.16.0",
+ "@stoplight/types": "^14.1.0",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.2",
+ "fp-ts": "^2.11.5",
+ "json-schema-faker": "0.5.9",
+ "jsonrepair": "^3.12.0",
+ "lodash": "^4.17.23",
+ "node-fetch": "^2.6.5",
+ "pino": "^6.13.3",
+ "signale": "^1.4.0",
+ "split2": "^4.2.0",
+ "tslib": "^2.3.1",
+ "uri-template-lite": "^22.9.0",
+ "urijs": "^1.19.11",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "prism": "dist/index.js"
+ },
+ "engines": {
+ "node": ">=24.18.0"
+ }
+ },
+ "node_modules/@stoplight/prism-core": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/prism-core/-/prism-core-5.16.0.tgz",
+ "integrity": "sha512-akuIOfe2jvyPbAu9XOIXP+UpiVl+rctU8laJsxvWsFX2X4m8rANTWC2/682/f35MtJv3h5jCYB4tAt8qJWx/OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "fp-ts": "^2.11.5",
+ "lodash": "^4.17.21",
+ "pino": "^6.13.3",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=24.18.0"
+ }
+ },
+ "node_modules/@stoplight/prism-http": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/prism-http/-/prism-http-5.16.0.tgz",
+ "integrity": "sha512-+ZDU+33I3K7+uO2Ma1dZBgQRD4RarfBzHQcU/o3VMA850ez39H7AqJpMugeG2xKnzzzs8DNA442K2wfT1Ve9NA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@faker-js/faker": "^10.4.0",
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/http-spec": "^7.1.0",
+ "@stoplight/json": "3.21.7",
+ "@stoplight/json-schema-merge-allof": "0.7.8",
+ "@stoplight/json-schema-ref-parser": "10.0.0",
+ "@stoplight/json-schema-sampler": "0.3.0",
+ "@stoplight/prism-core": "^5.16.0",
+ "@stoplight/types": "^14.1.0",
+ "@stoplight/yaml": "^4.2.3",
+ "abstract-logging": "^2.0.1",
+ "accepts": "^1.3.7",
+ "ajv": "^8.20.0",
+ "ajv-formats": "^2.1.1",
+ "caseless": "^0.12.0",
+ "chalk": "^4.1.2",
+ "content-type": "^1.0.4",
+ "fp-ts": "^2.11.5",
+ "http-proxy-agent": "^9.0.0",
+ "https-proxy-agent": "^9.0.0",
+ "json-schema-faker": "0.5.8",
+ "lodash": "^4.17.23",
+ "node-fetch": "^2.6.5",
+ "parse-multipart-data": "^1.5.0",
+ "pino": "^6.13.3",
+ "seedrandom": "^3.0.5",
+ "tslib": "^2.3.1",
+ "type-is": "^1.6.18",
+ "uri-template-lite": "^22.9.0",
+ "whatwg-mimetype": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=24.18.0"
+ }
+ },
+ "node_modules/@stoplight/prism-http-server": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/prism-http-server/-/prism-http-server-5.16.0.tgz",
+ "integrity": "sha512-vdbxE45cNjm4DNg/4igLqrS+9LyL5TSrf3FUYGDLBRcW5YGd5JvDdoMOi7nlAnilK9gpa2cHQbxEYkomZkJj7Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/prism-core": "^5.16.0",
+ "@stoplight/prism-http": "^5.16.0",
+ "@stoplight/types": "^14.1.0",
+ "fast-xml-parser": "^5.5.7",
+ "fp-ts": "^2.11.5",
+ "io-ts": "^2.2.16",
+ "lodash": "^4.17.23",
+ "micri": "^4.3.0",
+ "node-fetch": "^2.6.5",
+ "parse-prefer-header": "1.0.0",
+ "tslib": "^2.3.1",
+ "type-is": "^1.6.18"
+ },
+ "engines": {
+ "node": ">=24.18.0"
+ }
+ },
+ "node_modules/@stoplight/prism-http/node_modules/json-schema-faker": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.8.tgz",
+ "integrity": "sha512-sqzPEbEDlpiH8U1tfmJHScXHy52onvMxITPsHyhe/jhS83g8TX6ruvRqt/ot1bXUPRsh7Ps1sWqJiBxIXmW5Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-schema-ref-parser": "^6.1.0",
+ "jsonpath-plus": "^10.1.0"
+ },
+ "bin": {
+ "jsf": "bin/gen.cjs"
+ }
+ },
+ "node_modules/@stoplight/types": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz",
+ "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/yaml": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz",
+ "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/ordered-object-literal": "^1.0.5",
+ "@stoplight/types": "^14.1.1",
+ "@stoplight/yaml-ast-parser": "0.0.50",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.8"
+ }
+ },
+ "node_modules/@stoplight/yaml-ast-parser": {
+ "version": "0.0.50",
+ "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz",
+ "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.15.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz",
+ "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/swagger-schema-official": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.25.tgz",
+ "integrity": "sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/type-is": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.7.tgz",
+ "integrity": "sha512-gEsh7n8824nusZ2Sidh6POxNsIdTSvIAl5gXbeFj+TUaD1CO2r4i7MQYNMfEQkChU42s2bVWAda6x6BzIhtFbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/abstract-logging": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
+ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz",
+ "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
+ "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-me-maybe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
+ "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/charset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz",
+ "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz",
+ "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/compute-gcd": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz",
+ "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==",
+ "dev": true,
+ "dependencies": {
+ "validate.io-array": "^1.0.3",
+ "validate.io-function": "^1.0.2",
+ "validate.io-integer-array": "^1.0.0"
+ }
+ },
+ "node_modules/compute-lcm": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz",
+ "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==",
+ "dev": true,
+ "dependencies": {
+ "compute-gcd": "^1.2.1",
+ "validate.io-array": "^1.0.3",
+ "validate.io-function": "^1.0.2",
+ "validate.io-integer-array": "^1.0.0"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
+ "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.7.0"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-redact": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz",
+ "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz",
+ "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.6.2",
+ "xml-naming": "^0.3.0"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.11.2",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.2.tgz",
+ "integrity": "sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@nodable/entities": "^3.0.1",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^2.0.0",
+ "path-expression-matcher": "^1.6.2",
+ "strnum": "^2.4.2",
+ "xml-naming": "^0.3.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+ "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flatstr": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
+ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fnv-plus": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz",
+ "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/foreach": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz",
+ "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/format-util": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz",
+ "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fp-ts": {
+ "version": "2.16.11",
+ "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz",
+ "integrity": "sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/handler-agent": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/handler-agent/-/handler-agent-0.2.0.tgz",
+ "integrity": "sha512-cUduQxa5p3TFtGmb55mrRbkk/3EJCsLSeFrCIuTakQHQlYVWXeW2L9IUQUHyoHLI4UgpBNaN2JrZ0He1jPu+vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/http-reasons": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz",
+ "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/io-ts": {
+ "version": "2.2.22",
+ "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz",
+ "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "fp-ts": "^2.5.0"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-unsafe": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz",
+ "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.15.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz",
+ "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsep": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.6.0.tgz",
+ "integrity": "sha512-Y8Tr54CX7B5YGAwo7/n8eumidEX3Opx98RyyQVnlHqUaZcPA8uUzL2v1rshr9ypW9Q6hNjfJtg3sL+8kaNE7TA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.16.0"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-pointer": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz",
+ "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "foreach": "^2.0.4"
+ }
+ },
+ "node_modules/json-promise": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/json-promise/-/json-promise-1.1.8.tgz",
+ "integrity": "sha512-rz31P/7VfYnjQFrF60zpPTT0egMPlc8ZvIQHWs4ZtNZNnAXRmXo6oS+6eyWr5sEMG03OVhklNrTXxiIRYzoUgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "*"
+ }
+ },
+ "node_modules/json-schema-compare": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz",
+ "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/json-schema-faker": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz",
+ "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-schema-ref-parser": "^6.1.0",
+ "jsonpath-plus": "^10.3.0"
+ },
+ "bin": {
+ "jsf": "bin/gen.cjs"
+ }
+ },
+ "node_modules/json-schema-ref-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz",
+ "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==",
+ "deprecated": "Please switch to @apidevtools/json-schema-ref-parser",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-me-maybe": "^1.0.1",
+ "js-yaml": "^3.12.1",
+ "ono": "^4.0.11"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/jsonc-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
+ "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonpath-plus": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz",
+ "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jsep-plugin/assignment": "^1.3.0",
+ "@jsep-plugin/regex": "^1.0.4",
+ "jsep": "^1.4.0"
+ },
+ "bin": {
+ "jsonpath": "bin/jsonpath-cli.js",
+ "jsonpath-plus": "bin/jsonpath-cli.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/jsonrepair": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.15.0.tgz",
+ "integrity": "sha512-wy8OTjwsJwQRnQJkKnMJJ9vcytRdBPAgIF/Hy6+s1dAj42BHMKiyL8JzEieIl3JY7idt8eyHwBWTO8mh/+mtwA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "jsonrepair": "bin/cli.js"
+ }
+ },
+ "node_modules/liquid-json": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz",
+ "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micri": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/micri/-/micri-4.5.1.tgz",
+ "integrity": "sha512-AtvnSBGFglNr+iqs5gufpHT9xRXUabgu9vYEnQYPXSBs+nLSBvmUS5Mzg+3LJ9eQBrNA1o5M49WeqiX1f+d2sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "handler-agent": "0.2.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-format": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz",
+ "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "charset": "^1.0.0"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ono": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz",
+ "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "format-util": "^1.0.3"
+ }
+ },
+ "node_modules/openapi-fetch": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz",
+ "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==",
+ "license": "MIT",
+ "dependencies": {
+ "openapi-typescript-helpers": "^0.1.0"
+ }
+ },
+ "node_modules/openapi-typescript": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz",
+ "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/openapi-core": "^1.34.6",
+ "ansi-colors": "^4.1.3",
+ "change-case": "^5.4.4",
+ "parse-json": "^8.3.0",
+ "supports-color": "^10.2.2",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "openapi-typescript": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "typescript": "^5.x"
+ }
+ },
+ "node_modules/openapi-typescript-helpers": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz",
+ "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==",
+ "license": "MIT"
+ },
+ "node_modules/openapi-typescript/node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/openapi-typescript/node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/openapi-typescript/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/openapi3-ts": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz",
+ "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yaml": "^1.10.2"
+ }
+ },
+ "node_modules/openapi3-ts/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parse-multipart-data": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz",
+ "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse-prefer-header": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-prefer-header/-/parse-prefer-header-1.0.0.tgz",
+ "integrity": "sha512-+WJ3ncCrKOExuxF06XyKWS8bLkLttnlm6YPMZIFIUXNd09Xy0N2JISudxCaY+luDm43yTnHMHVU3zte4G2gN4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-expression-matcher": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz",
+ "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pino": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz",
+ "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-redact": "^3.0.0",
+ "fast-safe-stringify": "^2.0.8",
+ "flatstr": "^1.0.12",
+ "pino-std-serializers": "^3.1.0",
+ "process-warning": "^1.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "sonic-boom": "^1.0.2"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz",
+ "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pkg-conf": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
+ "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^2.0.0",
+ "load-json-file": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postman-collection": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz",
+ "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@faker-js/faker": "5.5.3",
+ "file-type": "3.9.0",
+ "http-reasons": "0.1.0",
+ "iconv-lite": "0.6.3",
+ "liquid-json": "0.3.1",
+ "lodash": "4.17.21",
+ "mime-format": "2.0.1",
+ "mime-types": "2.1.35",
+ "postman-url-encoder": "3.0.5",
+ "semver": "7.6.3",
+ "uuid": "8.3.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postman-collection/node_modules/@faker-js/faker": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz",
+ "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==",
+ "deprecated": "Please update to a newer version.",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/postman-collection/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/postman-url-encoder": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz",
+ "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pretty-data": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz",
+ "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
+ "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/proxy-agent-negotiate": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz",
+ "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "kerberos": "^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "kerberos": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.16.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz",
+ "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "es-define-property": "^1.0.1",
+ "side-channel": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz",
+ "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
+ "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.3.2",
+ "figures": "^2.0.0",
+ "pkg-conf": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/signale/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signale/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signale/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/signale/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/signale/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/signale/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sonic-boom": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz",
+ "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0",
+ "flatstr": "^1.0.12"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.5.1.tgz",
+ "integrity": "sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anynum": "^1.0.1"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uri-js-replace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz",
+ "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uri-template-lite": {
+ "version": "22.9.0",
+ "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.9.0.tgz",
+ "integrity": "sha512-cmGZaykSWEQ5UXKaGKnUS8zFvfp8j1Jvn7dlq3P7tGd5XeybXcfo0xnVBRWiNEp80nO1GYgCLwoaRJ8WMmmk3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/urijs": {
+ "version": "1.19.11",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
+ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/url": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+ "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.12.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/validate.io-array": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz",
+ "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/validate.io-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz",
+ "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==",
+ "dev": true
+ },
+ "node_modules/validate.io-integer": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz",
+ "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==",
+ "dev": true,
+ "dependencies": {
+ "validate.io-number": "^1.0.3"
+ }
+ },
+ "node_modules/validate.io-integer-array": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz",
+ "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==",
+ "dev": true,
+ "dependencies": {
+ "validate.io-array": "^1.0.3",
+ "validate.io-integer": "^1.0.4"
+ }
+ },
+ "node_modules/validate.io-number": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz",
+ "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==",
+ "dev": true
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/xml-naming": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz",
+ "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz",
+ "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yaml-ast-parser": {
+ "version": "0.0.43",
+ "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
+ "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/yargs": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz",
+ "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/cli": {
+ "name": "@qrun-io/qqq-cli",
+ "version": "0.1.0-rc.1",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@qrun-io/qqq-ui-api-client": "1.6.0-rc.1",
+ "commander": "15.0.0"
+ },
+ "bin": {
+ "qqq": "dist/main.js"
+ }
+ },
+ "packages/conformance": {
+ "name": "@qrun-io/qqq-ui-api-conformance",
+ "version": "1.6.0-rc.1",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ajv": "8.20.0"
+ },
+ "bin": {
+ "qqq-dev-idp": "dist/dev-idp.js",
+ "qqq-ui-api-conformance": "dist/main.js"
+ }
+ },
+ "packages/ui-api-client": {
+ "name": "@qrun-io/qqq-ui-api-client",
+ "version": "1.6.0-rc.1",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "openapi-fetch": "0.17.0"
+ },
+ "devDependencies": {
+ "openapi-typescript": "7.13.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7bb4405
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "qqq-cli-workspace",
+ "private": true,
+ "description": "Reference CLI, generated TypeScript client, mock server and conformance suite for the QQQ UI API (/qqq/v1).",
+ "license": "Apache-2.0",
+ "type": "module",
+ "engines": {
+ "node": ">=20"
+ },
+ "workspaces": [
+ "packages/ui-api-client",
+ "packages/conformance",
+ "packages/cli"
+ ],
+ "scripts": {
+ "spec:merge": "node scripts/merge-spec.mjs --out packages/ui-api-client/openapi/qqq-v1.json",
+ "generate": "npm run generate -w @qrun-io/qqq-ui-api-client",
+ "build": "npm run build -w @qrun-io/qqq-ui-api-client && npm run build -w @qrun-io/qqq-ui-api-conformance && npm run build -w @qrun-io/qqq-cli",
+ "test": "npm test --workspaces --if-present",
+ "mock": "prism mock --dynamic --port 4010 packages/ui-api-client/openapi/qqq-v1.json"
+ },
+ "devDependencies": {
+ "@stoplight/prism-cli": "5.16.0",
+ "@types/node": "22.15.3",
+ "typescript": "5.8.3",
+ "yaml": "2.9.1"
+ }
+}
diff --git a/packages/cli/package.json b/packages/cli/package.json
new file mode 100644
index 0000000..14fc5d3
--- /dev/null
+++ b/packages/cli/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@qrun-io/qqq-cli",
+ "version": "0.1.0-rc.1",
+ "description": "Reference command-line client for QQQ applications, built only on the QQQ UI API (/qqq/v1).",
+ "license": "Apache-2.0",
+ "type": "module",
+ "bin": {
+ "qqq": "dist/main.js"
+ },
+ "files": [
+ "dist",
+ "README.md"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/QRun-IO/qqq-cli.git",
+ "directory": "packages/cli"
+ },
+ "publishConfig": {
+ "registry": "https://npm.pkg.github.com"
+ },
+ "scripts": {
+ "build": "tsc -p tsconfig.json",
+ "test": "node --test \"dist/test/*.test.js\""
+ },
+ "dependencies": {
+ "@qrun-io/qqq-ui-api-client": "1.6.0-rc.1",
+ "commander": "15.0.0"
+ }
+}
diff --git a/packages/cli/src/format.ts b/packages/cli/src/format.ts
new file mode 100644
index 0000000..4680d41
--- /dev/null
+++ b/packages/cli/src/format.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+import type { components } from "@qrun-io/qqq-ui-api-client"
+
+type Json = Record
+type Operator = NonNullable
+
+const OPERATORS = new Set([
+ 'EQUALS', 'NOT_EQUALS', 'NOT_EQUALS_OR_IS_NULL', 'IN', 'NOT_IN', 'IS_NULL_OR_IN', 'LIKE', 'NOT_LIKE', 'STARTS_WITH', 'ENDS_WITH',
+ 'CONTAINS', 'CONTAINS_ALL', 'NOT_STARTS_WITH', 'NOT_ENDS_WITH', 'NOT_CONTAINS', 'LESS_THAN', 'LESS_THAN_OR_EQUALS', 'GREATER_THAN',
+ 'GREATER_THAN_OR_EQUALS', 'IS_BLANK', 'IS_NOT_BLANK', 'BETWEEN', 'NOT_BETWEEN', 'TRUE', 'FALSE',
+])
+
+const SHORTHAND: Record = {
+ '=': 'EQUALS', '==': 'EQUALS', '!=': 'NOT_EQUALS', '<': 'LESS_THAN', '<=': 'LESS_THAN_OR_EQUALS', '>': 'GREATER_THAN',
+ '>=': 'GREATER_THAN_OR_EQUALS', '~': 'CONTAINS',
+}
+
+/** A filter criterion of the UI API (FilterCriteria). */
+export interface Criterion {
+ fieldName: string
+ operator: Operator
+ values: string[]
+}
+
+/**
+ * Parses `field OPERATOR value[,value]` (operators as in FilterCriteria, or =, !=, <, <=, >, >=, ~).
+ *
+ * @param text - The criterion.
+ * @param fields - The table's fields (to check the name).
+ */
+export function parseCriteria(text: string, fields: Record): Criterion {
+ const match = /^\s*(\S+)\s+(\S+)\s*(.*)$/.exec(text)
+ if (!match) throw new Error(`Criteria must be "field OPERATOR value": ${text}`)
+ const [, fieldName, rawOperator, rest] = match
+ const operator = SHORTHAND[rawOperator] ?? rawOperator.toUpperCase()
+ if (!OPERATORS.has(operator)) throw new Error(`Unknown operator ${rawOperator}; use one of ${[...OPERATORS].join(', ')}`)
+ if (Object.keys(fields).length && !(fieldName in fields)) throw new Error(`No field ${fieldName}; fields: ${Object.keys(fields).join(', ')}`)
+ const values = rest === '' ? [] : ['IN', 'NOT_IN', 'IS_NULL_OR_IN', 'BETWEEN', 'NOT_BETWEEN', 'CONTAINS_ALL'].includes(operator) ? rest.split(',').map((v) => v.trim()) : [rest.trim()]
+ return { fieldName, operator: operator as Operator, values }
+}
+
+/** Parses `name=value` pairs. */
+export function parseValues(pairs: string[]): Record {
+ const values: Record = {}
+ for (const pair of pairs) {
+ const at = pair.indexOf('=')
+ if (at < 1) throw new Error(`Values are name=value: ${pair}`)
+ values[pair.slice(0, at)] = pair.slice(at + 1)
+ }
+ return values
+}
+
+/** A record's value as text: its display value when the server sent one. */
+export function valueText(record: Json, field: string): string {
+ const display = (record.displayValues as Json | undefined)?.[field]
+ const raw = (record.values as Json | undefined)?.[field]
+ const value = display ?? raw
+ if (value === null || value === undefined) return ''
+ return typeof value === 'object' ? JSON.stringify(value) : String(value)
+}
+
+/**
+ * Formats rows as an aligned text table.
+ *
+ * @param rows - Objects.
+ * @param columns - Keys to show.
+ * @param headers - Optional header labels.
+ */
+export function formatTable(rows: Array>, columns: string[], headers: string[] = columns): string {
+ const cell = (v: unknown) => (v === null || v === undefined ? '' : String(v)).replace(/\s+/g, ' ').slice(0, 60)
+ const widths = columns.map((c, i) => Math.max(headers[i].length, ...rows.map((r) => cell(r[c]).length)))
+ const line = (cells: string[]) => cells.map((c, i) => c.padEnd(widths[i])).join(' ').trimEnd()
+ return [line(headers), line(widths.map((w) => '-'.repeat(w))), ...rows.map((r) => line(columns.map((c) => cell(r[c]))))].join('\n')
+}
diff --git a/packages/cli/src/main.ts b/packages/cli/src/main.ts
new file mode 100644
index 0000000..4026b4c
--- /dev/null
+++ b/packages/cli/src/main.ts
@@ -0,0 +1,278 @@
+#!/usr/bin/env node
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * qqq - a reference command-line client for QQQ applications. Every call is an operation of the
+ * QQQ UI API (/qqq/v1), through the generated @qrun-io/qqq-ui-api-client; nothing is hard-coded
+ * about an application: apps, tables, fields and processes all come from metadata.
+ */
+
+import { Command } from 'commander'
+import {
+ UiApiError, decodeJwtClaims, deviceSignIn, openRealtimeStream, unwrap, UI_API_VERSION,
+} from '@qrun-io/qqq-ui-api-client'
+import { CLIENT_CHANNEL, CLI_VERSION, clientFor, currentToken, getLogin, nativeConfig, removeLogin, resolveServer, saveLogin } from './session.js'
+import { formatTable, parseCriteria, parseValues, valueText } from './format.js'
+
+type Json = Record
+
+const program = new Command()
+program
+ .name('qqq')
+ .description('Reference CLI for QQQ applications, built only on the QQQ UI API (/qqq/v1).')
+ .version(`${CLI_VERSION} (UI API client ${UI_API_VERSION})`)
+ .option('-s, --server ', 'the QQQ server (default: QQQ_SERVER, or the last one signed in to)')
+ .option('--json', 'print JSON instead of tables')
+
+function server(): string {
+ return resolveServer(program.opts().server)
+}
+
+function json(): boolean {
+ return Boolean(program.opts().json)
+}
+
+function print(data: unknown, table?: () => string): void {
+ console.log(json() || !table ? JSON.stringify(data, null, 2) : table())
+}
+
+program.command('login')
+ .description('Sign in with the device-authorization grant (approve the code in any browser).')
+ .action(async () => {
+ const origin = server()
+ const config = await nativeConfig(origin)
+ const tokens = await deviceSignIn(config, (prompt) => {
+ console.error(`To sign in to ${origin}, open:\n\n ${prompt.verificationUriComplete ?? prompt.verificationUri}\n`)
+ console.error(`and confirm the code ${prompt.userCode} (it expires in ${Math.round(prompt.expiresIn / 60)} minutes).`)
+ console.error('Waiting for approval...')
+ })
+ saveLogin(origin, { config, tokens })
+ const claims = decodeJwtClaims(tokens.accessToken)
+ console.error(`Signed in to ${origin} as ${claims.email ?? claims.preferred_username ?? claims.sub}.`)
+ })
+
+program.command('logout')
+ .description('Forget this server\'s tokens.')
+ .action(() => {
+ const origin = server()
+ console.error(removeLogin(origin) ? `Signed out of ${origin}.` : `Not signed in to ${origin}.`)
+ })
+
+program.command('whoami')
+ .description('Show the signed-in user, the server version and its extensions.')
+ .action(async () => {
+ const origin = server()
+ const client = clientFor(origin)
+ const version = await unwrap(client.GET('/qqq/v1/version')) as Json
+ const token = await currentToken(origin)
+ const claims = token && token.includes('.') ? decodeJwtClaims(token) : {}
+ const metaData = await unwrap(client.GET('/qqq/v1/metaData', {})) as Json
+ const login = getLogin(origin)
+ const result = {
+ server: origin,
+ user: claims.email ?? claims.preferred_username ?? claims.sub,
+ name: claims.name,
+ tokenExpires: login ? new Date(login.tokens.expiresAt).toISOString() : undefined,
+ apiVersion: version.apiVersion,
+ extensions: (version.extensions as Json[] | undefined)?.map((e) => `${e.name} ${e.version}`),
+ apps: Object.keys((metaData.apps ?? {}) as Json).length,
+ tables: Object.keys((metaData.tables ?? {}) as Json).length,
+ processes: Object.keys((metaData.processes ?? {}) as Json).length,
+ }
+ print(result, () => Object.entries(result).map(([k, v]) => `${k.padEnd(13)} ${Array.isArray(v) ? v.join(', ') : v ?? ''}`).join('\n'))
+ })
+
+program.command('apps')
+ .description('List the apps you may use.')
+ .action(async () => {
+ const metaData = await unwrap(clientFor(server()).GET('/qqq/v1/metaData', {})) as Json
+ const apps = Object.values((metaData.apps ?? {}) as Record)
+ .map((a) => ({ name: a.name, label: a.label, items: (a.children as unknown[] | undefined)?.length ?? 0 }))
+ .sort((a, b) => String(a.label).localeCompare(String(b.label)))
+ print(apps, () => formatTable(apps, ['name', 'label', 'items']))
+ })
+
+program.command('tables')
+ .description('List the tables you may read (optionally of one app).')
+ .option('-a, --app ', 'only tables in this app')
+ .action(async (options: { app?: string }) => {
+ const metaData = await unwrap(clientFor(server()).GET('/qqq/v1/metaData', {})) as Json
+ let tables = Object.values((metaData.tables ?? {}) as Record).filter((t) => !t.isHidden && t.readPermission !== false)
+ if (options.app) {
+ const app = (metaData.apps as Record | undefined)?.[options.app]
+ if (!app) throw new Error(`No app named ${options.app} (see \`qqq apps\`)`)
+ const names = new Set()
+ const visit = (node: Json | undefined, seen: Set) => {
+ for (const child of (node?.children ?? []) as Json[]) {
+ if (child.type === 'TABLE') names.add(child.name)
+ else if (child.type === 'APP' && !seen.has(child.name)) visit((metaData.apps as Record)[String(child.name)], seen.add(child.name))
+ }
+ }
+ visit(app, new Set([options.app]))
+ tables = tables.filter((t) => names.has(t.name))
+ }
+ const rows = tables.map((t) => ({ name: t.name, label: t.label, insert: t.insertPermission ? 'yes' : '', edit: t.editPermission ? 'yes' : '', delete: t.deletePermission ? 'yes' : '' }))
+ .sort((a, b) => String(a.label).localeCompare(String(b.label)))
+ print(rows, () => formatTable(rows, ['name', 'label', 'insert', 'edit', 'delete']))
+ })
+
+program.command('query ')
+ .description('Query a table. Criteria: "field OPERATOR value[,value]", e.g. "status EQUALS active" or "id GREATER_THAN 10".')
+ .option('-w, --where ', 'criteria (ANDed)')
+ .option('--or', 'OR the criteria instead')
+ .option('-o, --order ', 'order by a field (prefix with - for descending)')
+ .option('-l, --limit ', 'most records to return', '25')
+ .option('-f, --fields ', 'comma-separated fields to show (default: the first few)')
+ .action(async (table: string, options: { where?: string[]; or?: boolean; order?: string; limit: string; fields?: string }) => {
+ const client = clientFor(server())
+ const meta = await unwrap(client.GET('/qqq/v1/metaData/table/{tableName}', { params: { path: { tableName: table } } })) as Json
+ const fieldMeta = (meta.fields ?? {}) as Record
+ const criteria = (options.where ?? []).map((text) => parseCriteria(text, fieldMeta))
+ const order = options.order ? [{ fieldName: options.order.replace(/^-/, ''), isAscending: !options.order.startsWith('-') }] : undefined
+ const body = { filter: { criteria, booleanOperator: options.or ? 'OR' as const : 'AND' as const, orderBys: order, limit: Number(options.limit) } }
+ const result = await unwrap(client.POST('/qqq/v1/table/{tableName}/query', { params: { path: { tableName: table } }, body })) as Json
+ const records = (result.records ?? []) as Json[]
+ const fields = options.fields ? options.fields.split(',') : defaultFields(meta)
+ const rows = records.map((r) => Object.fromEntries(fields.map((f) => [f, valueText(r, f)])))
+ print(json() ? records : rows, () => `${formatTable(rows, fields, fields.map((f) => String(fieldMeta[f]?.label ?? f)))}\n(${records.length} record${records.length === 1 ? '' : 's'})`)
+ })
+
+program.command('get ')
+ .description('View one record, with field labels and display values.')
+ .action(async (table: string, primaryKey: string) => {
+ const client = clientFor(server())
+ const meta = await unwrap(client.GET('/qqq/v1/metaData/table/{tableName}', { params: { path: { tableName: table } } })) as Json
+ const result = await unwrap(client.GET('/qqq/v1/table/{tableName}/{primaryKey}', { params: { path: { tableName: table, primaryKey } } })) as Json
+ const record = (result.record ?? result) as Json
+ const fieldMeta = (meta.fields ?? {}) as Record
+ const rows = Object.keys(fieldMeta).filter((f) => !fieldMeta[f].isHidden)
+ .map((f) => ({ field: String(fieldMeta[f].label ?? f), value: valueText(record, f) }))
+ print(record, () => `${record.recordLabel ?? `${meta.label} ${primaryKey}`}\n${formatTable(rows, ['field', 'value'], ['Field', 'Value'])}`)
+ })
+
+program.command('run ')
+ .description('Run a process: init, then each step until it completes; prints its results.')
+ .option('-v, --value ', 'process input values')
+ .option('-r, --records ', 'comma-separated primary keys of the process table\'s records to run on')
+ .option('--timeout ', 'how long each step may run synchronously', '60000')
+ .action(async (processName: string, options: { value?: string[]; records?: string; timeout: string }) => {
+ const client = clientFor(server())
+ const meta = await unwrap(client.GET('/qqq/v1/metaData/process/{processName}', { params: { path: { processName } } })) as Json
+ const steps = ((meta.frontendSteps ?? []) as Json[]).map((s) => String(s.name))
+ const values = parseValues(options.value ?? [])
+ const form = (extra: Record) => {
+ const data = new FormData()
+ data.append('values', JSON.stringify(values))
+ data.append('stepTimeoutMillis', options.timeout)
+ for (const [k, v] of Object.entries(extra)) data.append(k, v)
+ return data
+ }
+ const records: Record = options.records ? { recordsParam: 'recordIds', recordIds: options.records } : {}
+ let response = await unwrap(client.POST('/qqq/v1/processes/{processName}/init', {
+ params: { path: { processName } }, body: {} as never, bodySerializer: () => form(records),
+ })) as Json
+ console.error(`${meta.label ?? processName}: started (${response.processUUID})`)
+
+ for (let guard = 0; guard < 50; guard++) {
+ response = await waitForJob(client, processName, response)
+ if (response.type === 'ERROR' || response.error) throw new Error(String(response.userFacingError ?? response.error))
+ const next = response.nextStep as string | undefined
+ if (!next) break
+ const isLast = steps.indexOf(next) === steps.length - 1
+ console.error(` step ${next}${isLast ? ' (results)' : ''}`)
+ if (isLast) break
+ response = await unwrap(client.POST('/qqq/v1/processes/{processName}/{processUUID}/step/{stepName}', {
+ params: { path: { processName, processUUID: String(response.processUUID), stepName: next } }, body: {} as never, bodySerializer: () => form({}),
+ })) as Json
+ }
+
+ const out = (response.values ?? {}) as Json
+ const summary = (out.processResults ?? out.recordListSummary ?? []) as Json[]
+ if (json()) return print(response)
+ if (Array.isArray(summary) && summary.length) {
+ for (const line of summary) console.log(`[${line.status ?? 'INFO'}] ${line.count ?? ''} ${line.message ?? ''}`.replace(/\s+/g, ' ').trim())
+ } else {
+ const shown = Object.entries(out).filter(([, v]) => v !== null && typeof v !== 'object').slice(0, 20)
+ console.log(shown.length ? formatTable(shown.map(([k, v]) => ({ value: k, result: String(v) })), ['value', 'result']) : 'Done.')
+ }
+ })
+
+program.command('jobs')
+ .description('List your jobs (durable and tracked processes).')
+ .option('--all', 'all states (default: active and recent)')
+ .action(async (options: { all?: boolean }) => {
+ let result: Json
+ try {
+ result = await unwrap(clientFor(server()).GET('/qqq/v1/jobs', { params: { query: { scope: 'mine', ...(options.all ? {} : { state: 'active' }) } as never } })) as Json
+ } catch (error) {
+ if (error instanceof UiApiError && error.status === 404) throw new Error('This server has no jobs operations (durable jobs are not enabled on it).')
+ throw error
+ }
+ const jobs = ((result.jobs ?? []) as Json[]).map((j) => ({ id: j.jobId, label: j.label ?? j.processName, status: j.status, percent: j.percent ?? '', message: j.message ?? '' }))
+ print(result, () => `${formatTable(jobs, ['id', 'label', 'status', 'percent', 'message'])}\n(${result.activeCount ?? 0} active)`)
+ })
+
+program.command('tail')
+ .description('Follow your jobs and notifications live (realtime stream, channel user:me).')
+ .option('-c, --channel ', 'more channels, e.g. table:person or record:person:42')
+ .action(async (options: { channel?: string[] }) => {
+ const origin = server()
+ const client = clientFor(origin)
+ const controller = new AbortController()
+ process.on('SIGINT', () => controller.abort())
+ for await (const message of openRealtimeStream({ baseUrl: origin, token: () => currentToken(origin), clientChannel: CLIENT_CHANNEL, signal: controller.signal })) {
+ const data = (message.data ?? {}) as Json
+ if (message.event === 'hello') {
+ const connectionId = String(data.connectionId ?? (data.data as Json | undefined)?.connectionId ?? '')
+ const add = ['user:me', ...(options.channel ?? [])]
+ await unwrap(client.POST('/qqq/v1/realtime/subscriptions', { body: { connectionId, add } }))
+ console.error(`Following ${add.join(', ')} on ${origin} (Ctrl-C to stop).`)
+ continue
+ }
+ if (json()) {
+ console.log(JSON.stringify(message))
+ continue
+ }
+ const payload = (data.data ?? data) as Json
+ const time = new Date().toISOString().slice(11, 19)
+ const detail = payload.label ?? payload.title ?? payload.message ?? payload.jobId ?? ''
+ const progress = payload.percent !== undefined && payload.percent !== null ? ` ${payload.percent}%` : ''
+ console.log(`${time} ${message.event}${data.channel ? ` [${data.channel}]` : ''} ${detail}${progress}${payload.status ? ` ${payload.status}` : ''}`.trim())
+ }
+ })
+
+/** The fields a query shows by default: the primary key and the next few visible fields. */
+function defaultFields(meta: Json): string[] {
+ const fields = Object.values((meta.fields ?? {}) as Record).filter((f) => !f.isHidden && !f.isHeavy).map((f) => String(f.name))
+ const pk = String(meta.primaryKeyField ?? 'id')
+ return [pk, ...fields.filter((f) => f !== pk)].slice(0, 6)
+}
+
+/** Polls an asynchronous step (JOB_STARTED / RUNNING) until it completes. */
+async function waitForJob(client: ReturnType, processName: string, response: Json): Promise {
+ let current = response
+ while (current.type === 'JOB_STARTED' || current.type === 'RUNNING') {
+ const jobUUID = String(current.jobUUID ?? response.jobUUID)
+ await new Promise((resolve) => setTimeout(resolve, 1000))
+ current = await unwrap(client.GET('/qqq/v1/processes/{processName}/{processUUID}/status/{jobUUID}', {
+ params: { path: { processName, processUUID: String(response.processUUID), jobUUID } },
+ })) as Json
+ if (current.type === 'RUNNING') console.error(` running ${current.current ?? ''}/${current.total ?? ''} ${current.message ?? ''}`)
+ current = { ...current, jobUUID, processUUID: response.processUUID }
+ }
+ return current
+}
+
+program.parseAsync().catch((error: unknown) => {
+ if (error instanceof UiApiError) {
+ console.error(`Error: ${error.message} (${error.code}, HTTP ${error.status}${error.traceId ? `, trace ${error.traceId}` : ''})`)
+ for (const fieldError of error.fieldErrors) console.error(` ${fieldError.field}: ${fieldError.message}`)
+ if (error.code === 'UNAUTHENTICATED') console.error('Sign in again with `qqq login`.')
+ } else {
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`)
+ }
+ process.exitCode = 1
+})
diff --git a/packages/cli/src/session.ts b/packages/cli/src/session.ts
new file mode 100644
index 0000000..6359c31
--- /dev/null
+++ b/packages/cli/src/session.ts
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * Credentials and the authenticated client for one server. Tokens are kept in
+ * ~/.config/qqq-cli/credentials.json (mode 0600), per server origin, or come from QQQ_TOKEN
+ * (any bearer token: an access token or a session UUID).
+ */
+
+import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
+import { homedir } from 'node:os'
+import { join } from 'node:path'
+import {
+ createUiApiClient, getNativeSignInConfig, isExpiring, refreshTokens,
+ type NativeSignInConfig, type TokenSet, type UiApiClient,
+} from '@qrun-io/qqq-ui-api-client'
+
+export const CLI_VERSION = '0.1.0-rc.1'
+export const CLIENT_CHANNEL = `cli/qqq-cli ${CLI_VERSION}`
+
+/** What is stored per server. */
+export interface StoredLogin {
+ config: NativeSignInConfig
+ tokens: TokenSet
+}
+
+interface Store {
+ defaultServer?: string
+ servers: Record
+}
+
+const dir = process.env.QQQ_CLI_HOME ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'qqq-cli')
+const file = join(dir, 'credentials.json')
+
+function readStore(): Store {
+ if (!existsSync(file)) return { servers: {} }
+ return JSON.parse(readFileSync(file, 'utf8')) as Store
+}
+
+function writeStore(store: Store): void {
+ mkdirSync(dir, { recursive: true, mode: 0o700 })
+ writeFileSync(file, JSON.stringify(store, null, 2), { mode: 0o600 })
+ try {
+ chmodSync(file, 0o600)
+ } catch {
+ // not supported on every file system (e.g. some Windows volumes)
+ }
+}
+
+/** The server to use: --server, else QQQ_SERVER, else the last one signed in to. */
+export function resolveServer(option?: string): string {
+ const server = option ?? process.env.QQQ_SERVER ?? readStore().defaultServer
+ if (!server) throw new Error('No server: pass --server https://... or set QQQ_SERVER (or run `qqq login --server ...`).')
+ return new URL(server).origin
+}
+
+/** Keeps a new sign-in for a server, and makes it the default server. */
+export function saveLogin(server: string, login: StoredLogin): void {
+ const store = readStore()
+ store.servers[server] = login
+ store.defaultServer = server
+ writeStore(store)
+}
+
+/** Forgets a server's tokens. */
+export function removeLogin(server: string): boolean {
+ const store = readStore()
+ const had = server in store.servers
+ delete store.servers[server]
+ if (store.defaultServer === server) delete store.defaultServer
+ writeStore(store)
+ return had
+}
+
+/** The stored sign-in of a server, if any. */
+export function getLogin(server: string): StoredLogin | undefined {
+ return readStore().servers[server]
+}
+
+/** Fetches the native sign-in config of a server. */
+export function nativeConfig(server: string): Promise {
+ return getNativeSignInConfig(server)
+}
+
+/**
+ * Returns the current bearer token for a server, refreshing it at the provider when it is about to
+ * expire (QQQ_TOKEN overrides everything).
+ *
+ * @param server - Server origin.
+ * @param force - Refresh even when not expiring (after a 401).
+ */
+export async function currentToken(server: string, force = false): Promise {
+ if (process.env.QQQ_TOKEN) return process.env.QQQ_TOKEN
+ const login = getLogin(server)
+ if (!login) return undefined
+ if ((force || isExpiring(login.tokens)) && login.tokens.refreshToken) {
+ const tokens = await refreshTokens(login.config, login.tokens.refreshToken)
+ saveLogin(server, { config: login.config, tokens })
+ return tokens.accessToken
+ }
+ return login.tokens.accessToken
+}
+
+/** An authenticated UI API client for a server (refreshes once on 401). */
+export function clientFor(server: string): UiApiClient {
+ return createUiApiClient({
+ baseUrl: server,
+ clientChannel: CLIENT_CHANNEL,
+ token: () => currentToken(server),
+ onUnauthorized: async () => {
+ if (process.env.QQQ_TOKEN || !getLogin(server)?.tokens.refreshToken) return false
+ try {
+ await currentToken(server, true)
+ return true
+ } catch {
+ return false
+ }
+ },
+ })
+}
diff --git a/packages/cli/src/test/format.test.ts b/packages/cli/src/test/format.test.ts
new file mode 100644
index 0000000..3153492
--- /dev/null
+++ b/packages/cli/src/test/format.test.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { formatTable, parseCriteria, parseValues, valueText } from '../format.js'
+
+const fields = { id: {}, status: {}, lastName: {} }
+
+test('criteria parse operators, shorthand and lists', () => {
+ assert.deepEqual(parseCriteria('status EQUALS active', fields), { fieldName: 'status', operator: 'EQUALS', values: ['active'] })
+ assert.deepEqual(parseCriteria('id >= 10', fields), { fieldName: 'id', operator: 'GREATER_THAN_OR_EQUALS', values: ['10'] })
+ assert.deepEqual(parseCriteria('id IN 1, 2,3', fields), { fieldName: 'id', operator: 'IN', values: ['1', '2', '3'] })
+ assert.deepEqual(parseCriteria('lastName ~ van der', fields), { fieldName: 'lastName', operator: 'CONTAINS', values: ['van der'] })
+ assert.deepEqual(parseCriteria('lastName IS_BLANK', fields), { fieldName: 'lastName', operator: 'IS_BLANK', values: [] })
+ assert.throws(() => parseCriteria('nope EQUALS 1', fields), /No field nope/)
+ assert.throws(() => parseCriteria('id ABOUT 1', fields), /Unknown operator/)
+})
+
+test('values parse name=value pairs', () => {
+ assert.deepEqual(parseValues(['a=1', 'b=x=y']), { a: '1', b: 'x=y' })
+ assert.throws(() => parseValues(['=1']))
+})
+
+test('display values win over raw values', () => {
+ assert.equal(valueText({ values: { s: 1 }, displayValues: { s: 'Active' } }, 's'), 'Active')
+ assert.equal(valueText({ values: { s: 1 } }, 's'), '1')
+ assert.equal(valueText({ values: {} }, 's'), '')
+})
+
+test('tables align columns', () => {
+ assert.equal(formatTable([{ a: 'x', b: 'long value' }], ['a', 'b']), 'a b\n- ----------\nx long value')
+})
diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json
new file mode 100644
index 0000000..5285d28
--- /dev/null
+++ b/packages/cli/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}
diff --git a/packages/conformance/package.json b/packages/conformance/package.json
new file mode 100644
index 0000000..3c64e68
--- /dev/null
+++ b/packages/conformance/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "@qrun-io/qqq-ui-api-conformance",
+ "version": "1.6.0-rc.1",
+ "description": "Black-box conformance suite for QQQ UI API (/qqq/v1) servers, plus qqq-dev-idp, a local OIDC provider for testing native clients.",
+ "license": "Apache-2.0",
+ "type": "module",
+ "main": "dist/conformance.js",
+ "types": "dist/conformance.d.ts",
+ "bin": {
+ "qqq-ui-api-conformance": "dist/main.js",
+ "qqq-dev-idp": "dist/dev-idp.js"
+ },
+ "files": [
+ "dist",
+ "README.md"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/QRun-IO/qqq-cli.git",
+ "directory": "packages/conformance"
+ },
+ "publishConfig": {
+ "registry": "https://npm.pkg.github.com"
+ },
+ "scripts": {
+ "build": "tsc -p tsconfig.json",
+ "test": "node --test \"dist/test/*.test.js\""
+ },
+ "dependencies": {
+ "ajv": "8.20.0"
+ }
+}
diff --git a/packages/conformance/src/conformance.ts b/packages/conformance/src/conformance.ts
new file mode 100644
index 0000000..f1e0439
--- /dev/null
+++ b/packages/conformance/src/conformance.ts
@@ -0,0 +1,331 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * A black-box conformance suite for QQQ UI API servers (and, run against the Prism mock, for the
+ * document itself). Any client author can run it against a server to see that the server keeps the
+ * contract their client relies on: versioning, the published document, authentication (401s),
+ * the one error schema, and that real responses validate against the document's schemas.
+ *
+ * It only reads (GET, and POST queries/counts); it never writes.
+ */
+
+import { Ajv, type ValidateFunction } from 'ajv'
+
+/** One check's outcome. */
+export interface CheckResult {
+ name: string
+ ok: boolean
+ skipped?: boolean
+ detail?: string
+}
+
+/** Options of {@link runConformance}. */
+export interface ConformanceOptions {
+ baseUrl: string
+ /** A bearer token (access token or session UUID); without one only the public checks run. */
+ token?: string
+ /** A table to read (default: the first readable table in the metadata). */
+ table?: string
+ fetch?: typeof fetch
+ log?: (result: CheckResult) => void
+}
+
+type Json = Record
+
+/**
+ * Runs the suite. Resolves with every result; `ok` is false for failures only.
+ *
+ * @param options - Server and token.
+ */
+export async function runConformance(options: ConformanceOptions): Promise {
+ const fetchImpl = options.fetch ?? fetch
+ const results: CheckResult[] = []
+ const base = options.baseUrl.replace(/\/$/, '')
+ const record = (result: CheckResult) => {
+ results.push(result)
+ options.log?.(result)
+ }
+ const check = async (name: string, body: () => Promise) => {
+ try {
+ const detail = await body()
+ record({ name, ok: true, detail: detail || undefined })
+ } catch (error) {
+ if (error instanceof Skip) record({ name, ok: true, skipped: true, detail: error.message })
+ else record({ name, ok: false, detail: error instanceof Error ? error.message : String(error) })
+ }
+ }
+ const call = async (method: string, path: string, init: { token?: string | null; body?: unknown; headers?: Record } = {}) => {
+ const headers: Record = { Accept: 'application/json', 'X-QQQ-Client': 'cli/qqq-ui-api-conformance', ...(init.headers ?? {}) }
+ const token = init.token === undefined ? options.token : init.token
+ if (token) headers.Authorization = `Bearer ${token}`
+ if (init.body !== undefined) headers['Content-Type'] = 'application/json'
+ const response = await fetchImpl(`${base}${path}`, { method, headers, body: init.body === undefined ? undefined : JSON.stringify(init.body) })
+ const text = await response.text()
+ let json: unknown
+ try {
+ json = text ? JSON.parse(text) : undefined
+ } catch {
+ json = undefined
+ }
+ return { status: response.status, headers: response.headers, json: json as Json, text }
+ }
+
+ /////////////////////////////////////////
+ // the document, version and validator //
+ /////////////////////////////////////////
+ let document: Json | undefined
+ let version: Json | undefined
+ let validator: SchemaValidator | undefined
+
+ await check('GET /qqq/v1/version answers a 1.x semantic version', async () => {
+ const r = await call('GET', '/qqq/v1/version', { token: null })
+ expect(r.status === 200, `status ${r.status}`)
+ version = r.json
+ expect(/^1\.\d+\.\d+$/.test(String(version?.apiVersion)), `apiVersion ${version?.apiVersion}`)
+ return `apiVersion ${version?.apiVersion}, ${(version?.extensions ?? []).length} extensions`
+ })
+
+ await check('GET /qqq/v1/openapi.json is the served, merged document', async () => {
+ const r = await call('GET', '/qqq/v1/openapi.json', { token: null })
+ expect(r.status === 200 && r.json?.paths, `status ${r.status}`)
+ document = r.json
+ expect(document!.info?.version === version?.apiVersion, `info.version ${document!.info?.version} != apiVersion ${version?.apiVersion}`)
+ validator = new SchemaValidator(document!)
+ return `${Object.keys(document!.paths).length} paths`
+ })
+
+ await check('every operation has a unique operationId (UI API >= 1.6.0)', async () => {
+ requireDocument(document)
+ if (!atLeast(version?.apiVersion, 1, 6)) throw new Skip(`server is UI API ${version?.apiVersion}`)
+ const seen = new Set()
+ for (const [path, ops] of Object.entries(document!.paths)) {
+ for (const [method, op] of Object.entries(ops)) {
+ expect(op.operationId, `${method.toUpperCase()} ${path} has no operationId`)
+ expect(!seen.has(op.operationId), `duplicate operationId ${op.operationId}`)
+ seen.add(op.operationId)
+ }
+ }
+ return `${seen.size} operations`
+ })
+
+ await check('every $ref resolves', async () => {
+ requireDocument(document)
+ const dangling = new Set()
+ JSON.stringify(document, (key, value) => {
+ if (key === '$ref' && typeof value === 'string' && value.startsWith('#/components/schemas/') && !document!.components?.schemas?.[value.slice(21)]) dangling.add(value)
+ return value
+ })
+ expect(dangling.size === 0, `dangling: ${[...dangling].join(', ')}`)
+ })
+
+ await check('every extension in /version has operations in the document', async () => {
+ requireDocument(document)
+ const paths = Object.keys(document!.paths)
+ const missing = (version?.extensions ?? []).filter((e: Json) => !paths.some((p) => p.startsWith(`/qqq/v1${e.pathPrefix}`)))
+ expect(missing.length === 0, `no operations for ${missing.map((e: Json) => e.name).join(', ')}`)
+ })
+
+ let authentication: Json | undefined
+ await check('GET /qqq/v1/metaData/authentication validates', async () => {
+ const r = await call('GET', '/qqq/v1/metaData/authentication', { token: null })
+ expect(r.status === 200, `status ${r.status}`)
+ authentication = r.json
+ validator?.response('get', '/qqq/v1/metaData/authentication', 200, r.json)
+ return `type ${authentication?.type}${authentication?.values?.nativeClientId ? `, native client ${authentication.values.nativeClientId}` : ''}`
+ })
+
+ const anonymous = authentication?.type === 'FULLY_ANONYMOUS' || authentication?.type === 'MOCK'
+
+ await check('a request without credentials answers 401 with the error schema', async () => {
+ if (anonymous) throw new Skip(`authentication type ${authentication?.type}`)
+ const r = await call('GET', '/qqq/v1/metaData', { token: null })
+ expect(r.status === 401, `status ${r.status}`)
+ expectError(r, 'UNAUTHENTICATED', validator, 'get', '/qqq/v1/metaData', 401)
+ })
+
+ await check('a forged bearer token answers 401', async () => {
+ if (anonymous) throw new Skip(`authentication type ${authentication?.type}`)
+ const forged = `${b64({ alg: 'none', typ: 'JWT' })}.${b64({ sub: 'admin', exp: 4102444800 })}.`
+ const r = await call('GET', '/qqq/v1/metaData', { token: forged })
+ expect(r.status === 401, `alg none: status ${r.status}`)
+ const garbage = await call('GET', '/qqq/v1/metaData', { token: 'not-a-token' })
+ expect(garbage.status === 401, `garbage: status ${garbage.status}`)
+ })
+
+ if (!options.token && !anonymous) {
+ record({ name: 'authenticated checks', ok: true, skipped: true, detail: 'no token given (--token or QQQ_TOKEN)' })
+ return results
+ }
+
+ let metaData: Json | undefined
+ await check('GET /qqq/v1/metaData validates', async () => {
+ const r = await call('GET', '/qqq/v1/metaData')
+ expect(r.status === 200, `status ${r.status} ${r.text.slice(0, 200)}`)
+ metaData = r.json
+ validator?.response('get', '/qqq/v1/metaData', 200, r.json)
+ return `${Object.keys(metaData?.apps ?? {}).length} apps, ${Object.keys(metaData?.tables ?? {}).length} tables`
+ })
+
+ const tableName = options.table ?? Object.values(metaData?.tables ?? {}).find((t) => t.readPermission !== false && !t.isHidden)?.name
+ let tableMeta: Json | undefined
+ await check('GET /qqq/v1/metaData/table/{tableName} validates (with clientCapabilities and field validation since 1.6.0)', async () => {
+ if (!tableName) throw new Skip('no readable table')
+ const r = await call('GET', `/qqq/v1/metaData/table/${encodeURIComponent(tableName)}`)
+ expect(r.status === 200, `status ${r.status}`)
+ tableMeta = r.json
+ validator?.response('get', '/qqq/v1/metaData/table/{tableName}', 200, r.json)
+ if (atLeast(version?.apiVersion, 1, 6)) expect(tableMeta?.clientCapabilities, 'no clientCapabilities')
+ return tableName
+ })
+
+ let firstRecord: Json | undefined
+ await check('POST /qqq/v1/table/{tableName}/query validates', async () => {
+ if (!tableName) throw new Skip('no readable table')
+ const r = await call('POST', `/qqq/v1/table/${encodeURIComponent(tableName)}/query`, { body: { filter: { limit: 3 } } })
+ expect(r.status === 200, `status ${r.status}`)
+ validator?.response('post', '/qqq/v1/table/{tableName}/query', 200, r.json)
+ firstRecord = r.json?.records?.[0]
+ return `${r.json?.records?.length ?? 0} records`
+ })
+
+ await check('POST /qqq/v1/table/{tableName}/count validates', async () => {
+ if (!tableName) throw new Skip('no readable table')
+ const r = await call('POST', `/qqq/v1/table/${encodeURIComponent(tableName)}/count`, { body: { filter: {} } })
+ expect(r.status === 200, `status ${r.status}`)
+ validator?.response('post', '/qqq/v1/table/{tableName}/count', 200, r.json)
+ return `count ${r.json?.count}`
+ })
+
+ await check('GET /qqq/v1/table/{tableName}/{primaryKey} validates', async () => {
+ const pk = firstRecord?.values?.[tableMeta?.primaryKeyField ?? 'id']
+ if (pk === undefined || pk === null) throw new Skip('no record to read')
+ const r = await call('GET', `/qqq/v1/table/${encodeURIComponent(tableName!)}/${encodeURIComponent(String(pk))}`)
+ expect(r.status === 200, `status ${r.status}`)
+ validator?.response('get', '/qqq/v1/table/{tableName}/{primaryKey}', 200, r.json)
+ })
+
+ await check('an unknown table answers 404 with the error schema', async () => {
+ const r = await call('GET', '/qqq/v1/metaData/table/no_such_table_conformance')
+ expect(r.status === 404, `status ${r.status}`)
+ expectError(r, 'NOT_FOUND', validator, 'get', '/qqq/v1/metaData/table/{tableName}', 404)
+ })
+
+ await check('X-Request-Id is echoed as the error traceId (UI API >= 1.6.0)', async () => {
+ if (!atLeast(version?.apiVersion, 1, 6)) throw new Skip(`server is UI API ${version?.apiVersion}`)
+ const r = await call('GET', '/qqq/v1/metaData/table/no_such_table_conformance', { headers: { 'X-Request-Id': 'conformance-trace-1' } })
+ expect(r.json?.traceId === 'conformance-trace-1', `traceId ${r.json?.traceId}`)
+ expect(r.headers.get('X-QQQ-Trace-Id') === 'conformance-trace-1', `header ${r.headers.get('X-QQQ-Trace-Id')}`)
+ })
+
+ await check('GET /qqq/v1/jobs validates', async () => {
+ if (!document?.paths?.['/qqq/v1/jobs']) throw new Skip('no jobs operation')
+ const r = await call('GET', '/qqq/v1/jobs?scope=mine')
+ if (r.status === 403) throw new Skip('no jobs permission')
+ if (r.status === 404) throw new Skip('jobs are not enabled on this server (no durable jobs tables)')
+ expect(r.status === 200, `status ${r.status}`)
+ validator?.response('get', '/qqq/v1/jobs', 200, r.json)
+ return `${r.json?.jobs?.length ?? 0} jobs`
+ })
+
+ await check('GET /qqq/v1/realtime/stream opens with a hello event', async () => {
+ if (!document?.paths?.['/qqq/v1/realtime/stream']) throw new Skip('no realtime operation')
+ const controller = new AbortController()
+ const timer = setTimeout(() => controller.abort(), 8000)
+ try {
+ const headers: Record = { Accept: 'text/event-stream' }
+ if (options.token) headers.Authorization = `Bearer ${options.token}`
+ const response = await fetchImpl(`${base}/qqq/v1/realtime/stream`, { headers, signal: controller.signal })
+ if (response.status === 404 || response.status === 503) throw new Skip(`realtime disabled (${response.status})`)
+ expect(response.ok && response.body, `status ${response.status}`)
+ const reader = (response.body as ReadableStream).getReader()
+ let text = ''
+ while (!/event: ?hello/.test(text)) {
+ const { value, done } = await reader.read()
+ if (done) break
+ text += new TextDecoder().decode(value)
+ }
+ expect(/event: ?hello/.test(text), 'no hello event')
+ await reader.cancel()
+ } finally {
+ clearTimeout(timer)
+ controller.abort()
+ }
+ })
+
+ return results
+}
+
+/** A check that does not apply to this server. */
+class Skip extends Error {}
+
+function expect(condition: unknown, message: string): asserts condition {
+ if (!condition) throw new Error(message)
+}
+
+function requireDocument(document: Json | undefined): asserts document is Json {
+ if (!document) throw new Skip('no document')
+}
+
+function atLeast(version: unknown, major: number, minor: number): boolean {
+ const match = /^(\d+)\.(\d+)/.exec(String(version ?? ''))
+ return Boolean(match) && (Number(match![1]) > major || (Number(match![1]) === major && Number(match![2]) >= minor))
+}
+
+function b64(value: unknown): string {
+ return Buffer.from(JSON.stringify(value)).toString('base64url')
+}
+
+function expectError(r: { json: Json; headers: Headers }, code: string, validator: SchemaValidator | undefined, method: string, path: string, status: number): void {
+ expect(r.json && typeof r.json.error === 'string', 'error body has no "error" string')
+ if (r.json.code !== undefined) {
+ expect(r.json.code === code, `code ${r.json.code}, expected ${code}`)
+ expect(typeof r.json.traceId === 'string' && r.json.traceId, 'no traceId')
+ }
+ validator?.response(method, path, status, r.json)
+}
+
+/**
+ * Validates response bodies against the document's schemas (OpenAPI 3.0 -> JSON Schema: nullable
+ * becomes a null type; discriminators and formats are informational).
+ */
+export class SchemaValidator {
+ private readonly ajv = new Ajv({ strict: false, allErrors: false, validateFormats: false })
+ private readonly cache = new Map()
+
+ constructor(private readonly document: Json) {
+ this.ajv.addSchema({ $id: 'oas', components: { schemas: convert(document.components?.schemas ?? {}) } })
+ }
+
+ /** Throws when a response body does not match the operation's declared schema. */
+ response(method: string, path: string, status: number, body: unknown): void {
+ const operation = this.document.paths?.[path]?.[method]
+ const schema = operation?.responses?.[String(status)]?.content?.['application/json']?.schema
+ if (!schema) return
+ const key = `${method} ${path} ${status}`
+ const validate = this.cache.get(key) ?? this.ajv.compile(convert(schema) as object)
+ this.cache.set(key, validate)
+ if (!validate(body)) {
+ const error = validate.errors?.[0]
+ throw new Error(`${key}: ${error?.instancePath || '(body)'} ${error?.message} ${error?.params ? JSON.stringify(error.params) : ''}`.trim())
+ }
+ }
+}
+
+function convert(node: unknown): unknown {
+ if (Array.isArray(node)) return node.map(convert)
+ if (!node || typeof node !== 'object') return node
+ const out: Json = {}
+ for (const [key, value] of Object.entries(node as Json)) {
+ if (key === '$ref' && typeof value === 'string' && value.startsWith('#/components/')) out.$ref = `oas${value}`
+ else if (key === 'nullable' || key === 'discriminator' || key === 'example' || key === 'examples' || key === 'deprecated' || key === 'xml') continue
+ else out[key] = convert(value)
+ }
+ if ((node as Json).nullable === true) {
+ if (typeof out.type === 'string') out.type = [out.type, 'null']
+ else if (out.$ref || out.allOf || out.oneOf || out.anyOf) return { anyOf: [out, { type: 'null' }] }
+ }
+ return out
+}
diff --git a/packages/conformance/src/dev-idp.ts b/packages/conformance/src/dev-idp.ts
new file mode 100644
index 0000000..ea1c1e9
--- /dev/null
+++ b/packages/conformance/src/dev-idp.ts
@@ -0,0 +1,182 @@
+#!/usr/bin/env node
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * qqq-dev-idp - a tiny OpenID Connect provider for LOCAL DEVELOPMENT AND TESTS ONLY, so a client
+ * author can run the whole native-client flow (device-authorization grant, refresh, bearer JWTs)
+ * against a local QQQ server without an identity provider account. Never expose it: it approves
+ * device codes for one configured user without a password.
+ *
+ * Like Authentik, every client has its own issuer, http://localhost:{port}/application/o/{clientId}/,
+ * with discovery and JWKS (RS256); the token and device endpoints are shared; GET /device?code=...
+ * approves a code (or start it with --auto-approve).
+ *
+ * qqq-dev-idp --port 9400 --client sample-app --client sample-cli --user dev@example.com --groups admins [--auto-approve]
+ */
+
+import { createServer, type IncomingMessage, type ServerResponse } from 'node:http'
+import { createSign, generateKeyPairSync, randomBytes, randomUUID } from 'node:crypto'
+
+interface DeviceGrant {
+ clientId: string
+ scope: string
+ userCode: string
+ approved: boolean
+ expiresAt: number
+}
+
+/** Options of {@link startDevIdp}. */
+export interface DevIdpOptions {
+ port: number
+ clients: string[]
+ user: { sub: string; email: string; name: string; preferredUsername: string; groups: string[] }
+ autoApprove?: boolean
+ accessTokenSeconds?: number
+ log?: (line: string) => void
+}
+
+/** A running dev provider. */
+export interface DevIdp {
+ close: () => Promise
+ issuer: (clientId: string) => string
+ approve: (userCode: string) => boolean
+}
+
+/**
+ * Starts the provider; resolves once it listens.
+ *
+ * @param options - Port, client ids (each gets an issuer), the user and whether codes auto-approve.
+ */
+export async function startDevIdp(options: DevIdpOptions): Promise {
+ const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 })
+ const kid = randomUUID()
+ const jwk = { ...(publicKey.export({ format: 'jwk' }) as Record), kid, alg: 'RS256', use: 'sig' }
+ const base = `http://localhost:${options.port}`
+ const issuer = (clientId: string) => `${base}/application/o/${clientId}/`
+ const devices = new Map()
+ const refreshTokens = new Map()
+ const log = options.log ?? (() => undefined)
+
+ const sign = (clientId: string, scope: string): Record => {
+ const now = Math.floor(Date.now() / 1000)
+ const lifetime = options.accessTokenSeconds ?? 600
+ const claims = {
+ iss: issuer(clientId), aud: clientId, sub: options.user.sub, iat: now, nbf: now, exp: now + lifetime, jti: randomUUID(),
+ email: options.user.email, email_verified: true, name: options.user.name, preferred_username: options.user.preferredUsername,
+ groups: options.user.groups, scope,
+ }
+ const encode = (o: unknown) => Buffer.from(JSON.stringify(o)).toString('base64url')
+ const input = `${encode({ alg: 'RS256', typ: 'JWT', kid })}.${encode(claims)}`
+ const signature = createSign('RSA-SHA256').update(input).sign(privateKey).toString('base64url')
+ const refresh = randomBytes(24).toString('base64url')
+ refreshTokens.set(refresh, { clientId, scope })
+ return { access_token: `${input}.${signature}`, token_type: 'Bearer', expires_in: lifetime, refresh_token: refresh, scope }
+ }
+
+ const approve = (userCode: string): boolean => {
+ for (const grant of devices.values()) {
+ if (grant.userCode === userCode.toUpperCase()) {
+ grant.approved = true
+ log(`approved ${userCode} for ${grant.clientId}`)
+ return true
+ }
+ }
+ return false
+ }
+
+ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {
+ const url = new URL(req.url ?? '/', base)
+ const send = (status: number, body: unknown, type = 'application/json') => {
+ res.writeHead(status, { 'Content-Type': type, 'Cache-Control': 'no-store' })
+ res.end(type === 'application/json' ? JSON.stringify(body) : String(body))
+ }
+
+ if (url.pathname === '/device') {
+ const code = url.searchParams.get('code')
+ if (code) return send(200, approve(code) ? `Approved ${code}. You can close this page.` : `Unknown code ${code}.`, 'text/plain')
+ return send(200, 'Open /device?code=XXXX-XXXX to approve a code.', 'text/plain')
+ }
+
+ if (req.method === 'POST' && (url.pathname === '/application/o/token/' || url.pathname === '/application/o/device/')) {
+ let text = ''
+ for await (const chunk of req) text += chunk
+ const body = new URLSearchParams(text)
+ const clientId = body.get('client_id') ?? ''
+ if (!options.clients.includes(clientId)) return send(401, { error: 'invalid_client' })
+
+ if (url.pathname === '/application/o/device/') {
+ const deviceCode = randomBytes(24).toString('base64url')
+ const userCode = `${randomBytes(2).toString('hex')}-${randomBytes(2).toString('hex')}`.toUpperCase()
+ devices.set(deviceCode, { clientId, scope: body.get('scope') ?? 'openid', userCode, approved: Boolean(options.autoApprove), expiresAt: Date.now() + 600_000 })
+ log(`device code ${userCode} for ${clientId}${options.autoApprove ? ' (auto-approved)' : ''}`)
+ return send(200, {
+ device_code: deviceCode, user_code: userCode, verification_uri: `${base}/device`,
+ verification_uri_complete: `${base}/device?code=${userCode}`, expires_in: 600, interval: 1,
+ })
+ }
+
+ const grantType = body.get('grant_type')
+ if (grantType === 'urn:ietf:params:oauth:grant-type:device_code') {
+ const grant = devices.get(body.get('device_code') ?? '')
+ if (!grant || grant.clientId !== clientId || grant.expiresAt < Date.now()) return send(400, { error: 'expired_token' })
+ if (!grant.approved) return send(400, { error: 'authorization_pending' })
+ devices.delete(body.get('device_code') ?? '')
+ return send(200, sign(clientId, grant.scope))
+ }
+ if (grantType === 'refresh_token') {
+ const stored = refreshTokens.get(body.get('refresh_token') ?? '')
+ if (!stored || stored.clientId !== clientId) return send(400, { error: 'invalid_grant' })
+ refreshTokens.delete(body.get('refresh_token') ?? '')
+ return send(200, sign(clientId, stored.scope))
+ }
+ return send(400, { error: 'unsupported_grant_type' })
+ }
+
+ const match = /^\/application\/o\/([^/]+)\/(.*)$/.exec(url.pathname)
+ const clientId = match?.[1]
+ if (!match || !clientId || !options.clients.includes(clientId)) return send(404, { error: 'not_found' })
+ if (match[2] === '.well-known/openid-configuration') {
+ return send(200, {
+ issuer: issuer(clientId), jwks_uri: `${issuer(clientId)}jwks/`, token_endpoint: `${base}/application/o/token/`,
+ device_authorization_endpoint: `${base}/application/o/device/`, authorization_endpoint: `${base}/application/o/authorize/`,
+ response_types_supported: ['code'], subject_types_supported: ['public'], id_token_signing_alg_values_supported: ['RS256'],
+ grant_types_supported: ['urn:ietf:params:oauth:grant-type:device_code', 'refresh_token'],
+ })
+ }
+ if (match[2] === 'jwks/') return send(200, { keys: [jwk] })
+ return send(404, { error: 'not_found' })
+ })
+
+ await new Promise((resolve) => server.listen(options.port, resolve))
+ log(`qqq-dev-idp on ${base}; issuers: ${options.clients.map(issuer).join(', ')}`)
+ return { close: () => new Promise((resolve) => server.close(() => resolve())), issuer, approve }
+}
+
+/** CLI entry. */
+async function main(): Promise {
+ const args = process.argv.slice(2)
+ const value = (name: string, fallback: string) => {
+ const i = args.indexOf(name)
+ return i >= 0 ? args[i + 1] : fallback
+ }
+ const clients = args.flatMap((a, i) => (a === '--client' ? [args[i + 1]] : []))
+ const email = value('--user', 'dev@example.com')
+ await startDevIdp({
+ port: Number(value('--port', '9400')),
+ clients: clients.length ? clients : ['sample-app', 'sample-cli'],
+ user: { sub: email, email, name: value('--name', 'Dev User'), preferredUsername: email.split('@')[0], groups: value('--groups', 'admins').split(',') },
+ autoApprove: args.includes('--auto-approve'),
+ accessTokenSeconds: Number(value('--token-seconds', '600')),
+ log: (line) => console.log(line),
+ })
+}
+
+if (process.argv[1] && /dev-idp(\.js)?$/.test(process.argv[1])) {
+ main().catch((error) => {
+ console.error(error)
+ process.exitCode = 1
+ })
+}
diff --git a/packages/conformance/src/main.ts b/packages/conformance/src/main.ts
new file mode 100644
index 0000000..2ed30c5
--- /dev/null
+++ b/packages/conformance/src/main.ts
@@ -0,0 +1,37 @@
+#!/usr/bin/env node
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * qqq-ui-api-conformance --server https://app.example.com [--token ] [--table person] [--json]
+ *
+ * Runs the black-box UI API conformance suite against a server (or the Prism mock). Exit code 1
+ * when any check fails.
+ */
+
+import { runConformance } from './conformance.js'
+
+const args = process.argv.slice(2)
+const value = (name: string) => {
+ const i = args.indexOf(name)
+ return i >= 0 ? args[i + 1] : undefined
+}
+const server = value('--server') ?? process.env.QQQ_SERVER
+if (!server) {
+ console.error('usage: qqq-ui-api-conformance --server [--token ] [--table ] [--json]')
+ process.exit(2)
+}
+
+const asJson = args.includes('--json')
+const results = await runConformance({
+ baseUrl: server,
+ token: value('--token') ?? process.env.QQQ_TOKEN,
+ table: value('--table'),
+ log: asJson ? undefined : (r) => console.log(`${r.skipped ? 'SKIP' : r.ok ? 'PASS' : 'FAIL'} ${r.name}${r.detail ? ` (${r.detail})` : ''}`),
+})
+const failed = results.filter((r) => !r.ok)
+if (asJson) console.log(JSON.stringify({ server, passed: results.filter((r) => r.ok && !r.skipped).length, skipped: results.filter((r) => r.skipped).length, failed: failed.length, results }, null, 2))
+else console.log(`\n${results.filter((r) => r.ok && !r.skipped).length} passed, ${results.filter((r) => r.skipped).length} skipped, ${failed.length} failed`)
+process.exitCode = failed.length ? 1 : 0
diff --git a/packages/conformance/src/test/dev-idp.test.ts b/packages/conformance/src/test/dev-idp.test.ts
new file mode 100644
index 0000000..fa914b2
--- /dev/null
+++ b/packages/conformance/src/test/dev-idp.test.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { startDevIdp } from '../dev-idp.js'
+import { SchemaValidator } from '../conformance.js'
+
+test('dev IdP: discovery, device grant (manual approval) and refresh', async () => {
+ const idp = await startDevIdp({ port: 9488, clients: ['app', 'cli'], user: { sub: 'u@x.test', email: 'u@x.test', name: 'U', preferredUsername: 'u', groups: ['g'] } })
+ try {
+ const discovery = await (await fetch(`${idp.issuer('cli')}.well-known/openid-configuration`)).json() as Record
+ assert.equal(discovery.issuer, 'http://localhost:9488/application/o/cli/')
+ const keys = await (await fetch(discovery.jwks_uri)).json() as { keys: unknown[] }
+ assert.equal(keys.keys.length, 1)
+
+ const form = (body: Record) => ({ method: 'POST', body: new URLSearchParams(body) })
+ const start = await (await fetch(discovery.device_authorization_endpoint, form({ client_id: 'cli', scope: 'openid' }))).json() as Record
+ const pending = await fetch(discovery.token_endpoint, form({ client_id: 'cli', grant_type: 'urn:ietf:params:oauth:grant-type:device_code', device_code: start.device_code }))
+ assert.equal(((await pending.json()) as Record).error, 'authorization_pending')
+ assert.ok(idp.approve(start.user_code))
+ const tokens = await (await fetch(discovery.token_endpoint, form({ client_id: 'cli', grant_type: 'urn:ietf:params:oauth:grant-type:device_code', device_code: start.device_code }))).json() as Record
+ const claims = JSON.parse(Buffer.from(tokens.access_token.split('.')[1], 'base64url').toString())
+ assert.equal(claims.aud, 'cli')
+ assert.equal(claims.iss, idp.issuer('cli'))
+
+ const refreshed = await fetch(discovery.token_endpoint, form({ client_id: 'cli', grant_type: 'refresh_token', refresh_token: tokens.refresh_token }))
+ assert.equal(refreshed.status, 200)
+ const replay = await fetch(discovery.token_endpoint, form({ client_id: 'cli', grant_type: 'refresh_token', refresh_token: tokens.refresh_token }))
+ assert.equal(replay.status, 400)
+ } finally {
+ await idp.close()
+ }
+})
+
+test('schema validator maps OpenAPI nullable and refs', () => {
+ const validator = new SchemaValidator({
+ paths: { '/x': { get: { responses: { 200: { content: { 'application/json': { schema: { $ref: '#/components/schemas/X' } } } } } } } },
+ components: { schemas: { X: { type: 'object', properties: { a: { type: 'string', nullable: true }, b: { type: 'integer' } } } } },
+ })
+ validator.response('get', '/x', 200, { a: null, b: 1 })
+ assert.throws(() => validator.response('get', '/x', 200, { a: 1 }), /must be string/)
+})
diff --git a/packages/conformance/tsconfig.json b/packages/conformance/tsconfig.json
new file mode 100644
index 0000000..5285d28
--- /dev/null
+++ b/packages/conformance/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}
diff --git a/packages/ui-api-client/openapi/qqq-v1.json b/packages/ui-api-client/openapi/qqq-v1.json
new file mode 100644
index 0000000..dd1a38c
--- /dev/null
+++ b/packages/ui-api-client/openapi/qqq-v1.json
@@ -0,0 +1,42146 @@
+{
+ "components": {
+ "schemas": {
+ "AppMetaData": {
+ "properties": {
+ "childMap": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/AppTreeNode"
+ },
+ "description": "Map of other apps, tables, process, and reports, which are contained within this app. Same contents as the children list, just structured as a map.",
+ "type": "object"
+ },
+ "children": {
+ "description": "List of other apps, tables, process, and reports, which are contained within this app.",
+ "items": {
+ "$ref": "#/components/schemas/AppTreeNode"
+ },
+ "type": "array"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the app."
+ },
+ "label": {
+ "description": "User-facing name for this app",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this app within the QQQ Instance",
+ "type": "string"
+ },
+ "sections": {
+ "description": "List of sections - sub-divisions of the app, to further organize its children.",
+ "items": {
+ "$ref": "#/components/schemas/AppSection"
+ },
+ "type": "array"
+ },
+ "supplementalAppMetaData": {
+ "description": "Additional meta-data describing the app, which may not be known to the QQQ backend core module.",
+ "type": "object"
+ },
+ "widgets": {
+ "description": "List of widgets names that are part of this app. These strings should be keys to the widgets map in the QQQ Instance.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AppSection": {
+ "properties": {
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the section."
+ },
+ "label": {
+ "description": "User-facing name of the section.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique (within the app) name for this section.",
+ "type": "string"
+ },
+ "processes": {
+ "description": "List of process names for the section",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "reports": {
+ "description": "List of report names for the section",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "tables": {
+ "description": "List of table names for the section",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AppTreeNode": {
+ "properties": {
+ "children": {
+ "description": "Child elements. Only applies for type='app', which contains additional apps under it",
+ "items": {
+ "$ref": "#/components/schemas/AppTreeNode"
+ },
+ "type": "array"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the item."
+ },
+ "label": {
+ "description": "User-facing name of the element.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique (within its type) name for this element. e.g., for type = 'table', the table's name.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The type of node (table, process, report, app)",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AssociatedScriptMetaData": {
+ "properties": {
+ "fieldName": {
+ "description": "Name of the field, in the record's table, that references the script.",
+ "type": "string"
+ },
+ "scriptTypeId": {
+ "description": "Id of the script type (a scriptType record) of the scripts this field references.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "Association": {
+ "properties": {
+ "associatedTableName": {
+ "description": "Name of the associated table; its permissions remain independent",
+ "type": "string"
+ },
+ "join": {
+ "description": "The named join and field pairs defining this association",
+ "properties": {
+ "joinOns": {
+ "type": "array"
+ },
+ "leftTable": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "orderBys": {
+ "type": "array"
+ },
+ "rightTable": {
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ "ONE_TO_ONE",
+ "ONE_TO_MANY",
+ "MANY_TO_ONE",
+ "MANY_TO_MANY"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "name": {
+ "description": "Exact name used for this group in associatedRecords",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AuditsCapabilityV1": {
+ "properties": {
+ "available": {
+ "description": "True when the table is audited and the user can read its audits one of the two ways.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "detailTableName": {
+ "description": "The audit detail table (field changes), joined to tableName.",
+ "type": "string"
+ },
+ "level": {
+ "description": "The table's audit level: NONE, RECORD or FIELD.",
+ "type": "string"
+ },
+ "processName": {
+ "description": "The process that returns a record's audits (inputs tableName, recordId); absent when the user may not run it.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "The audit table, when the user may query it directly.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AuthenticationMetaDataResponseV1": {
+ "properties": {
+ "branding": {
+ "description": "The application's branding that is safe to show before sign-in (names, logo, icon and accent colors; never\nbanners), so a login page can look like the application. Absent when the instance defines no branding.",
+ "properties": {
+ "accentColor": {
+ "description": "Primary accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "accentColorLight": {
+ "description": "Light variant of the accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "appName": {
+ "description": "Name of this application, for display to users.",
+ "type": "string"
+ },
+ "companyName": {
+ "description": "Name of the company that operates this application.",
+ "type": "string"
+ },
+ "icon": {
+ "description": "Path or URL of the application's small icon image.",
+ "type": "string"
+ },
+ "logo": {
+ "description": "Path or URL of the application's logo image.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "dashboardCspSources": {
+ "description": "Optional public CSP source additions for standalone dashboards, derived from configured application features; never a full policy or inline script hashes.",
+ "properties": {
+ "connectSrc": {
+ "description": "HTTP(S) connection sources required by configured features; no default policy sources.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "frameSrc": {
+ "description": "Frame sources required by configured features.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "scriptSrc": {
+ "description": "Script sources required by configured features; no inline hashes, nonces or unsafe keywords.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "styleSrc": {
+ "description": "Style sources required by configured features.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "name": {
+ "description": "Unique name for the authentication metaData object within the QInstance.\n",
+ "type": "string"
+ },
+ "type": {
+ "description": "Specifier for the type of authentication module being used.\n\nFrontends should use this value to determine how to prompt the user for authentication credentials.\nIn addition, depending on this value, additional properties will be included in this object, as\nmay be needed to complete the authorization workflow with the provider (e.g., a baseUrl, clientId,\nand audience for an OAuth type workflow).",
+ "type": "string"
+ },
+ "values": {
+ "anyOf": [
+ {
+ "description": "No additional values are used for some authentication providers.",
+ "type": "object"
+ },
+ {
+ "description": "Additional values used by the Auth0 type authentication provider.",
+ "properties": {
+ "audience": {
+ "description": "Audience for auth0",
+ "type": "string"
+ },
+ "baseUrl": {
+ "description": "BaseUrl for auth0",
+ "type": "string"
+ },
+ "clientId": {
+ "description": "ClientId for auth0",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Additional values used by the OAuth2 type authentication provider.",
+ "properties": {
+ "baseUrl": {
+ "description": "BaseUrl for OAuth2 provider",
+ "type": "string"
+ },
+ "bearerTokensAccepted": {
+ "description": "True when the server accepts the provider's access tokens as Authorization: Bearer . Since 1.6.0.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "clientId": {
+ "description": "ClientId for OAuth2 provider",
+ "type": "string"
+ },
+ "nativeClientBaseUrl": {
+ "description": "The issuer (OIDC discovery base URL) of nativeClientId, when it differs from baseUrl. Since 1.6.0.",
+ "type": "string"
+ },
+ "nativeClientId": {
+ "description": "The public OAuth2 client for native clients (CLI, TUI, mobile): use it with auth-code + PKCE or the device-authorization grant, then send the access token as Authorization: Bearer. Absent when the app has no native client. Since 1.6.0.",
+ "type": "string"
+ },
+ "scopes": {
+ "description": "OAuth2 scopes to request (space-separated)",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ ],
+ "description": "Additional values, as determined by the type of authentication provider.\n"
+ }
+ },
+ "type": "object"
+ },
+ "BackChannelLogoutResponseV1": {
+ "type": "object"
+ },
+ "BasicErrorResponseV1": {
+ "description": "The error body of every UI API operation (core and extensions).",
+ "properties": {
+ "error": {
+ "description": "The error message (the same as message; kept for clients of UI API 1.0 to 1.5).",
+ "type": "string"
+ },
+ "code": {
+ "description": "A stable, machine-readable code. Well-known values: BAD_REQUEST (400), UNAUTHENTICATED (401),\nPERMISSION_DENIED (403), NOT_FOUND (404), CONFLICT (409), RATE_LIMITED (429), INTERNAL_ERROR (500),\nERROR (other). Extensions may add codes; treat an unknown code by the HTTP status. Since 1.6.0.",
+ "type": "string"
+ },
+ "message": {
+ "description": "A message to show the user. Since 1.6.0.",
+ "type": "string"
+ },
+ "fieldErrors": {
+ "description": "Errors about particular request fields, when known. Since 1.6.0.",
+ "items": {
+ "properties": {
+ "field": {
+ "description": "The field (or parameter) name.",
+ "type": "string"
+ },
+ "message": {
+ "description": "The error about that field.",
+ "type": "string"
+ },
+ "code": {
+ "description": "An optional machine-readable code, e.g. REQUIRED, TOO_LONG, PATTERN.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "traceId": {
+ "description": "Identifies this request in the server logs (also the X-QQQ-Trace-Id response header); quote it when reporting a problem. Since 1.6.0.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Branding": {
+ "properties": {
+ "accentColor": {
+ "description": "Primary accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "accentColorLight": {
+ "description": "Light variant of the accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "appName": {
+ "description": "Name of this application, for display to users.",
+ "type": "string"
+ },
+ "banners": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/BrandingBanner"
+ },
+ "description": "Banners to display, keyed by the slot where each is shown.",
+ "type": "object"
+ },
+ "companyName": {
+ "description": "Name of the company that operates this application.",
+ "type": "string"
+ },
+ "companyUrl": {
+ "description": "URL for the company's web site.",
+ "type": "string"
+ },
+ "icon": {
+ "description": "Path or URL of the application's small icon image.",
+ "type": "string"
+ },
+ "logo": {
+ "description": "Path or URL of the application's logo image.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BrandingBanner": {
+ "properties": {
+ "additionalStyles": {
+ "description": "Additional CSS style properties for the banner.",
+ "type": "object"
+ },
+ "backgroundColor": {
+ "description": "Background color, as a CSS color value.",
+ "type": "string"
+ },
+ "messageHTML": {
+ "description": "HTML message, used instead of the plain-text message when set.",
+ "type": "string"
+ },
+ "messageText": {
+ "description": "Plain-text message.",
+ "type": "string"
+ },
+ "severity": {
+ "description": "Severity of the message: INFO, WARNING, ERROR or SUCCESS.",
+ "type": "string"
+ },
+ "textColor": {
+ "description": "Text color, as a CSS color value.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BuiltInViewV1": {
+ "properties": {
+ "filter": {
+ "properties": {
+ "booleanOperator": {
+ "enum": [
+ "OR"
+ ],
+ "type": "string"
+ },
+ "criteria": {
+ "items": {
+ "properties": {
+ "fieldName": {
+ "type": "string"
+ },
+ "operator": {
+ "enum": [
+ "EQUALS"
+ ],
+ "type": "string"
+ },
+ "values": {
+ "items": {
+ "description": "The executing session's user id. Display as Me. A missing user matches nothing.",
+ "properties": {
+ "type": {
+ "enum": [
+ "CurrentUser"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadColumnProfile": {
+ "properties": {
+ "classification": {
+ "description": "Data classification of the mapped field (PUBLIC, CONFIDENTIAL, PII, PHI), or null.",
+ "type": "string"
+ },
+ "columnIndex": {
+ "description": "Zero-based column index in the file.",
+ "type": "number"
+ },
+ "columnLetter": {
+ "description": "Spreadsheet-style column letter (A, B, ... AA).",
+ "type": "string"
+ },
+ "distinctCount": {
+ "description": "Distinct non-blank values counted (capped at 1000).",
+ "type": "number"
+ },
+ "distinctCountCapped": {
+ "description": "Whether more distinct values exist than were counted.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "header": {
+ "description": "Header text (or Column A, Column B ... when the file has no header row).",
+ "type": "string"
+ },
+ "inferredType": {
+ "description": "INTEGER, DECIMAL, BOOLEAN, DATE, DATE_TIME or STRING, from the profiled values.",
+ "type": "string"
+ },
+ "mappedFieldName": {
+ "description": "The table field the suggested mapping assigns this column to, or null.",
+ "type": "string"
+ },
+ "maxLength": {
+ "description": "Longest value length.",
+ "type": "number"
+ },
+ "patternClass": {
+ "description": "DATE_LIKE, EMAIL_LIKE, NUMERIC, CODE_LIKE, TEXT or EMPTY.",
+ "type": "string"
+ },
+ "percentBlank": {
+ "description": "Percent of profiled rows where the column is blank.",
+ "type": "number"
+ },
+ "sampleValues": {
+ "description": "Up to sampleCount distinct values, only when samplesAllowed; otherwise empty.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "samplesAllowed": {
+ "description": "Whether sample values may be shown: an AI route of hipaa, or a mapped field that is unclassified or PUBLIC. Unmapped columns are treated as classified.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadColumnRef": {
+ "properties": {
+ "columnIndex": {
+ "description": "Zero-based column index in the file.",
+ "type": "number"
+ },
+ "header": {
+ "description": "Header text.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadFieldRef": {
+ "properties": {
+ "fieldName": {
+ "description": "Field name.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Field label.",
+ "type": "string"
+ },
+ "possibleValueSourceName": {
+ "description": "Possible value source of the field, if any (its file values need mapping).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadRowError": {
+ "properties": {
+ "errorCode": {
+ "description": "VALUE_TYPE, POSSIBLE_VALUE, DUPLICATE, REQUIRED or OTHER.",
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "The field the error is about, when known.",
+ "type": "string"
+ },
+ "message": {
+ "description": "The error message (value-free).",
+ "type": "string"
+ },
+ "rowNumbers": {
+ "description": "File rows with the error, e.g. Row 3; Rows 7-9 (no values).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadSuggestMappingResponseV1": {
+ "properties": {
+ "profile": {
+ "description": "The suggested bulk load profile (v1: version, layout, hasHeaderRow, isBulkEdit, and fieldList entries of fieldName, columnIndex, headerName, defaultValue, doValueMapping, valueMappings, clearIfEmpty).",
+ "type": "object"
+ },
+ "unmappedColumns": {
+ "description": "File columns the suggestion does not map.",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadColumnRef"
+ },
+ "type": "array"
+ },
+ "unmappedRequiredFields": {
+ "description": "Required table fields the suggestion does not fill.",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadFieldRef"
+ },
+ "type": "array"
+ },
+ "valueMappingFields": {
+ "description": "Mapped fields with a possible value source, whose file values may need mapping.",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadFieldRef"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadSummaryLine": {
+ "properties": {
+ "bulletsOfText": {
+ "description": "Example rows (and their values, unless masked for a classified field).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "count": {
+ "description": "Number of records the line describes.",
+ "type": "number"
+ },
+ "message": {
+ "description": "The standard process summary message.",
+ "type": "string"
+ },
+ "status": {
+ "description": "OK, INFO, WARNING or ERROR.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadUploadProfileResponseV1": {
+ "properties": {
+ "columns": {
+ "description": "The columns.",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadColumnProfile"
+ },
+ "type": "array"
+ },
+ "fileName": {
+ "description": "The uploaded file name.",
+ "type": "string"
+ },
+ "hasHeaderRow": {
+ "description": "Whether row 1 looks like a header row (the suggester maps at least one of its values).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "rowsProfiled": {
+ "description": "Data rows profiled (up to 1000).",
+ "type": "number"
+ },
+ "uploadRef": {
+ "description": "The upload ref.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BulkLoadValidateResponseV1": {
+ "properties": {
+ "errorCount": {
+ "description": "Records with errors.",
+ "type": "number"
+ },
+ "errors": {
+ "description": "Error groups with row numbers (up to 100).",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadRowError"
+ },
+ "type": "array"
+ },
+ "jobId": {
+ "description": "Reserved: a FULL run over the durable threshold will run as a VALIDATE job and return its id. Always null in this version.",
+ "type": "number"
+ },
+ "mode": {
+ "description": "SAMPLE (the first 100 rows) or FULL (the whole file).",
+ "type": "string"
+ },
+ "okCount": {
+ "description": "Records that would be inserted.",
+ "type": "number"
+ },
+ "previewRecordCount": {
+ "description": "For SAMPLE, the rows validated.",
+ "type": "number"
+ },
+ "processName": {
+ "description": "The table's bulk-insert process the dry run used.",
+ "type": "string"
+ },
+ "recordCount": {
+ "description": "Records read from the file.",
+ "type": "number"
+ },
+ "summaryLines": {
+ "description": "The standard process summary lines.",
+ "items": {
+ "$ref": "#/components/schemas/BulkLoadSummaryLine"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DeliveryDestinationsResponseV1": {
+ "properties": {
+ "destinations": {
+ "items": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "icon": {
+ "type": "string"
+ },
+ "maxClassification": {
+ "type": "string"
+ },
+ "aboveMaxClassification": {
+ "type": "string"
+ },
+ "order": {
+ "type": "integer"
+ },
+ "maxAttachmentBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "allowBearerLinks": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DeliveryOutputResponseV1": {
+ "format": "binary",
+ "type": "string"
+ },
+ "DeliveryTargetStepResponseV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "options": {
+ "items": {
+ "properties": {
+ "value": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "freeText": {
+ "type": "boolean"
+ },
+ "complete": {
+ "type": "boolean"
+ },
+ "summary": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DeliveryTargetsRequestV1": {
+ "properties": {
+ "chosen": {
+ "additionalProperties": true,
+ "description": "Selections by delivery target step name; values are provider-defined target identifiers.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "ExposedJoin": {
+ "properties": {
+ "isMany": {
+ "description": "Whether or not this join is 'to many' in nature",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "joinPath": {
+ "description": "A list of joins that travel from the base table to the exposed join table",
+ "items": {
+ "properties": {
+ "joinOns": {
+ "type": "array"
+ },
+ "leftTable": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "orderBys": {
+ "type": "array"
+ },
+ "rightTable": {
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ "ONE_TO_ONE",
+ "ONE_TO_MANY",
+ "MANY_TO_ONE",
+ "MANY_TO_MANY"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "joinTable": {
+ "$ref": "#/components/schemas/TableMetaData",
+ "description": "The meta-data for the joined table"
+ },
+ "label": {
+ "description": "User-facing label to display for this join",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "FieldAdornment": {
+ "properties": {
+ "type": {
+ "description": "Type of this adornment",
+ "enum": [
+ "LINK",
+ "CHIP",
+ "SIZE",
+ "CODE_EDITOR",
+ "RENDER_HTML",
+ "REVEAL",
+ "FILE_DOWNLOAD",
+ "FILE_UPLOAD",
+ "TOOLTIP",
+ "WIDGET",
+ "ERROR",
+ "FILE_PREVIEW"
+ ],
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {},
+ "description": "Values associated with this adornment. Keys and the meanings of their values differ by type; the known\nkeys are listed (each names the type(s) it applies to). CHIP also uses pattern keys: `color.{fieldValue}`\n(one of default, info, primary, secondary, success, warning, error) and `icon.{fieldValue}` (an icon name),\ngiving the chip colour and icon for a field value. Clients ignore keys they do not know.",
+ "properties": {
+ "target": {
+ "description": "LINK: where to open the link: _blank for a new window/tab; otherwise the same view.",
+ "type": "string"
+ },
+ "toRecordFromTable": {
+ "description": "LINK: the field value is a primary key of this table; link to that record (a client navigates to the record view).",
+ "type": "string"
+ },
+ "toRecordFromTableDynamic": {
+ "description": "LINK: the target table is per record - read it from the record displayValue `{fieldName}:toRecordFromTableDynamic`.",
+ "type": "boolean"
+ },
+ "fileNameField": {
+ "description": "FILE_DOWNLOAD, FILE_PREVIEW: the field holding the file name to save or show.",
+ "type": "string"
+ },
+ "defaultExtension": {
+ "description": "FILE_DOWNLOAD: extension for the saved file when the name has none.",
+ "type": "string"
+ },
+ "defaultMimeType": {
+ "description": "FILE_DOWNLOAD, FILE_PREVIEW: MIME type to assume when none is known.",
+ "type": "string"
+ },
+ "supplementalProcessName": {
+ "description": "FILE_DOWNLOAD: process the server runs to produce the file (the client just downloads).",
+ "type": "string"
+ },
+ "supplementalCodeReference": {
+ "additionalProperties": true,
+ "description": "FILE_DOWNLOAD: code the server runs to produce the file (the client just downloads).",
+ "type": "object"
+ },
+ "downloadUrlDynamic": {
+ "description": "FILE_DOWNLOAD: the download URL is per record - read it from the record displayValue `{fieldName}:downloadUrlDynamic`.",
+ "type": "boolean"
+ },
+ "fileNameFormat": {
+ "description": "FILE_DOWNLOAD: format (with %s placeholders) for the saved file name.",
+ "type": "string"
+ },
+ "fileNameFormatFields": {
+ "description": "FILE_DOWNLOAD: fields whose values fill fileNameFormat, in order.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "width": {
+ "description": "SIZE: display width of the field - one of xsmall, small, medium, medlarge, large, xlarge (semantic widths; each client maps them to its own columns or characters). FILE_UPLOAD: width of the upload control.",
+ "enum": [
+ "xsmall",
+ "small",
+ "medium",
+ "medlarge",
+ "large",
+ "xlarge",
+ "full",
+ "half"
+ ],
+ "type": "string"
+ },
+ "format": {
+ "description": "FILE_UPLOAD: control style (dragAndDrop or button).",
+ "type": "string"
+ },
+ "languageMode": {
+ "description": "CODE_EDITOR: language of the code (e.g. javascript, sql, json, velocity) - for highlighting; a client without an editor shows it monospaced.",
+ "type": "string"
+ },
+ "staticText": {
+ "description": "TOOLTIP: the tooltip text.",
+ "type": "string"
+ },
+ "tooltipDynamic": {
+ "description": "TOOLTIP: the text is per record - read it from the record displayValue `{fieldName}:tooltipDynamic`.",
+ "type": "boolean"
+ },
+ "thumbnailUrlField": {
+ "description": "FILE_PREVIEW: field holding a thumbnail image URL.",
+ "type": "string"
+ },
+ "fullSizeUrlField": {
+ "description": "FILE_PREVIEW: field holding the full-size file URL.",
+ "type": "string"
+ },
+ "mimeTypeField": {
+ "description": "FILE_PREVIEW: field holding the MIME type (decides image, video, PDF or download-only).",
+ "type": "string"
+ },
+ "altTextField": {
+ "description": "FILE_PREVIEW: field holding alternative text.",
+ "type": "string"
+ },
+ "captionField": {
+ "description": "FILE_PREVIEW: field holding a caption.",
+ "type": "string"
+ },
+ "widthField": {
+ "description": "FILE_PREVIEW: field holding the pixel width.",
+ "type": "string"
+ },
+ "heightField": {
+ "description": "FILE_PREVIEW: field holding the pixel height.",
+ "type": "string"
+ },
+ "sizeBytesField": {
+ "description": "FILE_PREVIEW: field holding the size in bytes.",
+ "type": "string"
+ },
+ "thumbnailMaxSize": {
+ "description": "FILE_PREVIEW: largest thumbnail edge in pixels.",
+ "type": "integer"
+ },
+ "previewable": {
+ "description": "FILE_PREVIEW: whether the file may be previewed (false: download only).",
+ "type": "boolean"
+ },
+ "widgetName": {
+ "description": "WIDGET: the widget that renders this field.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "FieldMetaData": {
+ "properties": {
+ "accessTier": {
+ "description": "Effective field access: FULL, REVEALABLE, MASKED, or HIDDEN. Omitted means FULL. Restricted values are strings, regardless of field type.",
+ "enum": [
+ "FULL",
+ "REVEALABLE",
+ "MASKED",
+ "HIDDEN"
+ ],
+ "type": "string"
+ },
+ "adornments": {
+ "description": "Special UI dressings to add to the field.",
+ "items": {
+ "$ref": "#/components/schemas/FieldAdornment"
+ },
+ "type": "array"
+ },
+ "allowedFilterOperators": {
+ "description": "Allowed filter operators when restricted: EQUALS and IN for REVEALABLE when exact match is enabled, otherwise empty. Omitted means unrestricted.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "behaviors": {
+ "description": "Names of the field's behaviors that a frontend applies while editing, e.g., TO_UPPER_CASE, TO_LOWER_CASE or TRIM. Absent when the field has none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "defaultValue": {
+ "description": "Default value to use in this field.",
+ "type": "string"
+ },
+ "displayFormat": {
+ "description": "C-style format specifier for displaying values in this field.",
+ "type": "string"
+ },
+ "gridColumns": {
+ "description": "Width of this field in a 12-column record form or view grid (e.g., 12 for the full width, 6 for half). Absent when the frontend's default applies.",
+ "type": "number"
+ },
+ "helpContents": {
+ "description": "Help Contents for this field.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "inlinePossibleValueSource": {
+ "description": "Inline possible-value source for this field; enumValues supply choices without a separate lookup.",
+ "properties": {
+ "customCodeReference": {
+ "properties": {
+ "codeType": {
+ "enum": [
+ "JAVA",
+ "JAVA_SCRIPT"
+ ],
+ "type": "string"
+ },
+ "inlineCode": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "enumValues": {
+ "type": "array"
+ },
+ "helpContent": {
+ "type": "object"
+ },
+ "idType": {
+ "enum": [
+ "STRING",
+ "INTEGER",
+ "LONG",
+ "DECIMAL",
+ "BOOLEAN",
+ "DATE",
+ "TIME",
+ "DATE_TIME",
+ "TEXT",
+ "HTML",
+ "PASSWORD",
+ "BLOB"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "orderByFields": {
+ "type": "array"
+ },
+ "overrideIdField": {
+ "type": "string"
+ },
+ "picker": {
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "tableName": {
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ "ENUM",
+ "TABLE",
+ "CUSTOM"
+ ],
+ "type": "string"
+ },
+ "valueFields": {
+ "type": "array"
+ },
+ "valueFieldsIfNotFound": {
+ "type": "array"
+ },
+ "valueFormat": {
+ "type": "string"
+ },
+ "valueFormatIfNotFound": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "isEditable": {
+ "description": "Indicate if user may edit the value in this field.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHeavy": {
+ "description": "Indicator of 'heavy' fields, which are not loaded by default. e.g., some blobs or long-texts",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Indicate if this field should be hidden from users",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isRequired": {
+ "description": "Indicate if a value in this field is required.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isSortable": {
+ "description": "False for restricted fields; omitted means sortable.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this field",
+ "type": "string"
+ },
+ "maxLength": {
+ "description": "For String fields, the max length the field supports.",
+ "type": "number"
+ },
+ "maxValue": {
+ "description": "For number fields, the largest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "minValue": {
+ "description": "For number fields, the smallest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this field within its container (table or process)",
+ "type": "string"
+ },
+ "picker": {
+ "description": "When this field's possible value source declares a record picker (for sources over large tables), its configuration: thumbnail, preview, subtitle and detail fields, filter fields, search fields, sorts and page size. Frontends offer a searchable, paged picker dialog.",
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "pickerTableName": {
+ "description": "When this field has a picker, the table its possible value source reads, whose metadata describes the picker's fields.",
+ "type": "string"
+ },
+ "possibleValueSourceDependencyBehavior": {
+ "description": "DISABLE_UNTIL_SET disables a contingent field until its dependencies are set (default). SHOW_ALL_UNTIL_SET keeps it enabled and omits criteria with missing inputs in form searches. Absent for non-contingent fields.",
+ "enum": [
+ "DISABLE_UNTIL_SET",
+ "SHOW_ALL_UNTIL_SET"
+ ],
+ "type": "string"
+ },
+ "possibleValueSourceDependsOn": {
+ "description": "Names of fields controlling this field's choices, including explicit and filter dependencies. Absent for non-contingent fields.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "possibleValueSourceName": {
+ "description": "If this field's values should come from a possible value source, then that PVS is named here.",
+ "type": "string"
+ },
+ "supplementalMetaData": {
+ "description": "Additional frontend-visible metadata for this field, keyed by supplemental type.",
+ "type": "object"
+ },
+ "type": {
+ "description": "Data-type for this field",
+ "type": "string"
+ },
+ "validation": {
+ "$ref": "#/components/schemas/FieldValidationV1",
+ "description": "The field's validation rules, as the server enforces them on insert and update (required, maxLength and tooLongBehavior, min/max value, pattern). Absent when the field has none. Since 1.6.0."
+ }
+ },
+ "type": "object"
+ },
+ "FieldValidationV1": {
+ "properties": {
+ "maxInclusive": {
+ "description": "Whether maxValue itself is accepted (false: the value must be less).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "maxLength": {
+ "description": "For string fields, the most characters the field stores. What happens to a longer value is tooLongBehavior.",
+ "type": "number"
+ },
+ "maxValue": {
+ "description": "For number fields, the largest value accepted (plain digits, exact). See maxInclusive.",
+ "type": "string"
+ },
+ "minInclusive": {
+ "description": "Whether minValue itself is accepted (false: the value must be greater).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "minValue": {
+ "description": "For number fields, the smallest value accepted (plain digits, exact). See minInclusive.",
+ "type": "string"
+ },
+ "pattern": {
+ "description": "A regular expression a non-empty value must match as a whole (written to mean the same in Java and ECMAScript).",
+ "type": "string"
+ },
+ "patternMessage": {
+ "description": "The message the server gives for a value that does not match pattern.",
+ "type": "string"
+ },
+ "required": {
+ "description": "True when a value is required.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "tooLongBehavior": {
+ "description": "With maxLength: ERROR (a longer value is refused), TRUNCATE or TRUNCATE_ELLIPSIS (it is trimmed on save), PASS_THROUGH (neither).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "FilterCriteria": {
+ "properties": {
+ "fieldName": {
+ "description": "Field name that this criteria applies to",
+ "type": "string"
+ },
+ "operator": {
+ "description": "Logical operator that applies to this criteria",
+ "enum": [
+ "EQUALS",
+ "NOT_EQUALS",
+ "NOT_EQUALS_OR_IS_NULL",
+ "IN",
+ "NOT_IN",
+ "IS_NULL_OR_IN",
+ "LIKE",
+ "NOT_LIKE",
+ "STARTS_WITH",
+ "ENDS_WITH",
+ "CONTAINS",
+ "CONTAINS_ALL",
+ "NOT_STARTS_WITH",
+ "NOT_ENDS_WITH",
+ "NOT_CONTAINS",
+ "LESS_THAN",
+ "LESS_THAN_OR_EQUALS",
+ "GREATER_THAN",
+ "GREATER_THAN_OR_EQUALS",
+ "IS_BLANK",
+ "IS_NOT_BLANK",
+ "BETWEEN",
+ "NOT_BETWEEN",
+ "TRUE",
+ "FALSE"
+ ],
+ "type": "string"
+ },
+ "values": {
+ "description": "Values to apply via the operator to the field",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "FormAdjusterOutputV1": {
+ "description": "Changes a form adjuster asks the form to apply. Absent or null properties mean no change.",
+ "properties": {
+ "updatedFieldMetaData": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Replacement definitions for fields, by field name.",
+ "type": "object"
+ },
+ "updatedFieldValues": {
+ "additionalProperties": true,
+ "description": "New values for fields, by field name.",
+ "type": "object"
+ },
+ "updatedFieldDisplayValues": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Display values for possible-value fields whose values changed, by field name.",
+ "type": "object"
+ },
+ "fieldsToClear": {
+ "description": "Fields whose values should be cleared.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "updatedSectionMetaData": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/TableSection"
+ },
+ "description": "Replacement definitions for form sections, by section name.",
+ "type": "object"
+ },
+ "isFormDisabled": {
+ "description": "Whether the form should be disabled.",
+ "type": "boolean"
+ },
+ "formDisabledMessage": {
+ "description": "Why the form is disabled.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "FrontendComponent": {
+ "properties": {
+ "type": {
+ "description": "The type of this component. e.g., what kind of UI element(s) should be presented to the user.",
+ "enum": [
+ "HELP_TEXT",
+ "BULK_EDIT_FORM",
+ "BULK_LOAD_FILE_MAPPING_FORM",
+ "BULK_LOAD_VALUE_MAPPING_FORM",
+ "BULK_LOAD_PROFILE_FORM",
+ "VALIDATION_REVIEW_SCREEN",
+ "EDIT_FORM",
+ "VIEW_FORM",
+ "DOWNLOAD_FORM",
+ "RECORD_LIST",
+ "PROCESS_SUMMARY_RESULTS",
+ "GOOGLE_DRIVE_SELECT_FOLDER",
+ "WIDGET",
+ "HTML"
+ ],
+ "type": "string"
+ },
+ "values": {
+ "$ref": "#/components/schemas/FrontendComponentValues",
+ "description": "Name-value pairs specific to the type of component.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "FrontendComponentValues": {
+ "description": "These are the known values that can appear in the values map under a FrontendComponent, to control\nhow that component should be presented to the user.\n\nAdditional application-defined properties may appear as well. BULK_EDIT_FORM, BULK_LOAD_FILE_MAPPING_FORM,\nBULK_LOAD_VALUE_MAPPING_FORM, BULK_LOAD_PROFILE_FORM, VALIDATION_REVIEW_SCREEN, VIEW_FORM, DOWNLOAD_FORM,\nRECORD_LIST, PROCESS_SUMMARY_RESULTS and GOOGLE_DRIVE_SELECT_FOLDER have no fixed component-local keys\nsupplied by the core producers; they consume process values and frontend-step metadata.\n\nIn addition, components are expected to use values from an active process's `values` map (e.g., as included in\na `ProcessStepComplete` object), with the following contract between component-types and expected values:\n\n- For component type=`HTML`, there will be a process value with key=`${stepName}.html` (e.g., `resultScreen.html`),\nwhose value is the HTML to display on that screen.\n- For component type=`HELP_TEXT`: There will be a process value with key=`text`, whose value is the text to display on that screen.\nThere may also be a process value with key=`previewText`, which, if present, can be shown before the full text is shown,\ne.g., with a toggle control to hide/show the `text` value.\n",
+ "properties": {
+ "blocks": {
+ "description": "Components of type=`WIDGET`, which are set as `isAdHocWidget=true`, should include a list of WidgetBlocks in this value.",
+ "items": {
+ "$ref": "#/components/schemas/WidgetBlock"
+ },
+ "type": "array"
+ },
+ "includeFieldNames": {
+ "description": "Components of type=`EDIT_FORM` can specify a subset of field names to include. This can be used to break a form up into\nsections, by including multiple EDIT_FORM components, with different lists of `includeFieldNames`.\n",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "isAdHocWidget": {
+ "description": "Components of type=`WIDGET`, which do not reference a widget defined in the QQQ Instance, but instead,\nare defined as a list of blocks within a frontend step component, will have a this value set to true.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "previewText": {
+ "description": "HELP_TEXT: short text shown before expanding the full text.",
+ "type": "string"
+ },
+ "sectionLabel": {
+ "description": "Components of type=`EDIT_FORM` can specify a user-facing text label to show on screen.\n",
+ "type": "string"
+ },
+ "text": {
+ "description": "HELP_TEXT: text shown by the component.",
+ "type": "string"
+ },
+ "widgetName": {
+ "description": "Components of type=`WIDGET`, which should render a widget defined in the QQQ instance, this value specifies\nthe name of that widget. Contrast with ad-hoc widgets.\n",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "FrontendStep": {
+ "properties": {
+ "backStepName": {
+ "description": "Name of the step a user can go back to from this step (step with isStepBack=true), when there is one.",
+ "type": "string"
+ },
+ "components": {
+ "description": "The components that make up this screen",
+ "items": {
+ "$ref": "#/components/schemas/FrontendComponent"
+ },
+ "type": "array"
+ },
+ "formFields": {
+ "description": "Fields used as form fields (inputs) on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ },
+ "helpContents": {
+ "description": "Help content shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "label": {
+ "description": "The user-facing name for this step",
+ "type": "string"
+ },
+ "name": {
+ "description": "The unique name for this step within its process",
+ "type": "string"
+ },
+ "recordListFields": {
+ "description": "Fields used in record-lists shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "viewFields": {
+ "description": "Fields used as view-only fields on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HelpContentV1": {
+ "properties": {
+ "content": {
+ "description": "Long help in the declared format.",
+ "type": "string"
+ },
+ "contentAsHtml": {
+ "description": "Rendered Markdown (raw HTML escaped, unsafe links removed). Explicit HTML is unchanged and clients must sanitize it.",
+ "type": "string"
+ },
+ "contentAsText": {
+ "description": "Plain-text help, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "format": {
+ "description": "Format of the long help.",
+ "enum": [
+ "TEXT",
+ "HTML",
+ "MARKDOWN"
+ ],
+ "type": "string"
+ },
+ "roles": {
+ "description": "Screen roles covered by this entry.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "summary": {
+ "description": "Optional short plain-text tooltip.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "HelpCoverageEntryV1": {
+ "properties": {
+ "hasContent": {
+ "description": "Whether visible help has long content.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "hasSummary": {
+ "description": "Whether visible help has an explicit summary.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "hidden": {
+ "description": "Whether the target is hidden in metadata.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "key": {
+ "description": "Canonical helpContent address.",
+ "type": "string"
+ },
+ "kind": {
+ "description": "Help target kind.",
+ "type": "string"
+ },
+ "label": {
+ "description": "User-facing target label.",
+ "type": "string"
+ },
+ "parentKey": {
+ "description": "Canonical parent address.",
+ "type": "string"
+ },
+ "roles": {
+ "description": "Screen roles covered by this entry.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HelpCoverageResponseV1": {
+ "properties": {
+ "entries": {
+ "items": {
+ "$ref": "#/components/schemas/HelpCoverageEntryV1"
+ },
+ "type": "array"
+ },
+ "totals": {
+ "items": {
+ "$ref": "#/components/schemas/HelpCoverageTotalV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HelpCoverageTotalV1": {
+ "properties": {
+ "kind": {
+ "description": "Help target kind.",
+ "type": "string"
+ },
+ "total": {
+ "description": "Number of targets in the selected kind and parent scope.",
+ "type": "number"
+ },
+ "withHelp": {
+ "description": "Targets with a visible summary or long content.",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "HelpSearchResponseV1": {
+ "properties": {
+ "results": {
+ "items": {
+ "$ref": "#/components/schemas/HelpSearchResultV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HelpSearchResultV1": {
+ "properties": {
+ "contentAsHtml": {
+ "description": "Rendered Markdown (raw HTML escaped, unsafe links removed). Explicit HTML is unchanged and clients must sanitize it.",
+ "type": "string"
+ },
+ "contentAsText": {
+ "description": "Plain-text help, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "href": {
+ "description": "Application-relative navigation link, when available.",
+ "type": "string"
+ },
+ "key": {
+ "description": "Canonical helpContent address.",
+ "type": "string"
+ },
+ "kind": {
+ "description": "Help target kind.",
+ "type": "string"
+ },
+ "label": {
+ "description": "User-facing target label.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Target metadata name.",
+ "type": "string"
+ },
+ "process": {
+ "description": "Related process name, when applicable.",
+ "type": "string"
+ },
+ "summary": {
+ "description": "Optional short plain-text tooltip.",
+ "type": "string"
+ },
+ "table": {
+ "description": "Related table name, when applicable.",
+ "type": "string"
+ },
+ "text": {
+ "description": "Plain-text help excerpt, at most 600 characters.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Icon": {
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "JobActionResponseV1": {
+ "properties": {
+ "jobId": {
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "JobDetailV1": {
+ "properties": {
+ "actions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "chunksDone": {
+ "type": "number"
+ },
+ "chunksTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "finishedAt": {
+ "type": "string"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "label": {
+ "type": "string"
+ },
+ "logSeq": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "processName": {
+ "type": "string"
+ },
+ "progress": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "done": {
+ "type": "number"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "phases": {
+ "items": {
+ "$ref": "#/components/schemas/JobPhaseV1"
+ },
+ "type": "array"
+ },
+ "total": {
+ "type": "number"
+ },
+ "unitLabel": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "queuedAt": {
+ "type": "string"
+ },
+ "rowsDone": {
+ "type": "number"
+ },
+ "rowsFailed": {
+ "type": "number"
+ },
+ "rowsTotal": {
+ "type": "number"
+ },
+ "sourceType": {
+ "type": "string"
+ },
+ "startedAt": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "summary": {
+ "type": "object"
+ },
+ "userId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "JobListResponseV1": {
+ "properties": {
+ "activeCount": {
+ "type": "number"
+ },
+ "generatedAt": {
+ "type": "string"
+ },
+ "jobs": {
+ "items": {
+ "$ref": "#/components/schemas/JobSummaryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "JobLogLineV1": {
+ "properties": {
+ "attempt": {
+ "type": "number"
+ },
+ "chunkId": {
+ "type": "number"
+ },
+ "id": {
+ "type": "number"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "level": {
+ "type": "string"
+ },
+ "loggedAt": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "phase": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "JobPhaseV1": {
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "weight": {
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "JobProgressPollV1": {
+ "properties": {
+ "job": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "chunksDone": {
+ "type": "number"
+ },
+ "chunksTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "finishedAt": {
+ "type": "string"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "label": {
+ "type": "string"
+ },
+ "logSeq": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "processName": {
+ "type": "string"
+ },
+ "queuedAt": {
+ "type": "string"
+ },
+ "rowsDone": {
+ "type": "number"
+ },
+ "rowsFailed": {
+ "type": "number"
+ },
+ "rowsTotal": {
+ "type": "number"
+ },
+ "sourceType": {
+ "type": "string"
+ },
+ "startedAt": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "userId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "log": {
+ "items": {
+ "$ref": "#/components/schemas/JobLogLineV1"
+ },
+ "type": "array"
+ },
+ "logDropped": {
+ "type": "number"
+ },
+ "nextAfterLogId": {
+ "type": "number"
+ },
+ "progress": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "done": {
+ "type": "number"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "phases": {
+ "items": {
+ "$ref": "#/components/schemas/JobPhaseV1"
+ },
+ "type": "array"
+ },
+ "total": {
+ "type": "number"
+ },
+ "unitLabel": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "terminal": {
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "JobProgressV1": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "done": {
+ "type": "number"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "phases": {
+ "items": {
+ "$ref": "#/components/schemas/JobPhaseV1"
+ },
+ "type": "array"
+ },
+ "total": {
+ "type": "number"
+ },
+ "unitLabel": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "JobSummaryV1": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "chunksDone": {
+ "type": "number"
+ },
+ "chunksTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "finishedAt": {
+ "type": "string"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "label": {
+ "type": "string"
+ },
+ "logSeq": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "processName": {
+ "type": "string"
+ },
+ "queuedAt": {
+ "type": "string"
+ },
+ "rowsDone": {
+ "type": "number"
+ },
+ "rowsFailed": {
+ "type": "number"
+ },
+ "rowsTotal": {
+ "type": "number"
+ },
+ "sourceType": {
+ "type": "string"
+ },
+ "startedAt": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "userId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "JobTrackRequestV1": {
+ "properties": {
+ "jobUUID": {
+ "type": "string"
+ },
+ "processName": {
+ "type": "string"
+ },
+ "processUUID": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "LogoutResponseV1": {
+ "type": "object"
+ },
+ "ManageSessionResponseV1": {
+ "properties": {
+ "uuid": {
+ "description": "Unique identifier of the session. Required to be returned on subsequent requests in the sessionUUID Cookie, to prove authentication. Not included when the cookie is HttpOnly or the session was resumed from that cookie.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": true,
+ "description": "Optional object with application-defined values.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "MaterialDashboardInstanceSettings": {
+ "properties": {
+ "processNamesToAddToAllQueryAndViewScreens": {
+ "description": "Names of processes to offer on the query and record-view screens of every table, in their configured order. Only processes that the user may see (i.e., that are in the meta-data's `processes` map) are listed, so the list may be empty.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordViewActionsPlacement": {
+ "description": "Where the record view puts its actions: IN_IDENTITY_SECTION or INLINE_WITH_PAGE_TITLE. When set, this overrides each table's placement.",
+ "type": "string"
+ },
+ "weekdayCriteriaSettings": {
+ "$ref": "#/components/schemas/MaterialDashboardWeekdayCriteriaSettings",
+ "description": "Weekday criteria settings for the query screens (day is any of, day is none of). Omitted when the material dashboard meta-data does not define them."
+ }
+ },
+ "type": "object"
+ },
+ "MaterialDashboardWeekdayCriteriaSettings": {
+ "properties": {
+ "dateTimeFieldFunctionArguments": {
+ "$ref": "#/components/schemas/WeekdayCriteriaArguments",
+ "description": "Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId).",
+ "type": "object"
+ },
+ "enabled": {
+ "description": "Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "MetaDataResponseV1": {
+ "properties": {
+ "appTree": {
+ "description": "Tree of apps within the QQQ Instance, sorted and organized hierarchically, for presentation to a user.",
+ "items": {
+ "$ref": "#/components/schemas/AppTreeNode"
+ },
+ "type": "array"
+ },
+ "apps": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/AppMetaData"
+ },
+ "description": "Map of all apps within the QQQ Instance (that the user has permission to see that they exist).",
+ "type": "object"
+ },
+ "branding": {
+ "description": "Application identity (names, logo, icon, accent colors and banners), when the instance defines it.",
+ "properties": {
+ "accentColor": {
+ "description": "Primary accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "accentColorLight": {
+ "description": "Light variant of the accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "appName": {
+ "description": "Name of this application, for display to users.",
+ "type": "string"
+ },
+ "banners": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/BrandingBanner"
+ },
+ "description": "Banners to display, keyed by the slot where each is shown.",
+ "type": "object"
+ },
+ "companyName": {
+ "description": "Name of the company that operates this application.",
+ "type": "string"
+ },
+ "companyUrl": {
+ "description": "URL for the company's web site.",
+ "type": "string"
+ },
+ "icon": {
+ "description": "Path or URL of the application's small icon image.",
+ "type": "string"
+ },
+ "logo": {
+ "description": "Path or URL of the application's logo image.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "environmentValues": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Environment values a frontend may use: Google Picker public browser settings GOOGLE_APP_CLIENT_ID and GOOGLE_APP_API_KEY, and the analytics settings (ANALYTICS_PROVIDERS, ANALYTICS_PLUGIN_SCRIPTS, ANALYTICS_PLUGIN_SCRIPT_URLS, GOOGLE_ANALYTICS_ENABLED, GOOGLE_ANALYTICS_TRACKING_ID, POSTHOG_ENABLED, POSTHOG_API_KEY, POSTHOG_PROJECT_API_KEY, POSTHOG_HOST, and any other ANALYTICS_* value), from the instance's QQQ_ENV_* environment. An explicit allow-list - never the whole environment. Omitted when none are set.",
+ "type": "object"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Instance-level help content, by slot name (for example the query screen's bulkAddFilterValues and bulkAddFilterValuesPossibleValueSource slots). Omitted when the instance defines none.",
+ "type": "object"
+ },
+ "homeAppName": {
+ "description": "Name of the app whose dashboard a frontend shows as the instance's home page (for example at /app/), when the instance designates one and the user may access that app. Omitted otherwise, in which case the frontend uses its own default home page.",
+ "type": "string"
+ },
+ "metaDataGeneration": {
+ "type": "number"
+ },
+ "processes": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ProcessMetaDataLight"
+ },
+ "description": "Map of all processes within the QQQ Instance (that the user has permission to see that they exist).",
+ "type": "object"
+ },
+ "reports": {
+ "additionalProperties": {
+ "properties": {
+ "hasPermission": {
+ "description": "Whether the user may run the report.",
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "iconName": {
+ "description": "Material UI icon name (web); prefer iconSemanticName",
+ "type": "string"
+ },
+ "iconSemanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ },
+ "label": {
+ "description": "User-facing name for this report.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this report within the QQQ Instance.",
+ "type": "string"
+ },
+ "processName": {
+ "description": "Process that runs this report, when it has one; otherwise it runs from GET /reports/{reportName}.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "description": "Map of all reports within the QQQ Instance (that the user has permission to see that they exist).",
+ "type": "object"
+ },
+ "supplementalInstanceMetaData": {
+ "description": "Settings from supplemental modules that a frontend may use (an explicit allow-list - not the supplemental meta-data objects themselves). Omitted when the instance defines none of them.",
+ "properties": {
+ "assistant": {
+ "additionalProperties": true,
+ "description": "Present (an object) when the instance has the assistant QBit's `assistant` supplemental meta-data - that is, when the assistant is installed and enabled, so a frontend may probe its routes. Always has `available: true`, plus the strings, numbers and booleans the QBit publishes for frontends.",
+ "type": "object"
+ },
+ "materialDashboard": {
+ "deprecated": true,
+ "description": "Use uiSettings; kept for Next UI until it migrates",
+ "properties": {
+ "processNamesToAddToAllQueryAndViewScreens": {
+ "description": "Names of processes to offer on the query and record-view screens of every table, in their configured order. Only processes that the user may see (i.e., that are in the meta-data's `processes` map) are listed, so the list may be empty.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordViewActionsPlacement": {
+ "description": "Where the record view puts its actions: IN_IDENTITY_SECTION or INLINE_WITH_PAGE_TITLE. When set, this overrides each table's placement.",
+ "type": "string"
+ },
+ "weekdayCriteriaSettings": {
+ "description": "Weekday criteria settings for the query screens (day is any of, day is none of). Omitted when the material dashboard meta-data does not define them.",
+ "properties": {
+ "dateTimeFieldFunctionArguments": {
+ "$ref": "#/components/schemas/WeekdayCriteriaArguments",
+ "description": "Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId).",
+ "type": "object"
+ },
+ "enabled": {
+ "description": "Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "materialDashboardTheme": {
+ "additionalProperties": true,
+ "deprecated": true,
+ "description": "Use uiSettings; kept for Next UI until it migrates. The application theme from the instance's MaterialDashboardThemeMetaData supplemental meta-data, when the instance defines it. Keys are MaterialDashboardThemeMetaData property names (for example primaryColor, fontFamily, typographyH1FontSize, borderRadiusGlobal, density, customCss, brandedHeaderEnabled, sidebarBackgroundColor, tableHeaderBackgroundColor); values are strings, numbers or booleans. An explicit allow-list of the theme's visual properties; properties without a value are omitted.",
+ "type": "object"
+ },
+ "uiSettings": {
+ "description": "Client-neutral process, query, record-view and theme settings.",
+ "properties": {
+ "processNamesToAddToAllQueryAndViewScreens": {
+ "description": "Visible processes offered on every query and record-view screen.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordViewActionsPlacement": {
+ "description": "Placement of record-view actions.",
+ "type": "string"
+ },
+ "theme": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Configured colors and font families; no web layout or CSS settings.",
+ "type": "object"
+ },
+ "weekdayCriteriaSettings": {
+ "description": "Weekday query criteria configuration.",
+ "properties": {
+ "dateTimeFieldFunctionArguments": {
+ "$ref": "#/components/schemas/WeekdayCriteriaArguments",
+ "description": "Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId).",
+ "type": "object"
+ },
+ "enabled": {
+ "description": "Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "tables": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/TableMetaDataLight"
+ },
+ "description": "Map of all tables within the QQQ Instance (that the user has permission to see that they exist).",
+ "type": "object"
+ },
+ "widgets": {
+ "additionalProperties": {
+ "properties": {
+ "defaultValues": {
+ "additionalProperties": true,
+ "description": "Frontend widget defaults, including explicit association bindings",
+ "type": "object"
+ },
+ "dropdowns": {
+ "description": "Dropdowns the widget offers to filter its data.",
+ "type": "array"
+ },
+ "footerHTML": {
+ "description": "HTML shown below the widget.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain-text footer, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "gridColumns": {
+ "description": "Number of grid columns (of 12) the widget spans.",
+ "type": "number"
+ },
+ "hasPermission": {
+ "description": "Whether the user may render the widget.",
+ "type": "boolean"
+ },
+ "helpContent": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help content by slot.",
+ "type": "object"
+ },
+ "icon": {
+ "description": "Name of the widget's icon.",
+ "type": "string"
+ },
+ "icons": {
+ "additionalProperties": true,
+ "description": "Icons by role (for example the widget header icon).",
+ "type": "object"
+ },
+ "isCard": {
+ "description": "Whether the widget is drawn as a card.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this widget",
+ "type": "string"
+ },
+ "minHeight": {
+ "description": "Minimum height of the widget (a CSS length).",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this widget within the QQQ Instance",
+ "type": "string"
+ },
+ "showExportButton": {
+ "description": "Whether the widget offers an export button.",
+ "type": "boolean"
+ },
+ "showReloadButton": {
+ "description": "Whether the widget offers a reload button.",
+ "type": "boolean"
+ },
+ "storeDropdownSelections": {
+ "description": "Whether dropdown selections are remembered for the user.",
+ "type": "boolean"
+ },
+ "tooltip": {
+ "description": "Tooltip text for the widget.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The type of this widget.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "description": "Map of all widgets within the QQQ Instance (that the user has permission to see that they exist).",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "OrderBy": {
+ "properties": {
+ "fieldName": {
+ "description": "Field name that this order-by applies to",
+ "type": "string"
+ },
+ "isAscending": {
+ "description": "Whether this order-by is ascending or descending",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "OutputRecord": {
+ "properties": {
+ "associatedRecords": {
+ "additionalProperties": {
+ "type": "array"
+ },
+ "description": "Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written.",
+ "type": "object"
+ },
+ "displayValues": {
+ "description": "Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings.",
+ "type": "object"
+ },
+ "errors": {
+ "description": "Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them.",
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Messages for warnings on this record. Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "PossibleValueOption": {
+ "properties": {
+ "displayValues": {
+ "description": "For a picker request: formatted or translated display values, where they differ from the raw values",
+ "type": "object"
+ },
+ "id": {
+ "description": "Unique identifier for this possible value option",
+ "type": "object"
+ },
+ "label": {
+ "description": "Human-readable label for this possible value option",
+ "type": "string"
+ },
+ "values": {
+ "description": "For a picker request: the option's picker display values (thumbnail, preview, subtitle and detail fields), raw",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PossibleValuesResponseV1": {
+ "properties": {
+ "hasMore": {
+ "description": "For a picker request: whether another page of options follows (the picker never counts)",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "options": {
+ "description": "List of possible value options matching the search request",
+ "items": {
+ "$ref": "#/components/schemas/PossibleValueOption"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceActionRequestV1": {
+ "additionalProperties": false,
+ "description": "Only rowKey and values are accepted. Identity always comes from the authenticated session.",
+ "properties": {
+ "rowKey": {
+ "description": "Required for ROW actions: a key loaded for this user with the action allowed. Forbidden for SECTION and LIST actions.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {},
+ "description": "Action input fields. Validated and coerced like PATCH fields; unknown fields are rejected.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceActionResponseV1": {
+ "description": "Action result and reloaded section. Secrets are shown once and must not be stored by clients. Response uses Cache-Control: no-store.",
+ "properties": {
+ "section": {
+ "$ref": "#/components/schemas/PreferenceSectionV1"
+ },
+ "message": {
+ "description": "User-facing outcome message.",
+ "type": "string"
+ },
+ "secrets": {
+ "description": "One-time secrets for immediate display; clients must not store them.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceSecretV1"
+ },
+ "type": "array"
+ },
+ "focusRowKey": {
+ "description": "Optional row key to focus after reloading the section.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceActionV1": {
+ "properties": {
+ "name": {
+ "description": "Stable action name used in URLs.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable action label.",
+ "type": "string"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon"
+ },
+ "description": {
+ "description": "Explanation for clients to display.",
+ "type": "string"
+ },
+ "scope": {
+ "description": "Where to display this action. ROW actions require a loaded row key.",
+ "enum": [
+ "SECTION",
+ "LIST",
+ "ROW"
+ ],
+ "type": "string"
+ },
+ "listName": {
+ "description": "List targeted by LIST or ROW actions; null for SECTION.",
+ "nullable": true,
+ "type": "string"
+ },
+ "confirmationText": {
+ "description": "When set, clients must confirm with this text before running the action.",
+ "nullable": true,
+ "type": "string"
+ },
+ "isDestructive": {
+ "description": "Whether clients should present this as a destructive action.",
+ "type": "boolean"
+ },
+ "inputFields": {
+ "description": "Action inputs, using preference field validation and coercion.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "order": {
+ "description": "Display order, ascending then label; defaults to 100.",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceListV1": {
+ "description": "A list of fixed preference rows, rendered with the same typed field editors as scalar preferences.",
+ "properties": {
+ "name": {
+ "description": "List name used in PATCH lists.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable list title.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Explanation of this list.",
+ "type": "string"
+ },
+ "rowLabel": {
+ "description": "Label for one row, such as Category.",
+ "type": "string"
+ },
+ "fields": {
+ "description": "Editable columns and their validation rules.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "rows": {
+ "description": "Fixed rows available to this user.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceRowV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceRowV1": {
+ "description": "A provider-owned row. Clients change row membership only through registered actions.",
+ "properties": {
+ "actionNames": {
+ "description": "Null allows every ROW action of this list; empty allows none; otherwise only the named actions are allowed.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "key": {
+ "description": "Stable provider row key to send when patching.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable row label.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Explanation of this row.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {},
+ "description": "Field name to typed value. Omitted fields retain their existing values; explicit null clears an optional field.",
+ "type": "object"
+ },
+ "readOnlyFields": {
+ "description": "Field names that cannot be changed for this row.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "readOnlyReason": {
+ "description": "Explain why the indicated fields are read-only.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceSecretV1": {
+ "properties": {
+ "label": {
+ "description": "Human-readable secret label.",
+ "type": "string"
+ },
+ "value": {
+ "description": "Shown once. Clients must not store, log, cache, or send this secret to analytics.",
+ "type": "string"
+ },
+ "masked": {
+ "description": "Masked representation, for example qqq_…7f3a.",
+ "type": "string"
+ },
+ "usageText": {
+ "description": "Usage guidance such as a curl example; may contain newlines.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceSectionPatchRequestV1": {
+ "additionalProperties": false,
+ "description": "Partial update for the signed-in user only. Unknown properties, fields, lists and rows, including userId, are rejected with 400. All validation errors are returned together; omitted fields and rows are unchanged.",
+ "properties": {
+ "values": {
+ "additionalProperties": {},
+ "description": "Changed scalar fields only. Explicit null clears an optional field. Types, required, maxLength, ENUM membership and editability are validated.",
+ "type": "object"
+ },
+ "lists": {
+ "additionalProperties": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "description": "Required fixed row key from the section response. No new rows can be created.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {},
+ "description": "Changed row fields only. Read-only fields are rejected.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "description": "List name to changed fixed rows. No add or remove operation is supported.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PreferenceSectionV1": {
+ "description": "One visible section with the signed-in user's current preferences.",
+ "properties": {
+ "showInUserMenu": {
+ "description": "Add a user-menu entry using the section label and icon to open this section; defaults to false.",
+ "type": "boolean"
+ },
+ "name": {
+ "description": "Stable section name used in URLs.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable section title.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Explanation for clients to display.",
+ "type": "string"
+ },
+ "appName": {
+ "description": "Optional owning application name.",
+ "type": "string"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon"
+ },
+ "order": {
+ "description": "Display order, ascending then label; defaults to 100.",
+ "type": "integer"
+ },
+ "fields": {
+ "description": "Scalar field definitions with editability, type, defaults and validation.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "values": {
+ "additionalProperties": {},
+ "description": "Field name to typed value. Omitted fields retain their existing values; explicit null clears an optional field.",
+ "type": "object"
+ },
+ "actions": {
+ "description": "Registered section, list and row actions, ordered by order then label.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceActionV1"
+ },
+ "type": "array"
+ },
+ "lists": {
+ "description": "Optional fixed-row preference lists.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceListV1"
+ },
+ "type": "array"
+ },
+ "possibleValues": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/PossibleValueOption"
+ },
+ "type": "array"
+ },
+ "description": "Every ENUM possible-value source referenced by scalar, list or action input fields, keyed by source name.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PreferencesResponseV1": {
+ "description": "Visible sections in display order, with only the signed-in user's values.",
+ "properties": {
+ "sections": {
+ "description": "Installed sections the session may access; an empty list is valid.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceSectionV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessCancelResponseV1": {
+ "type": "object"
+ },
+ "ProcessCapabilityV1": {
+ "properties": {
+ "available": {
+ "description": "True when the process exists and the user may run it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "processName": {
+ "description": "The process to run (present only when available).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessJobLaunchResponseV1": {
+ "properties": {
+ "jobId": {
+ "description": "Id of the new durable job (a jobs_job record; read it with GET /table/jobs_job/{jobId}).",
+ "type": "number"
+ },
+ "status": {
+ "description": "Status of the new job: QUEUED, or AWAITING_CONFIRMATION for a launch from the assistant channel.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessMetaData": {
+ "properties": {
+ "durableJobAlways": {
+ "description": "True when the process always runs as a durable background job (too large to run while the user waits).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "durableJobEligible": {
+ "description": "True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer \"Run in background\".",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "frontendSteps": {
+ "description": "Frontend steps (aka, Screens) for this process.",
+ "items": {
+ "$ref": "#/components/schemas/FrontendStep"
+ },
+ "type": "array"
+ },
+ "hasPermission": {
+ "description": "Boolean to indicate if the user has permission for the process.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the process."
+ },
+ "iconName": {
+ "description": "Material UI icon name (web); prefer iconSemanticName",
+ "type": "string"
+ },
+ "iconSemanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the process should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this process",
+ "type": "string"
+ },
+ "maxInputRecords": {
+ "description": "Most input records the process runs with, when it has a maximum.",
+ "type": "number"
+ },
+ "minInputRecords": {
+ "description": "Fewest input records the process runs with (for processes on a table's records).",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this process within the QQQ Instance",
+ "type": "string"
+ },
+ "stepFlow": {
+ "description": "Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "If this process is associated with a table, the table name is given here",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessMetaDataAdjustment": {
+ "properties": {
+ "updatedFields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values.",
+ "type": "object"
+ },
+ "updatedFrontendStepList": {
+ "description": "In case the backend has changed the list of frontend steps, it will be set in this field.",
+ "items": {
+ "$ref": "#/components/schemas/FrontendStep"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessMetaDataLight": {
+ "properties": {
+ "durableJobAlways": {
+ "description": "True when the process always runs as a durable background job (too large to run while the user waits).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "durableJobEligible": {
+ "description": "True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer \"Run in background\".",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "hasPermission": {
+ "description": "Boolean to indicate if the user has permission for the process.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the process."
+ },
+ "iconName": {
+ "description": "Material UI icon name (web); prefer iconSemanticName",
+ "type": "string"
+ },
+ "iconSemanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the process should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this process",
+ "type": "string"
+ },
+ "maxInputRecords": {
+ "description": "Most input records the process runs with, when it has a maximum.",
+ "type": "number"
+ },
+ "minInputRecords": {
+ "description": "Fewest input records the process runs with (for processes on a table's records).",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this process within the QQQ Instance",
+ "type": "string"
+ },
+ "stepFlow": {
+ "description": "Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "If this process is associated with a table, the table name is given here",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessMetaDataResponseV1": {
+ "properties": {
+ "durableJobAlways": {
+ "description": "True when the process always runs as a durable background job (too large to run while the user waits).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "durableJobEligible": {
+ "description": "True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer \"Run in background\".",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "frontendSteps": {
+ "description": "Frontend steps (aka, Screens) for this process.",
+ "items": {
+ "$ref": "#/components/schemas/FrontendStep"
+ },
+ "type": "array"
+ },
+ "hasPermission": {
+ "description": "Boolean to indicate if the user has permission for the process.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "icon": {
+ "description": "Icon to display for the process.",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "iconName": {
+ "description": "Material UI icon name (web); prefer iconSemanticName",
+ "type": "string"
+ },
+ "iconSemanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the process should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this process",
+ "type": "string"
+ },
+ "maxInputRecords": {
+ "description": "Most input records the process runs with, when it has a maximum.",
+ "type": "number"
+ },
+ "minInputRecords": {
+ "description": "Fewest input records the process runs with (for processes on a table's records).",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this process within the QQQ Instance",
+ "type": "string"
+ },
+ "stepFlow": {
+ "description": "Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "If this process is associated with a table, the table name is given here",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessRecordsResponseV1": {
+ "properties": {
+ "records": {
+ "description": "List of records from the process state",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ },
+ "totalRecords": {
+ "description": "Total number of records in the process state (before pagination)",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessStepComplete": {
+ "description": "Data returned after the job is complete (whether it was synchronous, or asynchronous)",
+ "properties": {
+ "backStep": {
+ "description": "Name of the step the process can go back to (restart at, by stepping with isStepBack=true), when the process declares one. Omitted otherwise.",
+ "type": "string"
+ },
+ "nextStep": {
+ "description": "Name of the next process step that needs to run (a frontend step). If there are no more steps in the process, this field will not be included. ",
+ "type": "string"
+ },
+ "oneTimeSecrets": {
+ "description": "Secrets shown once in synchronous init/step responses only. Never returned by status. Clients must not cache; response uses Cache-Control: no-store.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceSecretV1"
+ },
+ "type": "array"
+ },
+ "processMetaDataAdjustment": {
+ "description": "Changes to be made to the process's metaData.",
+ "properties": {
+ "updatedFields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values.",
+ "type": "object"
+ },
+ "updatedFrontendStepList": {
+ "description": "In case the backend has changed the list of frontend steps, it will be set in this field.",
+ "items": {
+ "properties": {
+ "backStepName": {
+ "description": "Name of the step a user can go back to from this step (step with isStepBack=true), when there is one.",
+ "type": "string"
+ },
+ "components": {
+ "description": "The components that make up this screen",
+ "items": {
+ "$ref": "#/components/schemas/FrontendComponent"
+ },
+ "type": "array"
+ },
+ "formFields": {
+ "description": "Fields used as form fields (inputs) on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ },
+ "helpContents": {
+ "description": "Help content shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "label": {
+ "description": "The user-facing name for this step",
+ "type": "string"
+ },
+ "name": {
+ "description": "The unique name for this step within its process",
+ "type": "string"
+ },
+ "recordListFields": {
+ "description": "Fields used in record-lists shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "viewFields": {
+ "description": "Fields used as view-only fields on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Current values for fields used by the process.Keys are Strings, values can be any type, as determined by the application & process.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessStepError": {
+ "description": "In case an error is thrown in the backend job.",
+ "properties": {
+ "error": {
+ "description": "Exception message, in case the process step threw an error.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ },
+ "userFacingError": {
+ "description": "Optional user-facing exception message, in case the process step threw a user-facing error.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessStepJobStarted": {
+ "description": "In case the backend needs more time, this is a UUID of the background job that has been started.",
+ "properties": {
+ "jobUUID": {
+ "description": "Unique identifier for a running step of the process. Must be passed into `status` check calls.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ProcessStepResponseV1": {
+ "oneOf": [
+ {
+ "description": "Data returned after the job is complete (whether it was synchronous, or asynchronous)",
+ "properties": {
+ "backStep": {
+ "description": "Name of the step the process can go back to (restart at, by stepping with isStepBack=true), when the process declares one. Omitted otherwise.",
+ "type": "string"
+ },
+ "nextStep": {
+ "description": "Name of the next process step that needs to run (a frontend step). If there are no more steps in the process, this field will not be included. ",
+ "type": "string"
+ },
+ "oneTimeSecrets": {
+ "description": "Secrets shown once in synchronous init/step responses only. Never returned by status. Clients must not cache; response uses Cache-Control: no-store.",
+ "items": {
+ "$ref": "#/components/schemas/PreferenceSecretV1"
+ },
+ "type": "array"
+ },
+ "processMetaDataAdjustment": {
+ "description": "Changes to be made to the process's metaData.",
+ "properties": {
+ "updatedFields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values.",
+ "type": "object"
+ },
+ "updatedFrontendStepList": {
+ "description": "In case the backend has changed the list of frontend steps, it will be set in this field.",
+ "items": {
+ "properties": {
+ "backStepName": {
+ "description": "Name of the step a user can go back to from this step (step with isStepBack=true), when there is one.",
+ "type": "string"
+ },
+ "components": {
+ "description": "The components that make up this screen",
+ "items": {
+ "$ref": "#/components/schemas/FrontendComponent"
+ },
+ "type": "array"
+ },
+ "formFields": {
+ "description": "Fields used as form fields (inputs) on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ },
+ "helpContents": {
+ "description": "Help content shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "label": {
+ "description": "The user-facing name for this step",
+ "type": "string"
+ },
+ "name": {
+ "description": "The unique name for this step within its process",
+ "type": "string"
+ },
+ "recordListFields": {
+ "description": "Fields used in record-lists shown on the step/screen.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "viewFields": {
+ "description": "Fields used as view-only fields on this step/screen",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Current values for fields used by the process.Keys are Strings, values can be any type, as determined by the application & process.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "In case the backend needs more time, this is a UUID of the background job that has been started.",
+ "properties": {
+ "jobUUID": {
+ "description": "Unique identifier for a running step of the process. Must be passed into `status` check calls.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Response to a status check for a backgrounded job.",
+ "properties": {
+ "current": {
+ "description": "Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`).",
+ "type": "number"
+ },
+ "logTail": {
+ "items": {
+ "$ref": "#/components/schemas/JobLogLineV1"
+ },
+ "type": "array"
+ },
+ "message": {
+ "description": "Status message regarding the running process step.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "progress": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "done": {
+ "type": "number"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "phases": {
+ "items": {
+ "$ref": "#/components/schemas/JobPhaseV1"
+ },
+ "type": "array"
+ },
+ "total": {
+ "type": "number"
+ },
+ "unitLabel": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "total": {
+ "description": "Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`).",
+ "type": "number"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "In case an error is thrown in the backend job.",
+ "properties": {
+ "error": {
+ "description": "Exception message, in case the process step threw an error.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ },
+ "userFacingError": {
+ "description": "Optional user-facing exception message, in case the process step threw a user-facing error.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ ]
+ },
+ "ProcessStepRunning": {
+ "description": "Response to a status check for a backgrounded job.",
+ "properties": {
+ "current": {
+ "description": "Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`).",
+ "type": "number"
+ },
+ "logTail": {
+ "items": {
+ "$ref": "#/components/schemas/JobLogLineV1"
+ },
+ "type": "array"
+ },
+ "message": {
+ "description": "Status message regarding the running process step.",
+ "type": "string"
+ },
+ "processUUID": {
+ "description": "Unique identifier for a running instance the process.",
+ "type": "string"
+ },
+ "progress": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "done": {
+ "type": "number"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "phases": {
+ "items": {
+ "$ref": "#/components/schemas/JobPhaseV1"
+ },
+ "type": "array"
+ },
+ "total": {
+ "type": "number"
+ },
+ "unitLabel": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "total": {
+ "description": "Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`).",
+ "type": "number"
+ },
+ "type": {
+ "description": "What kind of response has been received. Determines what additional fields will be set.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PublicBranding": {
+ "properties": {
+ "accentColor": {
+ "description": "Primary accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "accentColorLight": {
+ "description": "Light variant of the accent color, as a CSS color value.",
+ "type": "string"
+ },
+ "appName": {
+ "description": "Name of this application, for display to users.",
+ "type": "string"
+ },
+ "companyName": {
+ "description": "Name of the company that operates this application.",
+ "type": "string"
+ },
+ "icon": {
+ "description": "Path or URL of the application's small icon image.",
+ "type": "string"
+ },
+ "logo": {
+ "description": "Path or URL of the application's logo image.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "QueryFilter": {
+ "properties": {
+ "booleanOperator": {
+ "description": "Boolean operator to apply between criteria",
+ "enum": [
+ "AND",
+ "OR"
+ ],
+ "type": "string"
+ },
+ "criteria": {
+ "description": "Field level criteria that make up the query filter",
+ "items": {
+ "$ref": "#/components/schemas/FilterCriteria"
+ },
+ "type": "array"
+ },
+ "limit": {
+ "description": "Maximum number of results to return.",
+ "type": "number"
+ },
+ "orderBys": {
+ "description": "How the query's results should be ordered (sorted).",
+ "items": {
+ "$ref": "#/components/schemas/OrderBy"
+ },
+ "type": "array"
+ },
+ "skip": {
+ "description": "Records to skip (e.g., to implement pagination)",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "QueryJoin": {
+ "properties": {
+ "alias": {
+ "description": "Alias to apply to this table in the join query",
+ "type": "string"
+ },
+ "baseTableOrAlias": {
+ "description": "Base table (or an alias) that this QueryJoin is joined against",
+ "type": "string"
+ },
+ "joinName": {
+ "description": "Name of a join to use in case the baseTable and joinTable have more than one",
+ "type": "string"
+ },
+ "joinTable": {
+ "description": "Table being joined into the query by this QueryJoin",
+ "type": "string"
+ },
+ "select": {
+ "description": "Whether or not to select values from the join table",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "type": {
+ "description": "Type of join being performed (SQL semantics)",
+ "enum": [
+ "INNER",
+ "LEFT",
+ "RIGHT",
+ "FULL"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeChannelRevokedEventV1": {
+ "properties": {
+ "channel": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeEventV1": {
+ "properties": {
+ "channel": {
+ "type": "string"
+ },
+ "data": {
+ "description": "dataByType: hello -> RealtimeHelloEventV1; job.progress -> RealtimeJobProgressEventV1; record.changed -> RealtimeRecordChangedEventV1; record.deleted -> RealtimeRecordDeletedEventV1; table.changed -> RealtimeTableChangedEventV1; metadata.changed -> RealtimeMetaDataChangedEventV1; session-ended -> RealtimeSessionEndedEventV1; resync -> RealtimeResyncEventV1; channel-revoked -> RealtimeChannelRevokedEventV1. Selected by the envelope's event; data has no discriminator. All properties are optional; QBits may publish additional event-specific data.",
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "changedBy": {
+ "type": "string"
+ },
+ "channel": {
+ "type": "string"
+ },
+ "chunksDone": {
+ "type": "number"
+ },
+ "chunksTotal": {
+ "type": "number"
+ },
+ "connectionId": {
+ "type": "string"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "fields": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "generation": {
+ "type": "integer"
+ },
+ "heartbeatSeconds": {
+ "type": "integer"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "logSeq": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "metaDataGeneration": {
+ "type": "integer"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "pk": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ },
+ "rowsDone": {
+ "type": "number"
+ },
+ "rowsFailed": {
+ "type": "number"
+ },
+ "rowsPerSecond": {
+ "type": "number"
+ },
+ "rowsTotal": {
+ "type": "number"
+ },
+ "status": {
+ "type": "string"
+ },
+ "table": {
+ "type": "string"
+ },
+ "version": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "event": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeHelloEventV1": {
+ "properties": {
+ "connectionId": {
+ "type": "string"
+ },
+ "heartbeatSeconds": {
+ "type": "integer"
+ },
+ "metaDataGeneration": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeJobProgressEventV1": {
+ "properties": {
+ "bytesDone": {
+ "type": "number"
+ },
+ "bytesTotal": {
+ "type": "number"
+ },
+ "chunksDone": {
+ "type": "number"
+ },
+ "chunksTotal": {
+ "type": "number"
+ },
+ "currentPhase": {
+ "type": "string"
+ },
+ "etaSeconds": {
+ "type": "number"
+ },
+ "jobId": {
+ "type": "number"
+ },
+ "logSeq": {
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "percent": {
+ "type": "number"
+ },
+ "rowsDone": {
+ "type": "number"
+ },
+ "rowsFailed": {
+ "type": "number"
+ },
+ "rowsPerSecond": {
+ "type": "number"
+ },
+ "rowsTotal": {
+ "type": "number"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeMetaDataChangedEventV1": {
+ "properties": {
+ "generation": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeRecordChangedEventV1": {
+ "properties": {
+ "changedBy": {
+ "type": "string"
+ },
+ "fields": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "pk": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ },
+ "table": {
+ "type": "string"
+ },
+ "version": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeRecordDeletedEventV1": {
+ "properties": {
+ "pk": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ },
+ "table": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeResyncEventV1": {
+ "type": "object"
+ },
+ "RealtimeSessionEndedEventV1": {
+ "type": "object"
+ },
+ "RealtimeSubscriptionRequestV1": {
+ "properties": {
+ "add": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "connectionId": {
+ "type": "string"
+ },
+ "remove": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeSubscriptionResponseV1": {
+ "properties": {
+ "active": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "refused": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RealtimeTableChangedEventV1": {
+ "properties": {
+ "table": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RecordAssociatedScriptLogsResponseV1": {
+ "properties": {
+ "scriptLogRecords": {
+ "description": "The script revision's logs (scriptLog records, up to 100), newest (highest id) first. Each record's values include `scriptLogLine`: the log's lines, as a list of records (each with its own `values`, e.g., `text`).",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RecordAssociatedScriptStoreResponseV1": {
+ "properties": {
+ "scriptId": {
+ "description": "Id of the script (which is inserted, and referenced from the record, if the record did not yet reference one).",
+ "type": "number"
+ },
+ "scriptName": {
+ "description": "Name of the script.",
+ "type": "string"
+ },
+ "scriptRevisionId": {
+ "description": "Id of the new script revision.",
+ "type": "number"
+ },
+ "scriptRevisionSequenceNo": {
+ "description": "Sequence number of the new revision within the script (1 for its first revision).",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "RecordConflictV1": {
+ "properties": {
+ "changedFields": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "currentVersion": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ },
+ "modifiedAt": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ },
+ "modifiedByUserId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ],
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "RecordDeveloperModeAssociatedScript": {
+ "properties": {
+ "associatedScript": {
+ "$ref": "#/components/schemas/AssociatedScriptMetaData",
+ "description": "Definition of the associated script, from the table's meta-data."
+ },
+ "script": {
+ "$ref": "#/components/schemas/OutputRecord",
+ "description": "The script record that the record references. Omitted if the record does not reference an existing script."
+ },
+ "scriptRevisions": {
+ "description": "The script's revisions (scriptRevision records), newest (highest id) first. Present (possibly empty) when script is.",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ },
+ "scriptType": {
+ "$ref": "#/components/schemas/OutputRecord",
+ "description": "The scriptType record of the associated script. Omitted if there is no such record."
+ },
+ "testInputFields": {
+ "description": "Input fields for testing the script. Present (possibly empty) when the associated script has a script tester.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ },
+ "testOutputFields": {
+ "description": "Output fields from testing the script. Present (possibly empty) when the associated script has a script tester.",
+ "items": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RecordDeveloperModeResponseV1": {
+ "properties": {
+ "associatedScripts": {
+ "description": "Each of the table's associated scripts, with the script the record references (if any). Empty when the table has no associated scripts (or the instance has no script tables).",
+ "items": {
+ "$ref": "#/components/schemas/RecordDeveloperModeAssociatedScript"
+ },
+ "type": "array"
+ },
+ "record": {
+ "description": "The record, with display values (and possible values translated).",
+ "properties": {
+ "associatedRecords": {
+ "additionalProperties": {
+ "type": "array"
+ },
+ "description": "Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written.",
+ "type": "object"
+ },
+ "displayValues": {
+ "description": "Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings.",
+ "type": "object"
+ },
+ "errors": {
+ "description": "Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them.",
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Messages for warnings on this record. Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "RecordDeveloperPanelsResponseV1": {
+ "properties": {
+ "panels": {
+ "description": "The panels that the instance's developer panel providers contribute for this record, sorted by order then title. Each panel has an id, title, order, optional icon, description and status badge (statusLabel, statusTone: INFO, SUCCESS, WARNING or ERROR), and either an error message (when its provider failed) or a list of blocks. Each block has a type and a label; KEY_VALUES blocks use items (label, value, monospace, href), TEXT blocks use text and tone, CODE blocks use language and code, TABLE blocks use columns and rows (lists of display strings), LINKS blocks use links (label, href, description, external) and ACTIONS blocks use actions (label, processName, tableName, includeRecordId, description). Hrefs are app-relative (e.g., /app/table/1) or absolute.",
+ "items": {
+ "properties": {
+ "blocks": {
+ "type": "array"
+ },
+ "description": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "icon": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "order": {
+ "type": "number"
+ },
+ "statusLabel": {
+ "type": "string"
+ },
+ "statusTone": {
+ "enum": [
+ "INFO",
+ "SUCCESS",
+ "WARNING",
+ "ERROR"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RecordFeatureSummaryV1": {
+ "properties": {
+ "tableName": {
+ "type": "string"
+ },
+ "primaryKey": {
+ "type": "string"
+ },
+ "features": {
+ "items": {
+ "enum": [
+ "ATTACHMENTS",
+ "TAGS",
+ "CUSTOM_FIELDS",
+ "COMMENTS",
+ "PRESENCE",
+ "SHARING",
+ "FAVORITES",
+ "FOLLOW",
+ "TIMELINE",
+ "RECENTS",
+ "TASKS",
+ "ASSIGNMENT"
+ ],
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "capabilities": {
+ "additionalProperties": {
+ "type": "boolean"
+ },
+ "type": "object"
+ },
+ "isFavorite": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isFollowing": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "counts": {
+ "additionalProperties": {
+ "type": "integer"
+ },
+ "type": "object"
+ },
+ "owner": {
+ "nullable": true,
+ "type": "string"
+ },
+ "assignee": {
+ "nullable": true,
+ "type": "string"
+ },
+ "presence": {
+ "items": {
+ "additionalProperties": {},
+ "description": "Provider-defined presence entry: user identity and activity values.",
+ "type": "object"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "extensions": {
+ "additionalProperties": {
+ "additionalProperties": true,
+ "description": "Provider-specific record feature extension values.",
+ "type": "object"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "RecordFeaturesV1": {
+ "properties": {
+ "capabilities": {
+ "additionalProperties": {
+ "type": "boolean"
+ },
+ "type": "object"
+ },
+ "features": {
+ "items": {
+ "enum": [
+ "ATTACHMENTS",
+ "TAGS",
+ "CUSTOM_FIELDS",
+ "COMMENTS",
+ "PRESENCE",
+ "SHARING",
+ "FAVORITES",
+ "FOLLOW",
+ "TIMELINE",
+ "RECENTS",
+ "TASKS",
+ "ASSIGNMENT"
+ ],
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "ownership": {
+ "properties": {
+ "assigneeFieldName": {
+ "type": "string"
+ },
+ "ownerFieldName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "settings": {
+ "additionalProperties": {
+ "additionalProperties": true,
+ "description": "Feature-provider settings, keyed by provider-defined setting names.",
+ "type": "object"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchDetailV1": {
+ "properties": {
+ "displayValue": {
+ "description": "Display value of the field.",
+ "type": "string"
+ },
+ "fieldLabel": {
+ "description": "User-facing label of the field.",
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Name of the field.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchHighlightMatchV1": {
+ "properties": {
+ "end": {
+ "description": "Offset just after the last matched character (exclusive).",
+ "type": "number"
+ },
+ "start": {
+ "description": "Offset of the first matched character in the highlight text.",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchHighlightV1": {
+ "properties": {
+ "fieldLabel": {
+ "description": "User-facing label of the field.",
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Name of the field the snippet is from.",
+ "type": "string"
+ },
+ "matches": {
+ "description": "Matched spans in the text: sorted, non-overlapping character offsets (start inclusive, end exclusive).",
+ "items": {
+ "$ref": "#/components/schemas/RecordSearchHighlightMatchV1"
+ },
+ "type": "array"
+ },
+ "text": {
+ "description": "Plain-text snippet of the field value (never markup; an ellipsis marks trimmed ends).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchProviderStatusV1": {
+ "properties": {
+ "failureClass": {
+ "description": "When the provider failed: the simple class name of the root cause (e.g., ConnectException).",
+ "type": "string"
+ },
+ "message": {
+ "description": "When the provider failed with a user-facing error: its message (one line).",
+ "type": "string"
+ },
+ "status": {
+ "description": "OK: the provider searched the tables it claimed. FAILED: it failed, and those tables were searched with the default search. NONE: there is no provider, or it claimed none of the searched tables.",
+ "enum": [
+ "OK",
+ "FAILED",
+ "NONE"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchResponseV1": {
+ "properties": {
+ "provider": {
+ "description": "How the instance's record search provider fared: when its status is FAILED, the tables it claimed were searched with the default search instead (their source is FALLBACK).",
+ "properties": {
+ "failureClass": {
+ "description": "When the provider failed: the simple class name of the root cause (e.g., ConnectException).",
+ "type": "string"
+ },
+ "message": {
+ "description": "When the provider failed with a user-facing error: its message (one line).",
+ "type": "string"
+ },
+ "status": {
+ "description": "OK: the provider searched the tables it claimed. FAILED: it failed, and those tables were searched with the default search. NONE: there is no provider, or it claimed none of the searched tables.",
+ "enum": [
+ "OK",
+ "FAILED",
+ "NONE"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "results": {
+ "description": "Records whose search fields match the search term, grouped by table (in instance order) and, within each table, in the requested order (RELEVANCE: the search provider's order, or by primary key for the default search; RECENT: most recently modified first).",
+ "items": {
+ "$ref": "#/components/schemas/RecordSearchResultV1"
+ },
+ "type": "array"
+ },
+ "tables": {
+ "description": "A summary of each searched table, in the order of the results: how many results it returned, whether it has more, and what searched it.",
+ "items": {
+ "$ref": "#/components/schemas/RecordSearchTableSummaryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchResultV1": {
+ "properties": {
+ "details": {
+ "description": "Other search field values (not in the record label, and not highlighted) to show under the record label.",
+ "items": {
+ "$ref": "#/components/schemas/RecordSearchDetailV1"
+ },
+ "type": "array"
+ },
+ "highlights": {
+ "description": "Plain-text snippets of the fields (other than those in the record label) that match the search term, with the matched spans.",
+ "items": {
+ "$ref": "#/components/schemas/RecordSearchHighlightV1"
+ },
+ "type": "array"
+ },
+ "recordId": {
+ "description": "Primary key of the record, as a string.",
+ "type": "string"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "score": {
+ "description": "Relevance from the record search provider (higher is better); absent for the default search.",
+ "type": "number"
+ },
+ "tableLabel": {
+ "description": "User-facing label of the table that the record is from.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "updatedAt": {
+ "description": "When the record was last modified (ISO-8601 instant), when its table has a last-modified field the user may see.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RecordSearchTableSummaryV1": {
+ "properties": {
+ "hasMore": {
+ "description": "Whether the table has more matches past these results (request them with offset).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "resultCount": {
+ "description": "Number of results returned from the table.",
+ "type": "number"
+ },
+ "source": {
+ "description": "What searched the table: the record search PROVIDER, the DEFAULT search, or the default search as a FALLBACK because the provider failed.",
+ "enum": [
+ "PROVIDER",
+ "DEFAULT",
+ "FALLBACK"
+ ],
+ "type": "string"
+ },
+ "tableLabel": {
+ "description": "User-facing label of the table.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table.",
+ "type": "string"
+ },
+ "totalCount": {
+ "description": "Approximate total number of matches in the table, when the search knows it (records the user may not read can make it high).",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "RelatedRecordPicker": {
+ "properties": {
+ "associationName": {
+ "description": "The association whose rows the picker adds (MULTI_CHILD, LINK)",
+ "type": "string"
+ },
+ "canAddChildren": {
+ "description": "Whether the user may add child or join rows (prepare and add routes)",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "canCreateTarget": {
+ "description": "Whether to offer quick-create of a target record (insert route of targetTableName)",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "canRemoveChildren": {
+ "description": "Whether the user may unlink (remove route; LINK only)",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "childTableName": {
+ "description": "The child or join table new rows go into (MULTI_CHILD, LINK)",
+ "type": "string"
+ },
+ "childTargetFieldName": {
+ "description": "The child table's field that holds the picked record's key (MULTI_CHILD, LINK)",
+ "type": "string"
+ },
+ "columns": {
+ "description": "Target fields to show as result columns",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "defaultFilter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Initial, user-editable filter; the query route returns it resolved as resolvedDefaultFilter"
+ },
+ "fieldName": {
+ "description": "The foreign-key field the picker sets (SINGLE)",
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Filter the server always applies to the picker's queries (may contain ${input.fieldName} variables, read from the parent record)"
+ },
+ "label": {
+ "description": "Dialog title, and the label of the button that opens it",
+ "type": "string"
+ },
+ "maxSelections": {
+ "description": "Most records one add or link may pick (MULTI_CHILD, LINK)",
+ "type": "number"
+ },
+ "mode": {
+ "description": "SINGLE: choose one record for fieldName. MULTI_CHILD: add child rows through associationName, after a review of reviewFieldNames. LINK: link and unlink through associationName (a join table).",
+ "type": "string"
+ },
+ "name": {
+ "description": "Picker name; the {pickerName} path segment of the relatedRecordPicker routes",
+ "type": "string"
+ },
+ "previewFields": {
+ "description": "Target fields to show for the highlighted record",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "reviewFieldNames": {
+ "description": "Child fields the user fills per picked record before saving (MULTI_CHILD); empty means no review step",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "targetTableName": {
+ "description": "The table records are picked from (read its metadata for fields, sections and quickCreateSectionName)",
+ "type": "string"
+ },
+ "thumbnailField": {
+ "description": "Target field holding an image URL, for thumbnails",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "RelatedRecordPickerAddResponseV1": {
+ "properties": {
+ "records": {
+ "description": "The inserted child or join rows",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ },
+ "warnings": {
+ "description": "Warnings from the inserts, if any",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RelatedRecordPickerPrepareResponseV1": {
+ "properties": {
+ "records": {
+ "description": "One unsaved child row per target id, in request order, with defaults, values copied from the target, and the parent and target keys (whose display value is the target's label)",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ },
+ "reviewFieldNames": {
+ "description": "Child fields for the user to review per row before the add route; empty means add without a review",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "RelatedRecordPickerQueryResponseV1": {
+ "properties": {
+ "hasMore": {
+ "description": "Whether more records follow (request the next page with skip); there is no count",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "linkedIds": {
+ "description": "Ids (as strings) of the returned records the parent already has a child or join row for (MULTI_CHILD, LINK with primaryKey)",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "records": {
+ "description": "One page of target records (values and display values), in order",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ },
+ "resolvedDefaultFilter": {
+ "description": "The picker's defaultFilter with its variables resolved, to start the dialog's filter from (first page only)",
+ "properties": {
+ "booleanOperator": {
+ "description": "Boolean operator to apply between criteria",
+ "enum": [
+ "AND",
+ "OR"
+ ],
+ "type": "string"
+ },
+ "criteria": {
+ "description": "Field level criteria that make up the query filter",
+ "items": {
+ "$ref": "#/components/schemas/FilterCriteria"
+ },
+ "type": "array"
+ },
+ "limit": {
+ "description": "Maximum number of results to return.",
+ "type": "number"
+ },
+ "orderBys": {
+ "description": "How the query's results should be ordered (sorted).",
+ "items": {
+ "$ref": "#/components/schemas/OrderBy"
+ },
+ "type": "array"
+ },
+ "skip": {
+ "description": "Records to skip (e.g., to implement pagination)",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "RelatedRecordPickerRemoveResponseV1": {
+ "properties": {
+ "deletedCount": {
+ "description": "How many join rows were deleted",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "ReportMetaData": {
+ "properties": {
+ "hasPermission": {
+ "description": "Whether the user may run the report.",
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help entries by slot, filtered for the current session.",
+ "type": "object"
+ },
+ "iconName": {
+ "description": "Material UI icon name (web); prefer iconSemanticName",
+ "type": "string"
+ },
+ "iconSemanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ },
+ "label": {
+ "description": "User-facing name for this report.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this report within the QQQ Instance.",
+ "type": "string"
+ },
+ "processName": {
+ "description": "Process that runs this report, when it has one; otherwise it runs from GET /reports/{reportName}.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SavedViewsCapabilityV1": {
+ "properties": {
+ "available": {
+ "description": "True when the user may list saved views (queryProcessName can run).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "deleteProcessName": {
+ "description": "Deletes a view; absent when the user may not delete views.",
+ "type": "string"
+ },
+ "queryProcessName": {
+ "description": "Lists the views (input tableName; output savedViewList).",
+ "type": "string"
+ },
+ "storeProcessName": {
+ "description": "Stores (inserts or updates) a view; absent when the user may not store views.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SharingCapabilityV1": {
+ "properties": {
+ "available": {
+ "description": "True when the table is shareable and the user may list shares.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "deleteProcessName": {
+ "description": "Removes a share.",
+ "type": "string"
+ },
+ "editProcessName": {
+ "description": "Changes a share's scope.",
+ "type": "string"
+ },
+ "insertProcessName": {
+ "description": "Adds a share (the record owner only; the server checks).",
+ "type": "string"
+ },
+ "listProcessName": {
+ "description": "Lists a record's shares.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SupplementalInstanceMetaData": {
+ "properties": {
+ "assistant": {
+ "additionalProperties": true,
+ "description": "Present (an object) when the instance has the assistant QBit's `assistant` supplemental meta-data - that is, when the assistant is installed and enabled, so a frontend may probe its routes. Always has `available: true`, plus the strings, numbers and booleans the QBit publishes for frontends.",
+ "type": "object"
+ },
+ "materialDashboard": {
+ "$ref": "#/components/schemas/MaterialDashboardInstanceSettings",
+ "deprecated": true,
+ "description": "Use uiSettings; kept for Next UI until it migrates"
+ },
+ "materialDashboardTheme": {
+ "additionalProperties": true,
+ "deprecated": true,
+ "description": "Use uiSettings; kept for Next UI until it migrates. The application theme from the instance's MaterialDashboardThemeMetaData supplemental meta-data, when the instance defines it. Keys are MaterialDashboardThemeMetaData property names (for example primaryColor, fontFamily, typographyH1FontSize, borderRadiusGlobal, density, customCss, brandedHeaderEnabled, sidebarBackgroundColor, tableHeaderBackgroundColor); values are strings, numbers or booleans. An explicit allow-list of the theme's visual properties; properties without a value are omitted.",
+ "type": "object"
+ },
+ "uiSettings": {
+ "$ref": "#/components/schemas/UiSettings",
+ "description": "Client-neutral process, query, record-view and theme settings."
+ }
+ },
+ "type": "object"
+ },
+ "TableApiDocumentV1": {
+ "additionalProperties": true,
+ "description": "An OpenAPI 3 document (the application API's own format, not part of this API's schema).",
+ "type": "object"
+ },
+ "TableApiV1": {
+ "description": "An application API that exposes the table.",
+ "properties": {
+ "name": {
+ "description": "The API's name (a stable key).",
+ "type": "string"
+ },
+ "label": {
+ "description": "Label to show users.",
+ "type": "string"
+ },
+ "path": {
+ "description": "Root-relative base path of the API, e.g. `/api/`.",
+ "type": "string"
+ },
+ "currentVersion": {
+ "description": "The version the API calls current.",
+ "nullable": true,
+ "type": "string"
+ },
+ "versions": {
+ "description": "Every version the API serves.",
+ "items": {
+ "$ref": "#/components/schemas/TableApiVersionV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableApiVersionV1": {
+ "description": "One version of an API.",
+ "properties": {
+ "version": {
+ "description": "The version, as it appears in the API's URLs.",
+ "type": "string"
+ },
+ "semanticVersion": {
+ "description": "Its semantic version, when the API declares one.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableSpecPath": {
+ "description": "Root-relative path of the table's OpenAPI document (JSON) in this version.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "TableApisResponseV1": {
+ "description": "The APIs that expose a table.",
+ "properties": {
+ "apis": {
+ "description": "The APIs, by name.",
+ "items": {
+ "$ref": "#/components/schemas/TableApiV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableCapabilitiesV1": {
+ "properties": {
+ "SAVED_VIEW_DELETE_PROCESS": {
+ "type": "string"
+ },
+ "SAVED_VIEW_QUERY_PROCESS": {
+ "type": "string"
+ },
+ "SAVED_VIEW_STORE_PROCESS": {
+ "type": "string"
+ },
+ "audits": {
+ "$ref": "#/components/schemas/AuditsCapabilityV1",
+ "description": "Audit history of this table's records."
+ },
+ "bulkDelete": {
+ "$ref": "#/components/schemas/ProcessCapabilityV1",
+ "description": "Bulk delete of selected records."
+ },
+ "bulkEdit": {
+ "$ref": "#/components/schemas/ProcessCapabilityV1",
+ "description": "Bulk edit of selected records."
+ },
+ "bulkEditWithFile": {
+ "$ref": "#/components/schemas/ProcessCapabilityV1",
+ "description": "Bulk edit from a file."
+ },
+ "bulkInsert": {
+ "$ref": "#/components/schemas/ProcessCapabilityV1",
+ "description": "Bulk insert (load a file into the table)."
+ },
+ "savedViews": {
+ "$ref": "#/components/schemas/SavedViewsCapabilityV1",
+ "description": "Saved views of this table."
+ },
+ "sharing": {
+ "$ref": "#/components/schemas/SharingCapabilityV1",
+ "description": "Record sharing, for a shareable table."
+ }
+ },
+ "type": "object"
+ },
+ "TableCountResponseV1": {
+ "properties": {
+ "count": {
+ "description": "Number (count) of records that satisfy the query request",
+ "type": "number"
+ },
+ "distinctCount": {
+ "description": "Number (count) of distinct records that satisfy the query request. Only included if requested.",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "TableDeleteResponseV1": {
+ "properties": {
+ "deletedRecordCount": {
+ "description": "Number of records that were deleted",
+ "type": "number"
+ },
+ "errors": {
+ "description": "Why records were not deleted (for example, a record that was not found). Omitted when every record was deleted.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableGetResponseV1": {
+ "properties": {
+ "record": {
+ "description": "The record that was fetched",
+ "properties": {
+ "associatedRecords": {
+ "additionalProperties": {
+ "type": "array"
+ },
+ "description": "Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written.",
+ "type": "object"
+ },
+ "displayValues": {
+ "description": "Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings.",
+ "type": "object"
+ },
+ "errors": {
+ "description": "Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them.",
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Messages for warnings on this record. Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "TableInsertResponseV1": {
+ "properties": {
+ "record": {
+ "description": "The record that was inserted",
+ "properties": {
+ "associatedRecords": {
+ "additionalProperties": {
+ "type": "array"
+ },
+ "description": "Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written.",
+ "type": "object"
+ },
+ "displayValues": {
+ "description": "Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings.",
+ "type": "object"
+ },
+ "errors": {
+ "description": "Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them.",
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Messages for warnings on this record. Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Any warnings that occurred during the insert",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableMenu": {
+ "properties": {
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon of the menu's button."
+ },
+ "items": {
+ "description": "The menu's items, in order.",
+ "items": {
+ "$ref": "#/components/schemas/TableMenuItem"
+ },
+ "type": "array"
+ },
+ "label": {
+ "description": "User-facing label of the menu's button.",
+ "type": "string"
+ },
+ "slot": {
+ "description": "Where the menu goes: VIEW_SCREEN_ACTIONS, VIEW_SCREEN_ADDITIONAL, QUERY_SCREEN_ACTIONS or QUERY_SCREEN_ADDITIONAL (or a slot the application defines).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "TableMenuItem": {
+ "properties": {
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon of the item, when it overrides the frontend's default."
+ },
+ "itemType": {
+ "description": "What the item is and how a frontend handles it: BUILT_IN (a standard action named by values.option, such as NEW, COPY, EDIT, DELETE, DEVELOPER_MODE, AUDIT, THIS_TABLE_PROCESS_LIST or ALL_TABLES_PROCESS_LIST), RUN_PROCESS (values.processName), DOWNLOAD_FILE (values.fieldName), SUB_MENU and SUB_LIST (values.items), or DIVIDER.",
+ "type": "string"
+ },
+ "label": {
+ "description": "User-facing label of the item, when it overrides the frontend's default.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Item-type specific values: option for BUILT_IN, processName for RUN_PROCESS, fieldName for DOWNLOAD_FILE, and items (a list of menu items of this same shape) for SUB_MENU and SUB_LIST.",
+ "properties": {
+ "fieldName": {
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/TableMenuItem"
+ },
+ "type": "array"
+ },
+ "option": {
+ "type": "string"
+ },
+ "processName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "TableMetaData": {
+ "properties": {
+ "associations": {
+ "description": "Named record associations and their joins, without child record access",
+ "items": {
+ "$ref": "#/components/schemas/Association"
+ },
+ "type": "array"
+ },
+ "builtInViews": {
+ "description": "Built-in views; evaluate their filters in the current session without persisting the resolved user id.",
+ "items": {
+ "$ref": "#/components/schemas/BuiltInViewV1"
+ },
+ "type": "array"
+ },
+ "capabilities": {
+ "description": "List of strings describing actions that are supported by the backend application for the table.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "clientCapabilities": {
+ "$ref": "#/components/schemas/TableCapabilitiesV1",
+ "description": "What a client may offer on this table beyond plain CRUD - saved views, audits, sharing and the bulk processes - with the process or table to use for each, for the current user. Clients use these instead of hard-coded process names. Since 1.6.0."
+ },
+ "deletePermission": {
+ "description": "Boolean to indicate if the user has delete permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "editPermission": {
+ "description": "Boolean to indicate if the user has edit permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "exposedJoins": {
+ "description": "Sections to organize fields on screens for this record",
+ "items": {
+ "$ref": "#/components/schemas/ExposedJoin"
+ },
+ "type": "array"
+ },
+ "fields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Fields in this table",
+ "type": "object"
+ },
+ "hasRestrictedFields": {
+ "description": "True when any field has REVEALABLE, MASKED, or HIDDEN access for the current session.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help Contents for this table.",
+ "type": "object"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the table"
+ },
+ "insertPermission": {
+ "description": "Boolean to indicate if the user has insert permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the table should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this table",
+ "type": "string"
+ },
+ "menus": {
+ "description": "Menus the table defines for screen slots (for example the record view's VIEW_SCREEN_ACTIONS menu, which replaces the default actions menu, and VIEW_SCREEN_ADDITIONAL menus). Omitted when the table defines none.",
+ "items": {
+ "$ref": "#/components/schemas/TableMenu"
+ },
+ "type": "array"
+ },
+ "metaDataGeneration": {
+ "description": "Runtime metadata generation; refetch metadata when this changes.",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this table within the QQQ Instance",
+ "type": "string"
+ },
+ "primaryKeyField": {
+ "description": "Name of the primary key field in this table",
+ "type": "string"
+ },
+ "quickCreateSectionName": {
+ "description": "Name of the section whose editable fields a quick-create form shows (else the required, editable fields)",
+ "type": "string"
+ },
+ "readPermission": {
+ "description": "Boolean to indicate if the user has read permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "recordFeatures": {
+ "$ref": "#/components/schemas/RecordFeaturesV1",
+ "description": "Enabled record collaboration features, public settings, and this session's table capabilities."
+ },
+ "relatedRecordPickers": {
+ "description": "Related-record pickers of this table whose target the user may read (docs/RELATED-RECORD-PICKER.md)",
+ "items": {
+ "$ref": "#/components/schemas/RelatedRecordPicker"
+ },
+ "type": "array"
+ },
+ "searchFields": {
+ "description": "Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "sections": {
+ "description": "Sections to organize fields on screens for this record",
+ "items": {
+ "$ref": "#/components/schemas/TableSection"
+ },
+ "type": "array"
+ },
+ "shareableTableMetaData": {
+ "description": "For tables that support the sharing feature, meta-data about the sharing setup.",
+ "properties": {
+ "assetIdFieldName": {
+ "type": "string"
+ },
+ "audiencePossibleValueSourceName": {
+ "type": "string"
+ },
+ "audienceTypes": {
+ "type": "object"
+ },
+ "audienceTypesPossibleValueSourceName": {
+ "type": "string"
+ },
+ "scopeFieldName": {
+ "type": "string"
+ },
+ "sharedRecordTableName": {
+ "type": "string"
+ },
+ "thisTableOwnerIdFieldName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "supplementalMetaData": {
+ "description": "Additional meta data about the table, not necessarily known to QQQ.",
+ "type": "object"
+ },
+ "usesVariants": {
+ "description": "Whether or not this table's backend uses variants.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "variantTableLabel": {
+ "description": "If the table uses variants, this is the user-facing label for the table that supplies variants for this table.",
+ "type": "string"
+ },
+ "virtualFields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/VirtualFieldMetaData"
+ },
+ "description": "Virtual fields in this table",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "TableMetaDataLight": {
+ "properties": {
+ "capabilities": {
+ "description": "List of strings describing actions that are supported by the backend application for the table.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "deletePermission": {
+ "description": "Boolean to indicate if the user has delete permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "editPermission": {
+ "description": "Boolean to indicate if the user has edit permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help Contents for this table.",
+ "type": "object"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the table"
+ },
+ "insertPermission": {
+ "description": "Boolean to indicate if the user has insert permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the table should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this table",
+ "type": "string"
+ },
+ "metaDataGeneration": {
+ "description": "Runtime metadata generation; refetch metadata when this changes.",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this table within the QQQ Instance",
+ "type": "string"
+ },
+ "readPermission": {
+ "description": "Boolean to indicate if the user has read permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "recordFeatures": {
+ "$ref": "#/components/schemas/RecordFeaturesV1",
+ "description": "Enabled record collaboration features, public settings, and this session's table capabilities."
+ },
+ "searchFields": {
+ "description": "Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "variantTableLabel": {
+ "description": "If the table uses variants, this is the user-facing label for the table that supplies variants for this table.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "TableMetaDataResponseV1": {
+ "properties": {
+ "associations": {
+ "description": "Named record associations and their joins, without child record access",
+ "items": {
+ "$ref": "#/components/schemas/Association"
+ },
+ "type": "array"
+ },
+ "builtInViews": {
+ "description": "Built-in views; evaluate their filters in the current session without persisting the resolved user id.",
+ "items": {
+ "$ref": "#/components/schemas/BuiltInViewV1"
+ },
+ "type": "array"
+ },
+ "capabilities": {
+ "description": "List of strings describing actions that are supported by the backend application for the table.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "clientCapabilities": {
+ "description": "What a client may offer on this table beyond plain CRUD - saved views, audits, sharing and the bulk processes - with the process or table to use for each, for the current user. Clients use these instead of hard-coded process names. Since 1.6.0.",
+ "properties": {
+ "SAVED_VIEW_DELETE_PROCESS": {
+ "type": "string"
+ },
+ "SAVED_VIEW_QUERY_PROCESS": {
+ "type": "string"
+ },
+ "SAVED_VIEW_STORE_PROCESS": {
+ "type": "string"
+ },
+ "audits": {
+ "description": "Audit history of this table's records.",
+ "properties": {
+ "available": {
+ "description": "True when the table is audited and the user can read its audits one of the two ways.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "detailTableName": {
+ "description": "The audit detail table (field changes), joined to tableName.",
+ "type": "string"
+ },
+ "level": {
+ "description": "The table's audit level: NONE, RECORD or FIELD.",
+ "type": "string"
+ },
+ "processName": {
+ "description": "The process that returns a record's audits (inputs tableName, recordId); absent when the user may not run it.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "The audit table, when the user may query it directly.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "bulkDelete": {
+ "description": "Bulk delete of selected records.",
+ "properties": {
+ "available": {
+ "description": "True when the process exists and the user may run it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "processName": {
+ "description": "The process to run (present only when available).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "bulkEdit": {
+ "description": "Bulk edit of selected records.",
+ "properties": {
+ "available": {
+ "description": "True when the process exists and the user may run it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "processName": {
+ "description": "The process to run (present only when available).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "bulkEditWithFile": {
+ "description": "Bulk edit from a file.",
+ "properties": {
+ "available": {
+ "description": "True when the process exists and the user may run it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "processName": {
+ "description": "The process to run (present only when available).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "bulkInsert": {
+ "description": "Bulk insert (load a file into the table).",
+ "properties": {
+ "available": {
+ "description": "True when the process exists and the user may run it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "processName": {
+ "description": "The process to run (present only when available).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "savedViews": {
+ "description": "Saved views of this table.",
+ "properties": {
+ "available": {
+ "description": "True when the user may list saved views (queryProcessName can run).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "deleteProcessName": {
+ "description": "Deletes a view; absent when the user may not delete views.",
+ "type": "string"
+ },
+ "queryProcessName": {
+ "description": "Lists the views (input tableName; output savedViewList).",
+ "type": "string"
+ },
+ "storeProcessName": {
+ "description": "Stores (inserts or updates) a view; absent when the user may not store views.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "sharing": {
+ "description": "Record sharing, for a shareable table.",
+ "properties": {
+ "available": {
+ "description": "True when the table is shareable and the user may list shares.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "deleteProcessName": {
+ "description": "Removes a share.",
+ "type": "string"
+ },
+ "editProcessName": {
+ "description": "Changes a share's scope.",
+ "type": "string"
+ },
+ "insertProcessName": {
+ "description": "Adds a share (the record owner only; the server checks).",
+ "type": "string"
+ },
+ "listProcessName": {
+ "description": "Lists a record's shares.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "deletePermission": {
+ "description": "Boolean to indicate if the user has delete permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "editPermission": {
+ "description": "Boolean to indicate if the user has edit permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "exposedJoins": {
+ "description": "Sections to organize fields on screens for this record",
+ "items": {
+ "$ref": "#/components/schemas/ExposedJoin"
+ },
+ "type": "array"
+ },
+ "fields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FieldMetaData"
+ },
+ "description": "Fields in this table",
+ "type": "object"
+ },
+ "hasRestrictedFields": {
+ "description": "True when any field has REVEALABLE, MASKED, or HIDDEN access for the current session.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "helpContents": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "description": "Help Contents for this table.",
+ "type": "object"
+ },
+ "icon": {
+ "description": "Icon to display for the table",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "insertPermission": {
+ "description": "Boolean to indicate if the user has insert permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Boolean indicator of whether the table should be shown to users or not",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this table",
+ "type": "string"
+ },
+ "menus": {
+ "description": "Menus the table defines for screen slots (for example the record view's VIEW_SCREEN_ACTIONS menu, which replaces the default actions menu, and VIEW_SCREEN_ADDITIONAL menus). Omitted when the table defines none.",
+ "items": {
+ "$ref": "#/components/schemas/TableMenu"
+ },
+ "type": "array"
+ },
+ "metaDataGeneration": {
+ "description": "Runtime metadata generation; refetch metadata when this changes.",
+ "type": "number"
+ },
+ "name": {
+ "description": "Unique name for this table within the QQQ Instance",
+ "type": "string"
+ },
+ "primaryKeyField": {
+ "description": "Name of the primary key field in this table",
+ "type": "string"
+ },
+ "quickCreateSectionName": {
+ "description": "Name of the section whose editable fields a quick-create form shows (else the required, editable fields)",
+ "type": "string"
+ },
+ "readPermission": {
+ "description": "Boolean to indicate if the user has read permission for the table.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "recordFeatures": {
+ "$ref": "#/components/schemas/RecordFeaturesV1"
+ },
+ "relatedRecordPickers": {
+ "description": "Related-record pickers of this table whose target the user may read (docs/RELATED-RECORD-PICKER.md)",
+ "items": {
+ "$ref": "#/components/schemas/RelatedRecordPicker"
+ },
+ "type": "array"
+ },
+ "searchFields": {
+ "description": "Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "sections": {
+ "description": "Sections to organize fields on screens for this record",
+ "items": {
+ "$ref": "#/components/schemas/TableSection"
+ },
+ "type": "array"
+ },
+ "shareableTableMetaData": {
+ "description": "For tables that support the sharing feature, meta-data about the sharing setup.",
+ "properties": {
+ "assetIdFieldName": {
+ "type": "string"
+ },
+ "audiencePossibleValueSourceName": {
+ "type": "string"
+ },
+ "audienceTypes": {
+ "type": "object"
+ },
+ "audienceTypesPossibleValueSourceName": {
+ "type": "string"
+ },
+ "scopeFieldName": {
+ "type": "string"
+ },
+ "sharedRecordTableName": {
+ "type": "string"
+ },
+ "thisTableOwnerIdFieldName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "supplementalMetaData": {
+ "description": "Additional meta data about the table, not necessarily known to QQQ.",
+ "type": "object"
+ },
+ "usesVariants": {
+ "description": "Whether or not this table's backend uses variants.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "variantTableLabel": {
+ "description": "If the table uses variants, this is the user-facing label for the table that supplies variants for this table.",
+ "type": "string"
+ },
+ "virtualFields": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/VirtualFieldMetaData"
+ },
+ "description": "Virtual fields in this table",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "TableQueryResponseV1": {
+ "properties": {
+ "records": {
+ "description": "List of records that satisfy the query request",
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableSection": {
+ "properties": {
+ "alternatives": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/TableSection"
+ },
+ "description": "Alternative versions of this section for specific screens, keyed by alternative type (for example RECORD_VIEW or RECORD_EDIT). A screen of that type uses the alternative in place of this definition. Omitted when there are none.",
+ "type": "object"
+ },
+ "collapsible": {
+ "$ref": "#/components/schemas/TableSectionCollapsible",
+ "description": "Whether screens that can collapse sections may collapse this one, and whether it starts open. Omitted when the section defines no collapsible behavior."
+ },
+ "fieldNames": {
+ "description": "List of field names to include in this section.",
+ "type": "array"
+ },
+ "gridColumns": {
+ "description": "Layout suggestion, for how many columns of a 12-grid this section should use.",
+ "type": "number"
+ },
+ "helpContents": {
+ "description": "Help Contents for this section table.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "icon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "Icon to display for the table"
+ },
+ "label": {
+ "description": "User-facing label to display for this section",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique identifier for this section within this table",
+ "type": "string"
+ },
+ "tier": {
+ "description": "Importance of this section (T1, T2, or T3)",
+ "type": "string"
+ },
+ "widgetName": {
+ "description": "Name of a widget in this QQQ instance to include in this section (instead of fields).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "TableSectionCollapsible": {
+ "properties": {
+ "initiallyOpen": {
+ "description": "Whether a collapsible section starts open, before the user has opened or closed it.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isCollapsible": {
+ "description": "Whether screens that can collapse sections let the user collapse and expand this one.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "TableUpdateResponseV1": {
+ "properties": {
+ "record": {
+ "description": "The record that was updated",
+ "properties": {
+ "associatedRecords": {
+ "additionalProperties": {
+ "type": "array"
+ },
+ "description": "Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written.",
+ "type": "object"
+ },
+ "displayValues": {
+ "description": "Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings.",
+ "type": "object"
+ },
+ "errors": {
+ "description": "Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordLabel": {
+ "description": "Label to identify the record to a user.",
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Name of the table that the record is from.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them.",
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Messages for warnings on this record. Omitted when there are none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Any warnings that occurred during the update",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "TableVariant": {
+ "properties": {
+ "id": {
+ "description": "Identifier for the variant option (record) being used.",
+ "type": "string"
+ },
+ "name": {
+ "description": "A user-facing name (or label) for the variant option being used.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Specification for the variant type (variantTypeKey from QQQ BackendVariantsConfig)",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "TableVariantsResponseV1": {
+ "properties": {
+ "variants": {
+ "description": "The variants the table's backend can be scoped to - send one back as tableVariant in query, count, get and export requests. Empty (always present) when the backend does not use variants.",
+ "items": {
+ "$ref": "#/components/schemas/TableVariant"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "UiApiExtensionInfo": {
+ "properties": {
+ "description": {
+ "description": "A short description of the extension.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The extension namespace, e.g. alerts or sql-workbench.",
+ "type": "string"
+ },
+ "pathPrefix": {
+ "description": "The path prefix of the extension operations under the API base path, e.g. /qbit/backups or /esb.",
+ "type": "string"
+ },
+ "version": {
+ "description": "The extension semantic version (MAJOR.MINOR.PATCH).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "UiSettings": {
+ "properties": {
+ "processNamesToAddToAllQueryAndViewScreens": {
+ "description": "Visible processes offered on every query and record-view screen.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "recordViewActionsPlacement": {
+ "description": "Placement of record-view actions.",
+ "type": "string"
+ },
+ "theme": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Configured colors and font families; no web layout or CSS settings.",
+ "type": "object"
+ },
+ "weekdayCriteriaSettings": {
+ "$ref": "#/components/schemas/MaterialDashboardWeekdayCriteriaSettings",
+ "description": "Weekday query criteria configuration."
+ }
+ },
+ "type": "object"
+ },
+ "UploadRefResponseV1": {
+ "properties": {
+ "contentType": {
+ "description": "The file's content type, as uploaded.",
+ "type": "string"
+ },
+ "expiresAt": {
+ "description": "When the ref stops working (ISO-8601). A job that uses it extends it.",
+ "type": "string"
+ },
+ "fileName": {
+ "description": "The file's name.",
+ "type": "string"
+ },
+ "ref": {
+ "description": "Opaque ref to the uploaded file, bound to the uploading user. Pass it in uploadRefs.",
+ "type": "string"
+ },
+ "sizeBytes": {
+ "description": "The file's size in bytes.",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "VersionResponseV1": {
+ "properties": {
+ "apiVersion": {
+ "description": "Semantic version (MAJOR.MINOR.PATCH) of the UI API this server implements. MAJOR matches the URL version (v1). A client built against 1.x works with any server 1.y where y >= x.",
+ "type": "string"
+ },
+ "basePath": {
+ "description": "Base path of this API version, e.g. /qqq/v1.",
+ "type": "string"
+ },
+ "clientChannels": {
+ "description": "Client channel names the server accepts in the X-QQQ-Client request header (`channel[/detail]`, e.g. next-ui, assistant/). A client names itself on every request; it is recorded in audits and some objects are denied to some channels. The actor is always the signed-in user; a channel never grants anything.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "extensions": {
+ "description": "Extensions (modules and qbits) registered on this server, each with its own path prefix and semantic version.",
+ "items": {
+ "$ref": "#/components/schemas/UiApiExtensionInfo"
+ },
+ "type": "array"
+ },
+ "features": {
+ "description": "Names of the optional core features this server supports, so a client can show or hide an area without probing.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "supportedMajorVersions": {
+ "description": "The major versions of the UI API this server serves.",
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "VirtualFieldMetaData": {
+ "properties": {
+ "accessTier": {
+ "description": "Effective field access: FULL, REVEALABLE, MASKED, or HIDDEN. Omitted means FULL. Restricted values are strings, regardless of field type.",
+ "enum": [
+ "FULL",
+ "REVEALABLE",
+ "MASKED",
+ "HIDDEN"
+ ],
+ "type": "string"
+ },
+ "adornments": {
+ "description": "Special UI dressings to add to the field.",
+ "items": {
+ "$ref": "#/components/schemas/FieldAdornment"
+ },
+ "type": "array"
+ },
+ "allowedFilterOperators": {
+ "description": "Allowed filter operators when restricted: EQUALS and IN for REVEALABLE when exact match is enabled, otherwise empty. Omitted means unrestricted.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "behaviors": {
+ "description": "Names of the field's behaviors that a frontend applies while editing, e.g., TO_UPPER_CASE, TO_LOWER_CASE or TRIM. Absent when the field has none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "defaultValue": {
+ "description": "Default value to use in this field.",
+ "type": "string"
+ },
+ "displayFormat": {
+ "description": "C-style format specifier for displaying values in this field.",
+ "type": "string"
+ },
+ "gridColumns": {
+ "description": "Width of this field in a 12-column record form or view grid (e.g., 12 for the full width, 6 for half). Absent when the frontend's default applies.",
+ "type": "number"
+ },
+ "helpContents": {
+ "description": "Help Contents for this field.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "inlinePossibleValueSource": {
+ "description": "Inline possible-value source for this field; enumValues supply choices without a separate lookup.",
+ "properties": {
+ "customCodeReference": {
+ "properties": {
+ "codeType": {
+ "enum": [
+ "JAVA",
+ "JAVA_SCRIPT"
+ ],
+ "type": "string"
+ },
+ "inlineCode": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "enumValues": {
+ "type": "array"
+ },
+ "helpContent": {
+ "type": "object"
+ },
+ "idType": {
+ "enum": [
+ "STRING",
+ "INTEGER",
+ "LONG",
+ "DECIMAL",
+ "BOOLEAN",
+ "DATE",
+ "TIME",
+ "DATE_TIME",
+ "TEXT",
+ "HTML",
+ "PASSWORD",
+ "BLOB"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "orderByFields": {
+ "type": "array"
+ },
+ "overrideIdField": {
+ "type": "string"
+ },
+ "picker": {
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "tableName": {
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ "ENUM",
+ "TABLE",
+ "CUSTOM"
+ ],
+ "type": "string"
+ },
+ "valueFields": {
+ "type": "array"
+ },
+ "valueFieldsIfNotFound": {
+ "type": "array"
+ },
+ "valueFormat": {
+ "type": "string"
+ },
+ "valueFormatIfNotFound": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "isEditable": {
+ "description": "Indicate if user may edit the value in this field.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHeavy": {
+ "description": "Indicator of 'heavy' fields, which are not loaded by default. e.g., some blobs or long-texts",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Indicate if this field should be hidden from users",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isQueryCriteria": {
+ "description": "Indicator of whether or not this virtual field can be included as a query filter criteria",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isQuerySelectable": {
+ "description": "Indicator of whether or not this virtual field can be included in query outputs (e.g., if it can be selected, in the SQL sense)",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isRequired": {
+ "description": "Indicate if a value in this field is required.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isSortable": {
+ "description": "False for restricted fields; omitted means sortable.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this field",
+ "type": "string"
+ },
+ "maxLength": {
+ "description": "For String fields, the max length the field supports.",
+ "type": "number"
+ },
+ "maxValue": {
+ "description": "For number fields, the largest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "minValue": {
+ "description": "For number fields, the smallest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this field within its container (table or process)",
+ "type": "string"
+ },
+ "picker": {
+ "description": "When this field's possible value source declares a record picker (for sources over large tables), its configuration: thumbnail, preview, subtitle and detail fields, filter fields, search fields, sorts and page size. Frontends offer a searchable, paged picker dialog.",
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "pickerTableName": {
+ "description": "When this field has a picker, the table its possible value source reads, whose metadata describes the picker's fields.",
+ "type": "string"
+ },
+ "possibleValueSourceDependencyBehavior": {
+ "description": "DISABLE_UNTIL_SET disables a contingent field until its dependencies are set (default). SHOW_ALL_UNTIL_SET keeps it enabled and omits criteria with missing inputs in form searches. Absent for non-contingent fields.",
+ "enum": [
+ "DISABLE_UNTIL_SET",
+ "SHOW_ALL_UNTIL_SET"
+ ],
+ "type": "string"
+ },
+ "possibleValueSourceDependsOn": {
+ "description": "Names of fields controlling this field's choices, including explicit and filter dependencies. Absent for non-contingent fields.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "possibleValueSourceName": {
+ "description": "If this field's values should come from a possible value source, then that PVS is named here.",
+ "type": "string"
+ },
+ "supplementalMetaData": {
+ "description": "Additional frontend-visible metadata for this field, keyed by supplemental type.",
+ "type": "object"
+ },
+ "type": {
+ "description": "Data-type for this field",
+ "type": "string"
+ },
+ "validation": {
+ "$ref": "#/components/schemas/FieldValidationV1",
+ "description": "The field's validation rules, as the server enforces them on insert and update (required, maxLength and tooLongBehavior, min/max value, pattern). Absent when the field has none. Since 1.6.0."
+ }
+ },
+ "type": "object"
+ },
+ "WeekdayCriteriaArguments": {
+ "additionalProperties": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ }
+ ]
+ },
+ "properties": {
+ "timeZoneId": {
+ "type": "string"
+ },
+ "useSessionZoneId": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlock": {
+ "properties": {
+ "blockId": {
+ "description": "Unique identifier for this block within it widget. Used as a key for helpContents.",
+ "type": "string"
+ },
+ "blockType": {
+ "description": "What type of block to render.",
+ "enum": [
+ "BUTTON",
+ "AUDIO",
+ "BIG_NUMBER",
+ "COMPOSITE",
+ "DIVIDER",
+ "IMAGE",
+ "INPUT_FIELD",
+ "NUMBER_ICON_BADGE",
+ "PROGRESS_BAR",
+ "TABLE_SUB_ROW_DETAIL_ROW",
+ "TEXT",
+ "UP_OR_DOWN_NUMBER"
+ ],
+ "type": "string"
+ },
+ "blockTypeName": {
+ "description": "Name of the block's type, as the backend declares it (including types this API version does not enumerate in blockType).",
+ "type": "string"
+ },
+ "conditional": {
+ "description": "Optional field name (e.g,. from a process's set of fields) to act as a 'guard' for the block - e.g., only include it in the UI if the value for this field is true",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Footer as plain text.",
+ "type": "string"
+ },
+ "layout": {
+ "description": "For COMPOSITE type blocks, an indicator of how the sub-blocks should be laid out",
+ "enum": [
+ "FLEX_COLUMN",
+ "FLEX_ROW_WRAPPED",
+ "FLEX_ROW_SPACE_BETWEEN",
+ "FLEX_ROW_CENTER",
+ "TABLE_SUB_ROW_DETAILS",
+ "BADGES_WRAPPER"
+ ],
+ "type": "string"
+ },
+ "modalMode": {
+ "description": "For COMPOSITE type blocks, optional control to make the widget appear modally",
+ "enum": [
+ "MODAL"
+ ],
+ "type": "string"
+ },
+ "overlayHtml": {
+ "description": "Composite overlay as HTML.",
+ "type": "string"
+ },
+ "overlayText": {
+ "description": "Composite overlay as plain text.",
+ "type": "string"
+ },
+ "styles": {
+ "$ref": "#/components/schemas/WidgetBlockStyles",
+ "description": "Styles to apply to the block. Different fields based on blockType.",
+ "oneOf": [
+ {
+ "properties": {
+ "backgroundColor": {
+ "description": "A background color to use for the block",
+ "type": "string"
+ },
+ "padding": {
+ "description": "Optional padding to apply to the block",
+ "properties": {
+ "bottom": {
+ "type": "object"
+ },
+ "left": {
+ "type": "object"
+ },
+ "right": {
+ "type": "object"
+ },
+ "top": {
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "properties": {
+ "color": {
+ "description": "A Color to use for the button. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code.",
+ "type": "string"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this block, such as OUTLINED, FILLED, or TEXT. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "properties": {
+ "height": {
+ "description": "A request to render the image at a specified height.",
+ "type": "string"
+ },
+ "padding": {
+ "description": "Optional padding to apply to the image",
+ "properties": {
+ "bottom": {
+ "type": "object"
+ },
+ "left": {
+ "type": "object"
+ },
+ "right": {
+ "type": "object"
+ },
+ "top": {
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "width": {
+ "description": "A request to render the image at a specified width.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "properties": {
+ "color": {
+ "description": "A Color to display the text in. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code.",
+ "type": "string"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this block. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ },
+ "size": {
+ "description": "An optional indicator of the size at which the text should be rendered. May be a named value (one oflargest, headline, title, body, smallest) or a numeric size - both are up to the frontend to interpret.",
+ "type": "string"
+ },
+ "weight": {
+ "description": "An optional indicator of the weight at which the text should be rendered. May be a named value (one ofextralight, thin, medium, black, semibold, bold, extrabold) or a numeric, e.g., 100, 200, ..., 900",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ ]
+ },
+ "subBlocks": {
+ "description": "For COMPOSITE type blocks, a list of sub-blocks.",
+ "items": {
+ "$ref": "#/components/schemas/WidgetBlock"
+ },
+ "type": "array"
+ },
+ "values": {
+ "$ref": "#/components/schemas/WidgetBlockValues",
+ "description": "Values to show in the block, or otherwise control its behavior. Different fields based on blockType.",
+ "oneOf": [
+ {
+ "description": "Values used for an AUDIO type widget block",
+ "properties": {
+ "autoPlay": {
+ "description": "Control if the file should automatically play when the block is rendered",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "path": {
+ "description": "The path to the audio file on the server",
+ "type": "string"
+ },
+ "showControls": {
+ "description": "Control if on-screen controls should be shown to allow the user to control playback",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Values used for a BUTTON type widget block",
+ "properties": {
+ "actionCode": {
+ "description": "Code used within the app as the value submitted when the button is clicked",
+ "type": "string"
+ },
+ "controlCode": {
+ "description": "Instructions for what should happen in the frontend (e.g., within a screen), when the button is clicked.\n\nTo show a modal composite block, use format: `showModal:${blockId}` (e.g., `showModal:myBlock`)\n\nTo hide a modal composite block, use format: `hideModal:${blockId}` (e.g., `hideModal:myBlock`)\n\nTo toggle visibility of a modal composite block, use format: `toggleModal:${blockId}` (e.g., `toggleModal:myBlock`)\n",
+ "type": "string"
+ },
+ "endIcon": {
+ "description": "An optional icon to display after the text in the button",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "label": {
+ "description": "User-facing label to display in the button",
+ "type": "string"
+ },
+ "startIcon": {
+ "description": "An optional icon to display before the text in the button",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Values used for an IMAGE type widget block",
+ "properties": {
+ "path": {
+ "description": "The path to the image on the server",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Values used for an INPUT_FIELD type widget block",
+ "properties": {
+ "autoFocus": {
+ "description": "Indicate whether this field should auto-focus when it is rendered",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "fieldMetaData": {
+ "description": "Metadata to define the field that this block controls",
+ "properties": {
+ "accessTier": {
+ "description": "Effective field access: FULL, REVEALABLE, MASKED, or HIDDEN. Omitted means FULL. Restricted values are strings, regardless of field type.",
+ "enum": [
+ "FULL",
+ "REVEALABLE",
+ "MASKED",
+ "HIDDEN"
+ ],
+ "type": "string"
+ },
+ "adornments": {
+ "description": "Special UI dressings to add to the field.",
+ "items": {
+ "$ref": "#/components/schemas/FieldAdornment"
+ },
+ "type": "array"
+ },
+ "allowedFilterOperators": {
+ "description": "Allowed filter operators when restricted: EQUALS and IN for REVEALABLE when exact match is enabled, otherwise empty. Omitted means unrestricted.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "behaviors": {
+ "description": "Names of the field's behaviors that a frontend applies while editing, e.g., TO_UPPER_CASE, TO_LOWER_CASE or TRIM. Absent when the field has none.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "defaultValue": {
+ "description": "Default value to use in this field.",
+ "type": "string"
+ },
+ "displayFormat": {
+ "description": "C-style format specifier for displaying values in this field.",
+ "type": "string"
+ },
+ "gridColumns": {
+ "description": "Width of this field in a 12-column record form or view grid (e.g., 12 for the full width, 6 for half). Absent when the frontend's default applies.",
+ "type": "number"
+ },
+ "helpContents": {
+ "description": "Help Contents for this field.",
+ "items": {
+ "$ref": "#/components/schemas/HelpContentV1"
+ },
+ "type": "array"
+ },
+ "inlinePossibleValueSource": {
+ "description": "Inline possible-value source for this field; enumValues supply choices without a separate lookup.",
+ "properties": {
+ "customCodeReference": {
+ "properties": {
+ "codeType": {
+ "enum": [
+ "JAVA",
+ "JAVA_SCRIPT"
+ ],
+ "type": "string"
+ },
+ "inlineCode": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "enumValues": {
+ "type": "array"
+ },
+ "helpContent": {
+ "type": "object"
+ },
+ "idType": {
+ "enum": [
+ "STRING",
+ "INTEGER",
+ "LONG",
+ "DECIMAL",
+ "BOOLEAN",
+ "DATE",
+ "TIME",
+ "DATE_TIME",
+ "TEXT",
+ "HTML",
+ "PASSWORD",
+ "BLOB"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "orderByFields": {
+ "type": "array"
+ },
+ "overrideIdField": {
+ "type": "string"
+ },
+ "picker": {
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "tableName": {
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ "ENUM",
+ "TABLE",
+ "CUSTOM"
+ ],
+ "type": "string"
+ },
+ "valueFields": {
+ "type": "array"
+ },
+ "valueFieldsIfNotFound": {
+ "type": "array"
+ },
+ "valueFormat": {
+ "type": "string"
+ },
+ "valueFormatIfNotFound": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "isEditable": {
+ "description": "Indicate if user may edit the value in this field.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHeavy": {
+ "description": "Indicator of 'heavy' fields, which are not loaded by default. e.g., some blobs or long-texts",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isHidden": {
+ "description": "Indicate if this field should be hidden from users",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isRequired": {
+ "description": "Indicate if a value in this field is required.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isSortable": {
+ "description": "False for restricted fields; omitted means sortable.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "User-facing name for this field",
+ "type": "string"
+ },
+ "maxLength": {
+ "description": "For String fields, the max length the field supports.",
+ "type": "number"
+ },
+ "maxValue": {
+ "description": "For number fields, the largest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "minValue": {
+ "description": "For number fields, the smallest value the field accepts (inclusive). Absent when there is no such limit.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Unique name for this field within its container (table or process)",
+ "type": "string"
+ },
+ "picker": {
+ "description": "When this field's possible value source declares a record picker (for sources over large tables), its configuration: thumbnail, preview, subtitle and detail fields, filter fields, search fields, sorts and page size. Frontends offer a searchable, paged picker dialog.",
+ "properties": {
+ "detailFields": {
+ "type": "array"
+ },
+ "filterFields": {
+ "type": "array"
+ },
+ "pageSize": {
+ "type": "number"
+ },
+ "previewField": {
+ "type": "string"
+ },
+ "searchFields": {
+ "type": "array"
+ },
+ "sorts": {
+ "type": "array"
+ },
+ "subtitleFields": {
+ "type": "array"
+ },
+ "thumbnailField": {
+ "type": "string"
+ },
+ "uploadProcessName": {
+ "type": "string"
+ },
+ "uploadResultIdField": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "pickerTableName": {
+ "description": "When this field has a picker, the table its possible value source reads, whose metadata describes the picker's fields.",
+ "type": "string"
+ },
+ "possibleValueSourceDependencyBehavior": {
+ "description": "DISABLE_UNTIL_SET disables a contingent field until its dependencies are set (default). SHOW_ALL_UNTIL_SET keeps it enabled and omits criteria with missing inputs in form searches. Absent for non-contingent fields.",
+ "enum": [
+ "DISABLE_UNTIL_SET",
+ "SHOW_ALL_UNTIL_SET"
+ ],
+ "type": "string"
+ },
+ "possibleValueSourceDependsOn": {
+ "description": "Names of fields controlling this field's choices, including explicit and filter dependencies. Absent for non-contingent fields.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "possibleValueSourceName": {
+ "description": "If this field's values should come from a possible value source, then that PVS is named here.",
+ "type": "string"
+ },
+ "supplementalMetaData": {
+ "description": "Additional frontend-visible metadata for this field, keyed by supplemental type.",
+ "type": "object"
+ },
+ "type": {
+ "description": "Data-type for this field",
+ "type": "string"
+ },
+ "validation": {
+ "description": "The field's validation rules, as the server enforces them on insert and update (required, maxLength and tooLongBehavior, min/max value, pattern). Absent when the field has none. Since 1.6.0.",
+ "properties": {
+ "maxInclusive": {
+ "description": "Whether maxValue itself is accepted (false: the value must be less).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "maxLength": {
+ "description": "For string fields, the most characters the field stores. What happens to a longer value is tooLongBehavior.",
+ "type": "number"
+ },
+ "maxValue": {
+ "description": "For number fields, the largest value accepted (plain digits, exact). See maxInclusive.",
+ "type": "string"
+ },
+ "minInclusive": {
+ "description": "Whether minValue itself is accepted (false: the value must be greater).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "minValue": {
+ "description": "For number fields, the smallest value accepted (plain digits, exact). See minInclusive.",
+ "type": "string"
+ },
+ "pattern": {
+ "description": "A regular expression a non-empty value must match as a whole (written to mean the same in Java and ECMAScript).",
+ "type": "string"
+ },
+ "patternMessage": {
+ "description": "The message the server gives for a value that does not match pattern.",
+ "type": "string"
+ },
+ "required": {
+ "description": "True when a value is required.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "tooLongBehavior": {
+ "description": "With maxLength: ERROR (a longer value is refused), TRUNCATE or TRUNCATE_ELLIPSIS (it is trimmed on save), PASS_THROUGH (neither).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "hideSoftKeyboard": {
+ "description": "Indicate if the frontend uses a software/on-screen keyboard, if the application should try to hide it (e.g., upon auto-focus).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "placeholder": {
+ "description": "Optional placeholder text to display in the input box.",
+ "type": "string"
+ },
+ "submitOnEnter": {
+ "description": "Indicate whether the form that this field is on should be submitted when Enter is pressed",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "description": "Values used for a TEXT type widget block",
+ "properties": {
+ "endIcon": {
+ "description": "An optional icon to display after the text",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "startIcon": {
+ "description": "An optional icon to display before the text",
+ "properties": {
+ "color": {
+ "description": "A color code to use for displaying the icon",
+ "type": "string"
+ },
+ "name": {
+ "description": "Material UI icon name (web); prefer semanticName",
+ "type": "string"
+ },
+ "path": {
+ "description": "A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon.",
+ "type": "string"
+ },
+ "semanticName": {
+ "description": "Client-neutral kebab-case icon token; null when unmapped.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "text": {
+ "description": "The text to display in the block",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockAudioValues": {
+ "description": "Values used for an AUDIO type widget block",
+ "properties": {
+ "autoPlay": {
+ "description": "Control if the file should automatically play when the block is rendered",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "path": {
+ "description": "The path to the audio file on the server",
+ "type": "string"
+ },
+ "showControls": {
+ "description": "Control if on-screen controls should be shown to allow the user to control playback",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockBaseStyles": {
+ "properties": {
+ "backgroundColor": {
+ "description": "A background color to use for the block",
+ "type": "string"
+ },
+ "padding": {
+ "description": "Optional padding to apply to the block",
+ "properties": {
+ "bottom": {
+ "type": "object"
+ },
+ "left": {
+ "type": "object"
+ },
+ "right": {
+ "type": "object"
+ },
+ "top": {
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockButtonStyles": {
+ "properties": {
+ "color": {
+ "description": "A Color to use for the button. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code.",
+ "type": "string"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this block, such as OUTLINED, FILLED, or TEXT. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockButtonValues": {
+ "description": "Values used for a BUTTON type widget block",
+ "properties": {
+ "actionCode": {
+ "description": "Code used within the app as the value submitted when the button is clicked",
+ "type": "string"
+ },
+ "controlCode": {
+ "description": "Instructions for what should happen in the frontend (e.g., within a screen), when the button is clicked.\n\nTo show a modal composite block, use format: `showModal:${blockId}` (e.g., `showModal:myBlock`)\n\nTo hide a modal composite block, use format: `hideModal:${blockId}` (e.g., `hideModal:myBlock`)\n\nTo toggle visibility of a modal composite block, use format: `toggleModal:${blockId}` (e.g., `toggleModal:myBlock`)\n",
+ "type": "string"
+ },
+ "endIcon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "An optional icon to display after the text in the button"
+ },
+ "label": {
+ "description": "User-facing label to display in the button",
+ "type": "string"
+ },
+ "startIcon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "An optional icon to display before the text in the button"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockImageStyles": {
+ "properties": {
+ "height": {
+ "description": "A request to render the image at a specified height.",
+ "type": "string"
+ },
+ "padding": {
+ "description": "Optional padding to apply to the image",
+ "properties": {
+ "bottom": {
+ "type": "object"
+ },
+ "left": {
+ "type": "object"
+ },
+ "right": {
+ "type": "object"
+ },
+ "top": {
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "width": {
+ "description": "A request to render the image at a specified width.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockImageValues": {
+ "description": "Values used for an IMAGE type widget block",
+ "properties": {
+ "path": {
+ "description": "The path to the image on the server",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockInputFieldValues": {
+ "description": "Values used for an INPUT_FIELD type widget block",
+ "properties": {
+ "autoFocus": {
+ "description": "Indicate whether this field should auto-focus when it is rendered",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "fieldMetaData": {
+ "$ref": "#/components/schemas/FieldMetaData",
+ "description": "Metadata to define the field that this block controls"
+ },
+ "hideSoftKeyboard": {
+ "description": "Indicate if the frontend uses a software/on-screen keyboard, if the application should try to hide it (e.g., upon auto-focus).",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "placeholder": {
+ "description": "Optional placeholder text to display in the input box.",
+ "type": "string"
+ },
+ "submitOnEnter": {
+ "description": "Indicate whether the form that this field is on should be submitted when Enter is pressed",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockStyles": {
+ "type": "object"
+ },
+ "WidgetBlockTextStyles": {
+ "properties": {
+ "color": {
+ "description": "A Color to display the text in. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code.",
+ "type": "string"
+ },
+ "format": {
+ "description": "An optional indicator of the screen format preferred by the application to be used for this block. Different frontends may support different formats, and implement them differently.",
+ "type": "string"
+ },
+ "size": {
+ "description": "An optional indicator of the size at which the text should be rendered. May be a named value (one oflargest, headline, title, body, smallest) or a numeric size - both are up to the frontend to interpret.",
+ "type": "string"
+ },
+ "weight": {
+ "description": "An optional indicator of the weight at which the text should be rendered. May be a named value (one ofextralight, thin, medium, black, semibold, bold, extrabold) or a numeric, e.g., 100, 200, ..., 900",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockTextValues": {
+ "description": "Values used for a TEXT type widget block",
+ "properties": {
+ "endIcon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "An optional icon to display after the text"
+ },
+ "startIcon": {
+ "$ref": "#/components/schemas/Icon",
+ "description": "An optional icon to display before the text"
+ },
+ "text": {
+ "description": "The text to display in the block",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetBlockValues": {
+ "type": "object"
+ },
+ "WidgetData": {
+ "description": "The data of a widget: one of the per-type shapes, chosen by `type` (the widget type). Clients render by type and ignore unknown properties; an unknown type is rendered as the widget label with its footerHTML/label only.",
+ "discriminator": {
+ "mapping": {
+ "alert": "#/components/schemas/WidgetDataAlert",
+ "barChart": "#/components/schemas/WidgetDataChart",
+ "chart": "#/components/schemas/WidgetDataChart",
+ "childRecordList": "#/components/schemas/WidgetDataChildRecordList",
+ "composite": "#/components/schemas/WidgetDataComposite",
+ "cronUI": "#/components/schemas/WidgetDataCronUI",
+ "customComponent": "#/components/schemas/WidgetDataGeneric",
+ "dataBagViewer": "#/components/schemas/WidgetDataGeneric",
+ "divider": "#/components/schemas/WidgetDataDivider",
+ "dynamicForm": "#/components/schemas/WidgetDataDynamicForm",
+ "fieldValueList": "#/components/schemas/WidgetDataFieldValueList",
+ "filterAndColumnsSetup": "#/components/schemas/WidgetDataFilterAndColumnsSetup",
+ "generic": "#/components/schemas/WidgetDataGeneric",
+ "horizontalBarChart": "#/components/schemas/WidgetDataChart",
+ "html": "#/components/schemas/WidgetDataRawHTML",
+ "lineChart": "#/components/schemas/WidgetDataLineChart",
+ "location": "#/components/schemas/WidgetDataLocation",
+ "multiStatistics": "#/components/schemas/WidgetDataMultiStatistics",
+ "multiTable": "#/components/schemas/WidgetDataMultiTable",
+ "parentWidget": "#/components/schemas/WidgetDataParent",
+ "pieChart": "#/components/schemas/WidgetDataPieChart",
+ "pivotTableSetup": "#/components/schemas/WidgetDataGeneric",
+ "process": "#/components/schemas/WidgetDataProcess",
+ "quickSightChart": "#/components/schemas/WidgetDataQuickSightChart",
+ "rowBuilder": "#/components/schemas/WidgetDataRowBuilder",
+ "scriptViewer": "#/components/schemas/WidgetDataGeneric",
+ "smallLineChart": "#/components/schemas/WidgetDataLineChart",
+ "stackedBarChart": "#/components/schemas/WidgetDataChart",
+ "statistics": "#/components/schemas/WidgetDataStatistics",
+ "stepper": "#/components/schemas/WidgetDataStepper",
+ "table": "#/components/schemas/WidgetDataTable",
+ "usaMap": "#/components/schemas/WidgetDataUSMap"
+ },
+ "propertyName": "type"
+ },
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/WidgetDataAlert"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataChart"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataLineChart"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataPieChart"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataChildRecordList"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataComposite"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataCronUI"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataDivider"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataDynamicForm"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataFieldValueList"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataFilterAndColumnsSetup"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataLocation"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataMultiStatistics"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataMultiTable"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataParent"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataProcess"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataQuickSightChart"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataRawHTML"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataRowBuilder"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataStatistics"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataStepper"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataTable"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataUSMap"
+ },
+ {
+ "$ref": "#/components/schemas/WidgetDataGeneric"
+ }
+ ]
+ },
+ "WidgetDataAlert": {
+ "description": "Data of alert widgets.",
+ "properties": {
+ "alertType": {
+ "enum": [
+ "ERROR",
+ "SUCCESS",
+ "WARNING"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "bulletList": {
+ "type": "array"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "hideWidget": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "html": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "text": {
+ "description": "Plain text equivalent of html, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "alert"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataChart": {
+ "description": "Data of chart, barChart, horizontalBarChart, and stackedBarChart widgets.",
+ "properties": {
+ "chartData": {
+ "properties": {
+ "datasets": {
+ "items": {
+ "properties": {
+ "backgroundColor": {
+ "type": "string"
+ },
+ "backgroundColors": {
+ "description": "Colors per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "color": {
+ "type": "string"
+ },
+ "data": {
+ "items": {
+ "nullable": true,
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "label": {
+ "type": "string"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "labels": {
+ "description": "Labels per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "lineLabels": {
+ "description": "Labels of the lines.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "chartSubheaderData": {
+ "properties": {
+ "isGoodVsPrevious": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isUpVsPrevious": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "mainNumber": {
+ "type": "number"
+ },
+ "mainNumberUrl": {
+ "type": "string"
+ },
+ "previousNumberUrl": {
+ "type": "string"
+ },
+ "vsDescription": {
+ "type": "string"
+ },
+ "vsPreviousNumber": {
+ "type": "number"
+ },
+ "vsPreviousPercent": {
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "isCurrency": {
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "chart",
+ "barChart",
+ "horizontalBarChart",
+ "stackedBarChart"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataChildRecordList": {
+ "description": "Data of childRecordList widgets.",
+ "properties": {
+ "allowRecordDelete": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "allowRecordEdit": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "canAddChildRecord": {
+ "type": "boolean"
+ },
+ "childFrontendTableMetaData": {
+ "$ref": "#/components/schemas/TableMetaData",
+ "type": "object"
+ },
+ "childTableMetaData": {
+ "$ref": "#/components/schemas/TableMetaData",
+ "type": "object"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "defaultValuesForNewChildRecords": {
+ "type": "object"
+ },
+ "defaultValuesForNewChildRecordsFromParentFields": {
+ "type": "object"
+ },
+ "disableRowClick": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "disabledFieldsForNewChildRecords": {
+ "description": "Fields disabled when adding a child record.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "includeExposedJoinTables": {
+ "type": "array"
+ },
+ "isInProcess": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "omitFieldNames": {
+ "type": "array"
+ },
+ "onlyIncludeFieldNames": {
+ "type": "array"
+ },
+ "queryOutput": {
+ "properties": {
+ "records": {
+ "items": {
+ "$ref": "#/components/schemas/OutputRecord"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "tableName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "tablePath": {
+ "nullable": true,
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "totalRows": {
+ "nullable": true,
+ "type": "number"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "childRecordList"
+ ],
+ "type": "string"
+ },
+ "viewAllLink": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataComposite": {
+ "description": "Data of composite widgets.",
+ "properties": {
+ "blockId": {
+ "nullable": true,
+ "type": "string"
+ },
+ "blocks": {
+ "type": "array"
+ },
+ "conditional": {
+ "nullable": true,
+ "type": "string"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "layout": {
+ "enum": [
+ "FLEX_COLUMN",
+ "FLEX_ROW",
+ "FLEX_ROW_WRAPPED",
+ "FLEX_ROW_SPACE_BETWEEN",
+ "FLEX_ROW_CENTER",
+ "TABLE_SUB_ROW_DETAILS",
+ "BADGES_WRAPPER"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "link": {
+ "properties": {
+ "href": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "linkMap": {
+ "type": "object"
+ },
+ "modalMode": {
+ "enum": [
+ "MODAL"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "overlayHtml": {
+ "nullable": true,
+ "type": "string"
+ },
+ "overlayStyleOverrides": {
+ "type": "object"
+ },
+ "overlayText": {
+ "description": "Plain text equivalent of overlayHtml, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "styleOverrides": {
+ "type": "object"
+ },
+ "styles": {
+ "properties": {
+ "backgroundColor": {
+ "nullable": true,
+ "type": "string"
+ },
+ "padding": {
+ "properties": {
+ "bottom": {
+ "nullable": true,
+ "type": "string"
+ },
+ "left": {
+ "nullable": true,
+ "type": "string"
+ },
+ "right": {
+ "nullable": true,
+ "type": "string"
+ },
+ "top": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "tooltip": {
+ "properties": {
+ "blockData": {
+ "properties": {
+ "blocks": {
+ "type": "array"
+ },
+ "layout": {
+ "enum": [
+ "FLEX_COLUMN",
+ "FLEX_ROW",
+ "FLEX_ROW_WRAPPED",
+ "FLEX_ROW_SPACE_BETWEEN",
+ "FLEX_ROW_CENTER",
+ "TABLE_SUB_ROW_DETAILS",
+ "BADGES_WRAPPER"
+ ],
+ "type": "string"
+ },
+ "modalMode": {
+ "enum": [
+ "MODAL"
+ ],
+ "type": "string"
+ },
+ "overlayHtml": {
+ "type": "string"
+ },
+ "overlayStyleOverrides": {
+ "type": "object"
+ },
+ "styleOverrides": {
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "placement": {
+ "enum": [
+ "BOTTOM",
+ "LEFT",
+ "RIGHT",
+ "TOP"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "tooltipMap": {
+ "type": "object"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "composite"
+ ],
+ "type": "string"
+ },
+ "values": {
+ "description": "Composite BaseValues has no predefined members.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataCronUI": {
+ "description": "Data of cronUI widgets.",
+ "properties": {
+ "cronDescription": {
+ "nullable": true,
+ "type": "string"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "error": {
+ "nullable": true,
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "cronUI"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataDivider": {
+ "description": "Data of divider widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "divider"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataDynamicForm": {
+ "description": "Data of dynamicForm widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "fieldList": {
+ "type": "array"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "mergedDynamicFormValuesIntoFieldName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "noFieldsMessage": {
+ "nullable": true,
+ "type": "string"
+ },
+ "recordOfFieldValues": {
+ "$ref": "#/components/schemas/OutputRecord",
+ "type": "object"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "dynamicForm"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataFieldValueList": {
+ "description": "Data of fieldValueList widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "fieldIndentLevels": {
+ "type": "object"
+ },
+ "fieldLabelPrefixIconColors": {
+ "type": "object"
+ },
+ "fieldLabelPrefixIconNames": {
+ "type": "object"
+ },
+ "fields": {
+ "type": "array"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "record": {
+ "$ref": "#/components/schemas/OutputRecord",
+ "type": "object"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "fieldValueList"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataFilterAndColumnsSetup": {
+ "description": "Data of filterAndColumnsSetup widgets.",
+ "properties": {
+ "allowVariables": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "apiName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "apiPath": {
+ "nullable": true,
+ "type": "string"
+ },
+ "apiVersion": {
+ "nullable": true,
+ "type": "string"
+ },
+ "columnFieldName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "editButtonLabel": {
+ "nullable": true,
+ "type": "string"
+ },
+ "filterDefaultFieldNameSourceFieldNames": {
+ "type": "object"
+ },
+ "filterDefaultFieldNames": {
+ "type": "array"
+ },
+ "filterFieldName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "hideColumns": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "hidePreview": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "hideSortBy": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isApiVersioned": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "modalHeader": {
+ "nullable": true,
+ "type": "string"
+ },
+ "omitExposedJoins": {
+ "type": "array"
+ },
+ "overrideIsEditable": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "tableName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "filterAndColumnsSetup"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataGeneric": {
+ "additionalProperties": true,
+ "description": "Data of widget types without a fixed shape (generic, customComponent, dataBagViewer, pivotTableSetup, and scriptViewer): the common properties plus widget-specific ones.",
+ "properties": {
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain-text footer, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "generic",
+ "customComponent",
+ "dataBagViewer",
+ "pivotTableSetup",
+ "scriptViewer"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataLineChart": {
+ "description": "Data of lineChart and smallLineChart widgets.",
+ "properties": {
+ "chartData": {
+ "properties": {
+ "datasets": {
+ "items": {
+ "properties": {
+ "backgroundColor": {
+ "type": "string"
+ },
+ "backgroundColors": {
+ "description": "Colors per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "color": {
+ "type": "string"
+ },
+ "data": {
+ "items": {
+ "nullable": true,
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "label": {
+ "type": "string"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "labels": {
+ "description": "Labels per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "lineLabels": {
+ "description": "Labels of the lines.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "isYAxisCurrency": {
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "lineChart",
+ "smallLineChart"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataLocation": {
+ "description": "Data of location widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "imageUrl": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "location": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "location"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataMultiStatistics": {
+ "description": "Data of multiStatistics widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "statisticsGroupData": {
+ "type": "array"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "multiStatistics"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataMultiTable": {
+ "description": "Data of multiTable widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "tableDataList": {
+ "type": "array"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "multiTable"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataParent": {
+ "description": "Data of parentWidget widgets.",
+ "properties": {
+ "childWidgetNameList": {
+ "type": "array"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "isLabelPageTitle": {
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "layoutType": {
+ "enum": [
+ "GRID",
+ "TABS"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "parentWidget"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataPieChart": {
+ "description": "Data of pieChart widgets.",
+ "properties": {
+ "chartData": {
+ "properties": {
+ "datasets": {
+ "items": {
+ "properties": {
+ "backgroundColor": {
+ "type": "string"
+ },
+ "backgroundColors": {
+ "description": "Colors per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "color": {
+ "type": "string"
+ },
+ "data": {
+ "items": {
+ "nullable": true,
+ "type": "number"
+ },
+ "type": "array"
+ },
+ "label": {
+ "type": "string"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "labels": {
+ "description": "Labels per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "lineLabels": {
+ "description": "Labels of the lines.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "urls": {
+ "description": "Links per data point.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "chartSubheaderData": {
+ "properties": {
+ "isGoodVsPrevious": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "isUpVsPrevious": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "mainNumber": {
+ "type": "number"
+ },
+ "mainNumberUrl": {
+ "type": "string"
+ },
+ "previousNumberUrl": {
+ "type": "string"
+ },
+ "vsDescription": {
+ "type": "string"
+ },
+ "vsPreviousNumber": {
+ "type": "number"
+ },
+ "vsPreviousPercent": {
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "isCurrency": {
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "pieChart"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataProcess": {
+ "description": "Data of process widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "defaultValues": {
+ "type": "object"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "processMetaData": {
+ "$ref": "#/components/schemas/ProcessMetaData",
+ "type": "object"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "process"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataQuickSightChart": {
+ "description": "Data of quickSightChart widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "quickSightChart"
+ ],
+ "type": "string"
+ },
+ "url": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataRawHTML": {
+ "description": "Data of html widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "html": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "text": {
+ "description": "Plain text equivalent of html, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "html"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataRowBuilder": {
+ "description": "Data of rowBuilder widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "defaultValuesForNewRecords": {
+ "type": "object"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "hiddenValues": {
+ "type": "object"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "records": {
+ "type": "array"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "rowBuilder"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataStatistics": {
+ "description": "Data of statistics widgets.",
+ "properties": {
+ "count": {
+ "description": "Numeric statistic displayed by this widget.",
+ "nullable": true,
+ "type": "number"
+ },
+ "countContext": {
+ "nullable": true,
+ "type": "string"
+ },
+ "countFontSize": {
+ "nullable": true,
+ "type": "string"
+ },
+ "countURL": {
+ "nullable": true,
+ "type": "string"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "increaseIsGood": {
+ "type": "boolean"
+ },
+ "isCurrency": {
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "percentageAmount": {
+ "nullable": true,
+ "type": "number"
+ },
+ "percentageLabel": {
+ "nullable": true,
+ "type": "string"
+ },
+ "percentageURL": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "statistics"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataStepper": {
+ "description": "Data of stepper widgets.",
+ "properties": {
+ "activeStep": {
+ "type": "integer"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "steps": {
+ "type": "array"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "stepper"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataTable": {
+ "description": "Data of table widgets.",
+ "properties": {
+ "columns": {
+ "type": "array"
+ },
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "fixedHeight": {
+ "nullable": true,
+ "type": "number"
+ },
+ "fixedStickyLastRow": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "hidePaginationDropdown": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "linkText": {
+ "nullable": true,
+ "type": "string"
+ },
+ "linkURL": {
+ "nullable": true,
+ "type": "string"
+ },
+ "noRowsFoundHTML": {
+ "nullable": true,
+ "type": "string"
+ },
+ "rows": {
+ "type": "array"
+ },
+ "rowsPerPage": {
+ "nullable": true,
+ "type": "number"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "table"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetDataUSMap": {
+ "description": "Data of usaMap widgets.",
+ "properties": {
+ "csvData": {
+ "description": "Rows (each a list of cells) for exporting the widget as CSV.",
+ "items": {
+ "items": {},
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDataList": {
+ "description": "Options of each dropdown filter: a list per dropdown of {id, label} objects.",
+ "items": {
+ "items": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "dropdownDefaultValueList": {
+ "description": "Default value of each dropdown filter.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownLabelList": {
+ "description": "Labels of the dropdown filters.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNameList": {
+ "description": "Names of the dropdown filters the widget offers (parallel to the other dropdown lists).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dropdownNeedsSelectedText": {
+ "description": "Message to show until every dropdown has a value.",
+ "type": "string"
+ },
+ "footerHTML": {
+ "description": "Footer, as HTML. Non-web clients render it as plain text.",
+ "type": "string"
+ },
+ "footerText": {
+ "description": "Plain text equivalent of footerHTML, preserving link text and line breaks.",
+ "type": "string"
+ },
+ "hasPermission": {
+ "description": "False when the user may not see this widget's data; show the label and a permission message only.",
+ "type": "boolean"
+ },
+ "height": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Title of the widget (overrides the metadata label when present).",
+ "type": "string"
+ },
+ "mapMarkerList": {
+ "type": "array"
+ },
+ "sublabel": {
+ "description": "Secondary title.",
+ "type": "string"
+ },
+ "type": {
+ "description": "The widget type this data is for.",
+ "enum": [
+ "usaMap"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WidgetResponseV1": {
+ "properties": {
+ "widgetData": {
+ "description": "Widget data object, whose shape varies by widget type.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "EsbCapabilities": {
+ "description": "What the provider supports for this destination - show only the actions that are true.",
+ "properties": {
+ "browse": {
+ "description": "Messages can be browsed.",
+ "type": "boolean"
+ },
+ "pauseQueue": {
+ "description": "The queue can be paused and resumed.",
+ "type": "boolean"
+ },
+ "purge": {
+ "description": "All messages can be deleted.",
+ "type": "boolean"
+ },
+ "deleteSelected": {
+ "description": "Selected messages can be deleted.",
+ "type": "boolean"
+ },
+ "deleteOlderThan": {
+ "description": "Messages older than a time can be deleted.",
+ "type": "boolean"
+ },
+ "move": {
+ "description": "Messages can be moved to another destination.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbCounter": {
+ "description": "Activity counters since the server started.",
+ "properties": {
+ "published": {
+ "description": "Messages published.",
+ "type": "integer"
+ },
+ "publishFailures": {
+ "description": "Publish attempts that failed.",
+ "type": "integer"
+ },
+ "consumed": {
+ "description": "Messages consumed.",
+ "type": "integer"
+ },
+ "succeeded": {
+ "description": "Consumed messages processed successfully.",
+ "type": "integer"
+ },
+ "failed": {
+ "description": "Consumed messages that failed.",
+ "type": "integer"
+ },
+ "retried": {
+ "description": "Redeliveries.",
+ "type": "integer"
+ },
+ "deadLettered": {
+ "description": "Messages moved to the dead-letter destination.",
+ "type": "integer"
+ },
+ "inFlight": {
+ "description": "Messages being processed now.",
+ "type": "integer"
+ },
+ "lastActivity": {
+ "description": "Time of the last activity (ISO-8601), or null.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "avgMs": {
+ "description": "Average processing time in milliseconds.",
+ "type": "integer"
+ },
+ "maxMs": {
+ "description": "Longest processing time in milliseconds.",
+ "type": "integer"
+ },
+ "lastError": {
+ "description": "The last error message, or null.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EsbDeadLetter": {
+ "description": "A dead-letter (or subscription) destination of a trigger.",
+ "properties": {
+ "brokerName": {
+ "description": "Name on the broker.",
+ "type": "string"
+ },
+ "messageCount": {
+ "description": "Messages waiting, or null when unknown.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "paused": {
+ "description": "Whether it is paused, or null when unknown.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbDestination": {
+ "description": "A queue or topic.",
+ "properties": {
+ "name": {
+ "description": "Destination name.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Destination type.",
+ "enum": [
+ "QUEUE",
+ "TOPIC"
+ ],
+ "type": "string"
+ },
+ "provider": {
+ "description": "Name of the provider (broker connection).",
+ "type": "string"
+ },
+ "brokerName": {
+ "description": "Name of the destination on the broker.",
+ "type": "string"
+ },
+ "counters": {
+ "$ref": "#/components/schemas/EsbCounter"
+ },
+ "queueInfo": {
+ "$ref": "#/components/schemas/EsbQueueInfo",
+ "nullable": true
+ },
+ "capabilities": {
+ "$ref": "#/components/schemas/EsbCapabilities"
+ }
+ },
+ "type": "object"
+ },
+ "EsbMessage": {
+ "description": "A message on a destination.",
+ "properties": {
+ "messageId": {
+ "description": "Broker message id.",
+ "type": "string"
+ },
+ "timestamp": {
+ "description": "When it was sent (ISO-8601).",
+ "format": "date-time",
+ "type": "string"
+ },
+ "deliveryCount": {
+ "description": "Delivery attempts so far.",
+ "type": "integer"
+ },
+ "event": {
+ "additionalProperties": true,
+ "description": "The CloudEvents envelope (specversion, id, source, type, time, subject, datacontenttype, data, qqqcausationid), or null when the body is not one.",
+ "nullable": true,
+ "type": "object"
+ },
+ "rawBody": {
+ "description": "The message body as text.",
+ "type": "string"
+ },
+ "properties": {
+ "additionalProperties": true,
+ "description": "Message properties.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "EsbMessagePageResponseV1": {
+ "description": "A page of messages.",
+ "properties": {
+ "messages": {
+ "description": "The messages, oldest first.",
+ "items": {
+ "$ref": "#/components/schemas/EsbMessage"
+ },
+ "type": "array"
+ },
+ "hasMore": {
+ "description": "Whether more messages follow this page.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbOverviewDestination": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/EsbDestination"
+ },
+ {
+ "properties": {
+ "publishers": {
+ "description": "Tables and processes publishing to it.",
+ "items": {
+ "$ref": "#/components/schemas/EsbPublisher"
+ },
+ "type": "array"
+ },
+ "triggers": {
+ "description": "Triggers consuming it.",
+ "items": {
+ "$ref": "#/components/schemas/EsbTrigger"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ ],
+ "description": "A destination with its publishers and triggers."
+ },
+ "EsbOverviewResponseV1": {
+ "description": "GET /esb/overview: providers and every destination.",
+ "properties": {
+ "providers": {
+ "description": "Broker connections.",
+ "items": {
+ "$ref": "#/components/schemas/EsbProvider"
+ },
+ "type": "array"
+ },
+ "destinations": {
+ "description": "Destinations with their publishers and triggers.",
+ "items": {
+ "$ref": "#/components/schemas/EsbOverviewDestination"
+ },
+ "type": "array"
+ },
+ "permissions": {
+ "$ref": "#/components/schemas/EsbPermissions"
+ }
+ },
+ "type": "object"
+ },
+ "EsbPermissions": {
+ "description": "What the user may do.",
+ "properties": {
+ "canOperate": {
+ "description": "May pause, resume and retry.",
+ "type": "boolean"
+ },
+ "canDelete": {
+ "description": "May delete messages.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbProcessResponseV1": {
+ "description": "GET /esb/process/{process}: what a process publishes, and the triggers that run it.",
+ "properties": {
+ "process": {
+ "description": "Process name.",
+ "type": "string"
+ },
+ "publications": {
+ "description": "Destinations the process publishes to.",
+ "items": {
+ "$ref": "#/components/schemas/EsbPublication"
+ },
+ "type": "array"
+ },
+ "triggers": {
+ "description": "Triggers that run the process.",
+ "items": {
+ "$ref": "#/components/schemas/EsbTrigger"
+ },
+ "type": "array"
+ },
+ "permissions": {
+ "$ref": "#/components/schemas/EsbPermissions"
+ }
+ },
+ "type": "object"
+ },
+ "EsbProvider": {
+ "description": "A broker connection.",
+ "properties": {
+ "name": {
+ "description": "Provider name.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Broker type.",
+ "enum": [
+ "ACTIVEMQ_ARTEMIS",
+ "RABBITMQ"
+ ],
+ "type": "string"
+ },
+ "connected": {
+ "description": "Whether the connection is up.",
+ "type": "boolean"
+ },
+ "managementEnabled": {
+ "description": "Whether broker management (browse, pause, purge) is available.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbPublication": {
+ "description": "A destination that a table or process publishes events to.",
+ "properties": {
+ "destination": {
+ "$ref": "#/components/schemas/EsbDestination"
+ },
+ "events": {
+ "description": "Events published: INSERT, UPDATE or DELETE for tables; STARTED, COMPLETED or FAILED for processes.",
+ "items": {
+ "description": "Event name.",
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EsbPublisher": {
+ "description": "A table or process that publishes to a destination.",
+ "properties": {
+ "kind": {
+ "description": "What publishes.",
+ "enum": [
+ "TABLE",
+ "PROCESS"
+ ],
+ "type": "string"
+ },
+ "name": {
+ "description": "Table or process name.",
+ "type": "string"
+ },
+ "events": {
+ "description": "Events published.",
+ "items": {
+ "description": "Event name.",
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EsbQueueInfo": {
+ "description": "Broker-reported state of a queue.",
+ "properties": {
+ "messageCount": {
+ "description": "Messages waiting.",
+ "type": "integer"
+ },
+ "consumerCount": {
+ "description": "Connected consumers.",
+ "type": "integer"
+ },
+ "paused": {
+ "description": "Whether the queue is paused.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "EsbTableResponseV1": {
+ "description": "GET /esb/table/{table}: what a table publishes, and who subscribes.",
+ "properties": {
+ "table": {
+ "description": "Table name.",
+ "type": "string"
+ },
+ "publications": {
+ "description": "Destinations the table publishes to.",
+ "items": {
+ "$ref": "#/components/schemas/EsbPublication"
+ },
+ "type": "array"
+ },
+ "subscribers": {
+ "description": "Triggers subscribed to those destinations (on processes the user can access).",
+ "items": {
+ "$ref": "#/components/schemas/EsbTrigger"
+ },
+ "type": "array"
+ },
+ "permissions": {
+ "$ref": "#/components/schemas/EsbPermissions"
+ }
+ },
+ "type": "object"
+ },
+ "EsbTrigger": {
+ "description": "A process subscribed to a destination.",
+ "properties": {
+ "name": {
+ "description": "Trigger name.",
+ "type": "string"
+ },
+ "processName": {
+ "description": "Process the trigger runs.",
+ "type": "string"
+ },
+ "processLabel": {
+ "description": "User-facing label of the process.",
+ "type": "string"
+ },
+ "destination": {
+ "$ref": "#/components/schemas/EsbDestination"
+ },
+ "mode": {
+ "description": "SINGLE runs the process per message; BATCH per batch of messages.",
+ "enum": [
+ "SINGLE",
+ "BATCH"
+ ],
+ "type": "string"
+ },
+ "concurrency": {
+ "description": "Consumers run in parallel.",
+ "type": "integer"
+ },
+ "maxAttempts": {
+ "description": "Attempts before a message is dead-lettered.",
+ "type": "integer"
+ },
+ "state": {
+ "description": "Current state of the trigger.",
+ "enum": [
+ "RUNNING",
+ "PAUSED",
+ "CONNECTING",
+ "STOPPED"
+ ],
+ "type": "string"
+ },
+ "counters": {
+ "$ref": "#/components/schemas/EsbCounter"
+ },
+ "deadLetter": {
+ "$ref": "#/components/schemas/EsbDeadLetter"
+ },
+ "subscription": {
+ "$ref": "#/components/schemas/EsbDeadLetter",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "HealthCheckV1": {
+ "properties": {
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "kind": {
+ "nullable": true,
+ "type": "string"
+ },
+ "severity": {
+ "nullable": true,
+ "type": "string"
+ },
+ "currentStatus": {
+ "nullable": true,
+ "type": "string"
+ },
+ "currentMessage": {
+ "nullable": true,
+ "type": "string"
+ },
+ "currentSince": {
+ "nullable": true,
+ "type": "string"
+ },
+ "lastRunAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "lastLatencyMs": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "HealthComponentV1": {
+ "properties": {
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "nullable": true,
+ "type": "string"
+ },
+ "since": {
+ "nullable": true,
+ "type": "string"
+ },
+ "checksUp": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "checksDegraded": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "checksDown": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "checksUnknown": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "worstCheckId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "updatedAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "checks": {
+ "items": {
+ "$ref": "#/components/schemas/HealthCheckV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HealthCountsV1": {
+ "properties": {
+ "up": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "degraded": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "down": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "unknown": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "HealthDetailsV1": {
+ "properties": {
+ "values": {
+ "additionalProperties": true,
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "HealthHistoryV1": {
+ "properties": {
+ "results": {
+ "items": {
+ "$ref": "#/components/schemas/HealthResultV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HealthMetricV1": {
+ "properties": {
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "value": {
+ "type": "number"
+ },
+ "unit": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "HealthResultV1": {
+ "properties": {
+ "id": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "status": {
+ "nullable": true,
+ "type": "string"
+ },
+ "message": {
+ "nullable": true,
+ "type": "string"
+ },
+ "detailsJson": {
+ "nullable": true,
+ "type": "string"
+ },
+ "metricsJson": {
+ "nullable": true,
+ "type": "string"
+ },
+ "latencyMs": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "startedAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "finishedAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "runnerPod": {
+ "nullable": true,
+ "type": "string"
+ },
+ "isTransition": {
+ "type": "boolean"
+ },
+ "triggeredBy": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "HealthRunV1": {
+ "properties": {
+ "status": {
+ "nullable": true,
+ "type": "string"
+ },
+ "message": {
+ "nullable": true,
+ "type": "string"
+ },
+ "details": {
+ "$ref": "#/components/schemas/HealthDetailsV1"
+ },
+ "latencyMs": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "metrics": {
+ "items": {
+ "$ref": "#/components/schemas/HealthMetricV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HealthRunnerV1": {
+ "properties": {
+ "lastBeatAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "pods": {
+ "items": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "HealthSummaryV1": {
+ "properties": {
+ "status": {
+ "nullable": true,
+ "type": "string"
+ },
+ "since": {
+ "nullable": true,
+ "type": "string"
+ },
+ "counts": {
+ "$ref": "#/components/schemas/HealthCountsV1"
+ },
+ "components": {
+ "items": {
+ "$ref": "#/components/schemas/HealthComponentV1"
+ },
+ "type": "array"
+ },
+ "runner": {
+ "$ref": "#/components/schemas/HealthRunnerV1"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsActionV1": {
+ "description": "An available action: operationId targets an inbox operation with this item id; process actions provide a complete href.",
+ "properties": {
+ "href": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "operationId": {
+ "type": "string"
+ },
+ "processName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsErrorV1": {
+ "description": "Deprecated since 1.2.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsFollowV1": {
+ "description": "Capability discovery only. Next obtains the follow URL from its collaboration module.",
+ "properties": {
+ "available": {
+ "description": "True exactly when the collaboration UI API extension is registered.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsInboxItemV1": {
+ "description": "A notification recipient. body is included only in page items and banners; alertId only for ALERT notifications.",
+ "properties": {
+ "actions": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsActionV1"
+ },
+ "type": "array"
+ },
+ "age": {
+ "type": "string"
+ },
+ "alertId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "body": {
+ "nullable": true,
+ "type": "string"
+ },
+ "category": {
+ "nullable": true,
+ "type": "string"
+ },
+ "deliveredAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "href": {
+ "description": "Existing safe link, or null.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "linkLabel": {
+ "nullable": true,
+ "type": "string"
+ },
+ "notificationId": {
+ "type": "integer"
+ },
+ "severity": {
+ "nullable": true,
+ "type": "string"
+ },
+ "source": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sticky": {
+ "type": "boolean"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "unread": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsInboxPageV1": {
+ "description": "Filtered notification page.",
+ "properties": {
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsInboxItemV1"
+ },
+ "type": "array"
+ },
+ "limit": {
+ "type": "integer"
+ },
+ "offset": {
+ "type": "integer"
+ },
+ "total": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsInboxSummaryV1": {
+ "description": "Bell summary, latest ten items and up to three sticky banners.",
+ "properties": {
+ "alertsHref": {
+ "type": "string"
+ },
+ "banners": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsInboxItemV1"
+ },
+ "type": "array"
+ },
+ "highestUnreadSeverity": {
+ "nullable": true,
+ "type": "string"
+ },
+ "inboxHref": {
+ "description": "Canonical inbox navigation link.",
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsInboxItemV1"
+ },
+ "type": "array"
+ },
+ "notificationsHref": {
+ "description": "Existing notifications page link; retained for compatibility.",
+ "type": "string"
+ },
+ "pollSeconds": {
+ "type": "integer"
+ },
+ "preferencesSection": {
+ "description": "Name of the user Preferences section for notification settings (/qqq/v1/preferences/{name}), or null when not registered.",
+ "nullable": true,
+ "type": "string"
+ },
+ "unreadCount": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsInboxTargetV1": {
+ "description": "Select id, nonempty ids (first 500), legacy alertId, or all:true in that precedence. All scans are capped at 1000 rows.",
+ "properties": {
+ "alertId": {
+ "type": "integer"
+ },
+ "all": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "ids": {
+ "items": {
+ "type": "integer"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsMutationResultV1": {
+ "description": "Number of the caller own recipient rows changed.",
+ "properties": {
+ "updated": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsPanelAlertV1": {
+ "description": "A visible open alert with permission-aware process actions.",
+ "properties": {
+ "actions": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsActionV1"
+ },
+ "type": "array"
+ },
+ "age": {
+ "type": "string"
+ },
+ "alertId": {
+ "type": "integer"
+ },
+ "group": {
+ "nullable": true,
+ "type": "string"
+ },
+ "href": {
+ "type": "string"
+ },
+ "raisedAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "severity": {
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "nullable": true,
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsRecordPanelV1": {
+ "description": "Open alerts, recent resolutions and collaboration capability. watching is deprecated legacy subscription state.",
+ "properties": {
+ "canManage": {
+ "type": "boolean"
+ },
+ "follow": {
+ "$ref": "#/components/schemas/AlertsFollowV1"
+ },
+ "open": {
+ "items": {
+ "$ref": "#/components/schemas/AlertsPanelAlertV1"
+ },
+ "type": "array"
+ },
+ "openCount": {
+ "type": "integer"
+ },
+ "resolvedLast30Days": {
+ "type": "integer"
+ },
+ "viewAllHref": {
+ "nullable": true,
+ "type": "string"
+ },
+ "visible": {
+ "type": "boolean"
+ },
+ "watching": {
+ "description": "Deprecated: existing RECORD subscriptions only; does not represent collaboration follow state.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "AlertsUnreadTargetV1": {
+ "description": "Select id or nonempty ids (first 500), in that precedence. Legacy alertId is also accepted for compatibility. all is not supported.",
+ "properties": {
+ "alertId": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "ids": {
+ "items": {
+ "type": "integer"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantAccessResponseV1": {
+ "description": "Explain access: per table, the user's UI permissions, the assistant's data access, and each tool's verdict.",
+ "properties": {
+ "tables": {
+ "items": {
+ "additionalProperties": true,
+ "description": "table, label, dataAccess, dataAccessSource, ui {visible, read, insert, edit, delete}, operations [{tool, operation, allowed, reason}].",
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantActionV1": {
+ "description": "A write the assistant proposed and its state.",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "status": {
+ "description": "PENDING, RUNNING, EXECUTED, FAILED, REJECTED or EXPIRED.",
+ "type": "string"
+ },
+ "toolName": {
+ "type": "string"
+ },
+ "tableName": {
+ "type": "string"
+ },
+ "recordId": {
+ "nullable": true,
+ "type": "string"
+ },
+ "summary": {
+ "type": "string"
+ },
+ "httpStatus": {
+ "description": "The UI API status of the write.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "resultSummary": {
+ "nullable": true,
+ "type": "string"
+ },
+ "expiresAt": {
+ "nullable": true,
+ "type": "string"
+ },
+ "outcome": {
+ "description": "After a confirm: the tool outcome.",
+ "nullable": true,
+ "type": "string"
+ },
+ "message": {
+ "description": "After a confirm: what happened.",
+ "nullable": true,
+ "type": "string"
+ },
+ "href": {
+ "description": "After a confirm: the written record's /app link.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantActiveTurnsResponseV1": {
+ "description": "The caller's active runs, newest first; stale leases are reaped.",
+ "properties": {
+ "turns": {
+ "items": {
+ "description": "An active assistant run.",
+ "properties": {
+ "turnId": {
+ "type": "integer"
+ },
+ "conversationId": {
+ "type": "integer"
+ },
+ "assistantMessageId": {
+ "type": "integer"
+ },
+ "userMessageId": {
+ "type": "integer"
+ },
+ "status": {
+ "description": "RUNNING or CANCELLING.",
+ "type": "string"
+ },
+ "phase": {
+ "type": "string"
+ },
+ "startedAt": {
+ "description": "ISO-8601.",
+ "type": "string"
+ },
+ "heartbeatAt": {
+ "description": "ISO-8601.",
+ "type": "string"
+ },
+ "elapsedMs": {
+ "type": "integer"
+ },
+ "live": {
+ "description": "Running on this replica.",
+ "type": "boolean"
+ },
+ "concurrencyMode": {
+ "description": "SUPERSEDE or CONCURRENT.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantConfigResponseV1": {
+ "description": "Whether the assistant is available to this user, and how.",
+ "properties": {
+ "enabled": {
+ "description": "Whether the panel may be used.",
+ "type": "boolean"
+ },
+ "reason": {
+ "description": "Why not: DISABLED, NO_PERMISSION, NOT_CONFIGURED or KILL_SWITCH.",
+ "nullable": true,
+ "type": "string"
+ },
+ "shortcut": {
+ "description": "Keyboard shortcut, e.g. mod+j.",
+ "type": "string"
+ },
+ "model": {
+ "description": "The model that answers.",
+ "type": "string"
+ },
+ "limits": {
+ "additionalProperties": true,
+ "description": "maxTurnSeconds and maxToolCallsPerTurn.",
+ "type": "object"
+ },
+ "features": {
+ "additionalProperties": true,
+ "description": "writes: some table allows writes; pendingActions: writes wait for confirmation.",
+ "type": "object"
+ },
+ "profile": {
+ "$ref": "#/components/schemas/AssistantProfileV1"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantConversationDetailResponseV1": {
+ "description": "A conversation and a page of its messages, oldest first.",
+ "properties": {
+ "conversation": {
+ "$ref": "#/components/schemas/AssistantConversationV1"
+ },
+ "messages": {
+ "items": {
+ "$ref": "#/components/schemas/AssistantMessageV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantConversationListResponseV1": {
+ "description": "The user's conversations, newest first.",
+ "properties": {
+ "conversations": {
+ "items": {
+ "$ref": "#/components/schemas/AssistantConversationV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantConversationV1": {
+ "description": "One of the user's own conversations.",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "ACTIVE or ARCHIVED.",
+ "type": "string"
+ },
+ "pinned": {
+ "type": "boolean"
+ },
+ "lastMessageAt": {
+ "description": "ISO-8601 instant.",
+ "nullable": true,
+ "type": "string"
+ },
+ "unreadCount": {
+ "type": "integer"
+ },
+ "createDate": {
+ "description": "ISO-8601 instant.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantErrorV1": {
+ "description": "Deprecated since 1.3.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "description": "A message for the user.",
+ "type": "string"
+ },
+ "code": {
+ "description": "BUDGET, RATE_LIMIT, NOT_CONFIGURED, KILL_SWITCH, DISABLED, NO_PERMISSION...",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantMessageV1": {
+ "description": "A message: the user's text or the assistant's reply as parts (text, tool, record_refs, navigate, notice).",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "role": {
+ "description": "USER or ASSISTANT.",
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "turnId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "createDate": {
+ "nullable": true,
+ "type": "string"
+ },
+ "parts": {
+ "items": {
+ "additionalProperties": true,
+ "description": "A message part.",
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantProfileV1": {
+ "description": "How the assistant presents itself (admin-configured; text only, it never changes access).",
+ "properties": {
+ "displayName": {
+ "description": "The assistant's name.",
+ "type": "string"
+ },
+ "icon": {
+ "description": "A Material icon name.",
+ "type": "string"
+ },
+ "greeting": {
+ "description": "Shown on a new conversation.",
+ "nullable": true,
+ "type": "string"
+ },
+ "starterPrompts": {
+ "description": "Suggested first questions.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantStatusResponseV1": {
+ "description": "An acknowledgement.",
+ "properties": {
+ "status": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AssistantTurnEventV1": {
+ "description": "One server-sent event of a turn (event: , id: , data: this object). Types: message.start, turn.phase, text.delta, tool.start, tool.result, ui.navigate, notice, usage, message.end, error, ping.",
+ "properties": {
+ "seq": {
+ "description": "Sequence number; resume with ?after=.",
+ "type": "integer"
+ },
+ "type": {
+ "description": "The event type (also the SSE event name).",
+ "type": "string"
+ },
+ "data": {
+ "additionalProperties": true,
+ "description": "The event's fields, by type. message.start includes startedAt (ISO-8601). turn.phase includes phase (thinking, tool, writing), optional toolName and label.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAccessRequestCreateRequestV1": {
+ "properties": {
+ "message": {
+ "description": "message.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "recordId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "shareId": {
+ "description": "shareId.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "tableName": {
+ "description": "tableName.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAccessRequestListV1": {
+ "properties": {
+ "items": {
+ "description": "items.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationAccessRequestV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "nextCursor.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAccessRequestV1": {
+ "properties": {
+ "handledAt": {
+ "description": "handledAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "handledByDisplayName": {
+ "description": "Display name of the person who handled the request.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "id.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "message": {
+ "description": "message.",
+ "nullable": true,
+ "type": "string"
+ },
+ "note": {
+ "description": "note.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "recordId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "requesterDisplayName": {
+ "description": "Requester display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "requesterUserId": {
+ "description": "requesterUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "status.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "tableName.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAssignmentRequestV1": {
+ "properties": {
+ "assigneeUserId": {
+ "description": "assigneeUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "ownerUserId": {
+ "description": "ownerUserId.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAssignmentV1": {
+ "properties": {
+ "assigneeDisplayName": {
+ "description": "Assignee display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "assigneeUserId": {
+ "description": "assigneeUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "id.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "ownerDisplayName": {
+ "description": "Owner display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "ownerUserId": {
+ "description": "ownerUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "recordId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "tableName.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAttachmentListV1": {
+ "description": "Attachments, newest first.",
+ "properties": {
+ "items": {
+ "description": "Attachments, newest first.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationAttachmentV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAttachmentPatchRequestV1": {
+ "description": "Change attachment display metadata.",
+ "properties": {
+ "description": {
+ "description": "Optional description; empty clears, null leaves unchanged.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fileName": {
+ "description": "Optional new display filename; null leaves unchanged.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAttachmentUploadRequestV1": {
+ "description": "Multipart upload with exactly one file part named file.",
+ "properties": {
+ "description": {
+ "description": "Optional description.",
+ "nullable": true,
+ "type": "string"
+ },
+ "file": {
+ "description": "Required file content.",
+ "format": "binary",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationAttachmentV1": {
+ "description": "An attachment visible through its parent record; no storage coordinates are exposed.",
+ "properties": {
+ "canDelete": {
+ "description": "Whether the caller may change or delete this attachment.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "contentType": {
+ "description": "MIME content type.",
+ "nullable": true,
+ "type": "string"
+ },
+ "createDate": {
+ "description": "Upload time.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "createdByDisplayName": {
+ "description": "Uploader display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "createdByUserId": {
+ "description": "Uploader identity.",
+ "nullable": true,
+ "type": "string"
+ },
+ "description": {
+ "description": "Optional description.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fileName": {
+ "description": "Safe display filename.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "Attachment identifier.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "recordId": {
+ "description": "Canonical parent record key.",
+ "nullable": true,
+ "type": "string"
+ },
+ "sha256": {
+ "description": "SHA-256 content digest.",
+ "nullable": true,
+ "type": "string"
+ },
+ "sizeBytes": {
+ "description": "Stored byte count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "tableName": {
+ "description": "Parent table metadata name.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentEditRequestV1": {
+ "description": "Replace the caller's comment body.",
+ "properties": {
+ "body": {
+ "description": "Required replacement body, 1 to 20000 characters.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentHistoryV1": {
+ "description": "Previous bodies in edit order.",
+ "properties": {
+ "items": {
+ "description": "Previous bodies in edit order.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationCommentRevisionV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentPageV1": {
+ "description": "Root threads by latest activity, with replies.",
+ "properties": {
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ },
+ "threads": {
+ "description": "Root threads by latest activity, with replies.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationCommentV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentPostRequestV1": {
+ "description": "Post a root comment or one-level reply.",
+ "properties": {
+ "body": {
+ "description": "Required body, 1 to 20000 characters; mentions use @[Name](user:id).",
+ "nullable": true,
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Optional existing parent field name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "parentCommentId": {
+ "description": "Optional comment to reply to.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentRevisionV1": {
+ "description": "A previous comment body.",
+ "properties": {
+ "body": {
+ "description": "Previous body text.",
+ "nullable": true,
+ "type": "string"
+ },
+ "editedAt": {
+ "description": "Time the body was replaced.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "editedByDisplayName": {
+ "description": "Editor display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "editedByUserId": {
+ "description": "Editor identity.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "Revision identifier.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationCommentV1": {
+ "description": "A comment or reply; deleted comments retain their position without body text.",
+ "properties": {
+ "authorDisplayName": {
+ "description": "Author display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "authorUserId": {
+ "description": "Author identity.",
+ "nullable": true,
+ "type": "string"
+ },
+ "body": {
+ "description": "Plain text with mention tokens; null for deleted comments.",
+ "nullable": true,
+ "type": "string"
+ },
+ "canDelete": {
+ "description": "Caller may delete this comment.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "canEdit": {
+ "description": "Caller may edit the body.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "createdAt": {
+ "description": "Creation time.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "deleted": {
+ "description": "Whether the comment is soft deleted.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "editedAt": {
+ "description": "Last edit time, if edited.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Optional field being discussed.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "Comment identifier.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "mentions": {
+ "description": "Mention recipients.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationMentionV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "parentCommentId": {
+ "description": "Root comment for a reply; null on roots.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "replies": {
+ "description": "Replies in oldest-first order; empty on replies.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationCommentV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "resolved": {
+ "description": "Whether the thread is resolved.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "threadId": {
+ "description": "Root thread identifier; null on roots.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationDownloadV1": {
+ "description": "Temporary access to file bytes. Clients follow url.",
+ "properties": {
+ "url": {
+ "description": "Presigned URL, valid for five minutes. Clients follow url; never persist it.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationErrorV1": {
+ "description": "Deprecated since 1.1.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "description": "Human-readable reason the operation failed.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFavoriteListV1": {
+ "description": "Ordered personal favorites.",
+ "properties": {
+ "items": {
+ "description": "Ordered personal favorites.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationFavoriteV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFavoriteOrderRequestV1": {
+ "description": "Move selected favorites first and optionally assign folders.",
+ "properties": {
+ "folders": {
+ "additionalProperties": {
+ "nullable": true,
+ "type": "string"
+ },
+ "description": "Optional map from favorite identifier to folder; null values clear folders.",
+ "nullable": true,
+ "type": "object"
+ },
+ "ids": {
+ "description": "Required ordered favorite identifiers, with no duplicates.",
+ "items": {
+ "type": "integer"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFavoriteV1": {
+ "description": "A saved navigation target, with availability rechecked for the caller.",
+ "properties": {
+ "available": {
+ "description": "Whether the caller can currently open this target.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "folder": {
+ "description": "Optional personal grouping.",
+ "nullable": true,
+ "type": "string"
+ },
+ "href": {
+ "description": "Navigation link, absent for unavailable targets.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "Favorite identifier.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "label": {
+ "description": "Current display label; Unavailable when access is lost.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "Canonical record key; null for non-record targets.",
+ "nullable": true,
+ "type": "string"
+ },
+ "sortOrder": {
+ "description": "Position in the personal list.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "targetName": {
+ "description": "Metadata name of the table, app, process, report or saved view.",
+ "nullable": true,
+ "type": "string"
+ },
+ "targetType": {
+ "description": "Kind of navigation target.",
+ "enum": [
+ "TABLE",
+ "APP",
+ "RECORD",
+ "PROCESS",
+ "REPORT",
+ "SAVED_VIEW"
+ ],
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFollowRequestV1": {
+ "description": "Configure the caller's follow preferences.",
+ "properties": {
+ "notifyOnChange": {
+ "description": "Optional change notifications preference; omission retains current setting.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "notifyOnComment": {
+ "description": "Optional comment notifications preference; omission retains current setting.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFollowStateV1": {
+ "description": "The current caller's subscription state.",
+ "properties": {
+ "follow": {
+ "$ref": "#/components/schemas/CollaborationFollowV1",
+ "description": "Subscription settings; null when not following.",
+ "nullable": true
+ },
+ "following": {
+ "description": "Whether the caller follows the record.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFollowV1": {
+ "description": "A subscription to record changes and comments.",
+ "properties": {
+ "id": {
+ "description": "Subscription identifier.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "mutedUntil": {
+ "description": "Notifications muted until this time, if set.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "notifyOnChange": {
+ "description": "Receive record change digests.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "notifyOnComment": {
+ "description": "Receive new comment notifications.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "reason": {
+ "description": "How following began.",
+ "enum": [
+ "MANUAL",
+ "AUTHOR",
+ "COMMENTED",
+ "MENTIONED",
+ "ASSIGNED",
+ "SHARED"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "userDisplayName": {
+ "description": "Follower display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "userId": {
+ "description": "Follower identity.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationFollowerListV1": {
+ "description": "Subscriptions for this record.",
+ "properties": {
+ "items": {
+ "description": "Subscriptions for this record.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationFollowV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationLinkV1": {
+ "properties": {
+ "label": {
+ "description": "label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "url": {
+ "description": "url.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationMentionCandidateListV1": {
+ "description": "Candidates ranked with record participants first.",
+ "properties": {
+ "items": {
+ "description": "Candidates ranked with record participants first.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationMentionCandidateV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationMentionCandidateV1": {
+ "description": "A matching person and their known parent access.",
+ "properties": {
+ "canRead": {
+ "description": "Recipient access: string true, false, or unknown when it cannot be established.",
+ "enum": [
+ "true",
+ "false",
+ "unknown"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "person": {
+ "$ref": "#/components/schemas/CollaborationPersonV1",
+ "description": "Directory identity.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationMentionV1": {
+ "description": "A mention embedded in a comment.",
+ "properties": {
+ "userId": {
+ "description": "Mentioned user identity.",
+ "nullable": true,
+ "type": "string"
+ },
+ "visible": {
+ "description": "Whether recipient access was confirmed when mentioned.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationMutationResultV1": {
+ "description": "Acknowledgement of a completed mutation.",
+ "properties": {
+ "success": {
+ "description": "True after the requested operation completes.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationMyWorkV1": {
+ "properties": {
+ "assignedRecordsByTable": {
+ "additionalProperties": {
+ "type": "integer"
+ },
+ "description": "assignedRecordsByTable.",
+ "nullable": true,
+ "type": "object"
+ },
+ "openTaskCount": {
+ "description": "openTaskCount.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "tasks": {
+ "description": "tasks.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationTaskV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "unreadMentionCount": {
+ "description": "unreadMentionCount.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPersonListV1": {
+ "description": "Matching active directory entries.",
+ "properties": {
+ "items": {
+ "description": "Matching active directory entries.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationPersonV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPersonV1": {
+ "description": "An active directory entry.",
+ "properties": {
+ "displayName": {
+ "description": "Display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "email": {
+ "description": "Directory email, if known.",
+ "nullable": true,
+ "type": "string"
+ },
+ "lastSeenAt": {
+ "description": "Most recent directory refresh time.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "userId": {
+ "description": "Stable user identity.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPresenceLeaveV1": {
+ "description": "Remove the caller's lease on this connection and target.",
+ "properties": {
+ "connectionId": {
+ "description": "Client connection identity.",
+ "nullable": false,
+ "type": "string"
+ },
+ "pk": {
+ "description": "Optional parent key.",
+ "nullable": true,
+ "type": "string"
+ },
+ "table": {
+ "description": "Parent table name.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPresenceRequestV1": {
+ "description": "Renew a 45-second presence lease; send every 20 seconds.",
+ "properties": {
+ "connectionId": {
+ "description": "Client connection identity.",
+ "nullable": false,
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Optional focused field on a record.",
+ "nullable": true,
+ "type": "string"
+ },
+ "mode": {
+ "description": "VIEWING or EDITING.",
+ "enum": [
+ "VIEWING",
+ "EDITING"
+ ],
+ "nullable": false,
+ "type": "string"
+ },
+ "pk": {
+ "description": "Optional parent key; omit for a table view.",
+ "nullable": true,
+ "type": "string"
+ },
+ "table": {
+ "description": "Parent table name.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPresenceSnapshotV1": {
+ "description": "Live viewers, merged across tabs; presence.changed uses this payload.",
+ "properties": {
+ "pk": {
+ "description": "Record key; absent for table events.",
+ "nullable": true,
+ "type": "string"
+ },
+ "table": {
+ "description": "Parent table name.",
+ "nullable": false,
+ "type": "string"
+ },
+ "viewers": {
+ "items": {
+ "$ref": "#/components/schemas/CollaborationPresenceViewerV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationPresenceViewerV1": {
+ "description": "One user merged across live tabs; EDITING takes precedence.",
+ "properties": {
+ "displayName": {
+ "description": "Session display name.",
+ "nullable": false,
+ "type": "string"
+ },
+ "fieldName": {
+ "description": "Focused field; null on table snapshots.",
+ "nullable": true,
+ "type": "string"
+ },
+ "mode": {
+ "description": "VIEWING or EDITING.",
+ "enum": [
+ "VIEWING",
+ "EDITING"
+ ],
+ "nullable": false,
+ "type": "string"
+ },
+ "userId": {
+ "description": "Stable user identity.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationRecentListV1": {
+ "description": "Most recent visible targets, at most fifty.",
+ "properties": {
+ "items": {
+ "description": "Most recent visible targets, at most fifty.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationFavoriteV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationShareListV1": {
+ "properties": {
+ "items": {
+ "description": "items.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationShareV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationSharePreviewV1": {
+ "properties": {
+ "recipients": {
+ "description": "recipients.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationShareRecipientV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationShareRecipientV1": {
+ "properties": {
+ "canRead": {
+ "description": "canRead.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "displayName": {
+ "description": "displayName.",
+ "nullable": true,
+ "type": "string"
+ },
+ "userId": {
+ "description": "userId.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationShareRequestV1": {
+ "properties": {
+ "message": {
+ "description": "message.",
+ "nullable": true,
+ "type": "string"
+ },
+ "toUserIds": {
+ "description": "toUserIds.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationShareV1": {
+ "properties": {
+ "fromDisplayName": {
+ "description": "Sender display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fromUserId": {
+ "description": "fromUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "id.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "message": {
+ "description": "message.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recipientCouldRead": {
+ "description": "recipientCouldRead.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "recordId": {
+ "description": "recordId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "sentAt": {
+ "description": "sentAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "tableName.",
+ "nullable": true,
+ "type": "string"
+ },
+ "toDisplayName": {
+ "description": "Recipient display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "toUserId": {
+ "description": "toUserId.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTagApplyRequestV1": {
+ "description": "Add and remove tag associations in one request.",
+ "properties": {
+ "add": {
+ "description": "Tag identifiers to add; omitted means none.",
+ "items": {
+ "type": "integer"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "remove": {
+ "description": "Tag identifiers to remove; omitted means none.",
+ "items": {
+ "type": "integer"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTagCreateRequestV1": {
+ "description": "Create a tag or suggest one under the table policy.",
+ "properties": {
+ "color": {
+ "description": "Optional display color.",
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Required display label, 1 to 60 characters.",
+ "nullable": true,
+ "type": "string"
+ },
+ "table": {
+ "description": "Required table metadata name.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTagListV1": {
+ "description": "Available or applied tags.",
+ "properties": {
+ "items": {
+ "description": "Available or applied tags.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationTagV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTagV1": {
+ "description": "An approved tag or the caller's pending suggestion.",
+ "properties": {
+ "approved": {
+ "description": "Whether anyone may apply this tag.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "color": {
+ "description": "Optional display color.",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "Tag identifier.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "label": {
+ "description": "Display label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "name": {
+ "description": "Normalized vocabulary name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Table scope; null means global.",
+ "nullable": true,
+ "type": "string"
+ },
+ "usageCount": {
+ "description": "Number of record associations.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTargetRequestV1": {
+ "description": "Target to star, unstar, or record as recently viewed.",
+ "properties": {
+ "recordId": {
+ "description": "Required for RECORD; omitted otherwise.",
+ "nullable": true,
+ "type": "string"
+ },
+ "targetName": {
+ "description": "Required metadata name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "targetType": {
+ "description": "Required target kind.",
+ "enum": [
+ "TABLE",
+ "APP",
+ "RECORD",
+ "PROCESS",
+ "REPORT",
+ "SAVED_VIEW"
+ ],
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTaskCreateRequestV1": {
+ "properties": {
+ "assigneeUserId": {
+ "description": "assigneeUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "dueAt": {
+ "description": "dueAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "notes": {
+ "description": "notes.",
+ "nullable": true,
+ "type": "string"
+ },
+ "remindAt": {
+ "description": "remindAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "title": {
+ "description": "title.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTaskListV1": {
+ "properties": {
+ "items": {
+ "description": "items.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationTaskV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "nextCursor.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTaskPatchRequestV1": {
+ "properties": {
+ "assigneeUserId": {
+ "description": "assigneeUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "dueAt": {
+ "description": "dueAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "notes": {
+ "description": "notes.",
+ "nullable": true,
+ "type": "string"
+ },
+ "remindAt": {
+ "description": "remindAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "status.",
+ "nullable": true,
+ "type": "string"
+ },
+ "title": {
+ "description": "title.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTaskV1": {
+ "properties": {
+ "assigneeDisplayName": {
+ "description": "Assignee display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "assigneeUserId": {
+ "description": "assigneeUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "completedAt": {
+ "description": "completedAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "completedByDisplayName": {
+ "description": "Display name of the person who completed the task.",
+ "nullable": true,
+ "type": "string"
+ },
+ "completedByUserId": {
+ "description": "completedByUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "createdByDisplayName": {
+ "description": "Creator display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "createdByUserId": {
+ "description": "createdByUserId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "dueAt": {
+ "description": "dueAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "description": "id.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "notes": {
+ "description": "notes.",
+ "nullable": true,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "recordId.",
+ "nullable": true,
+ "type": "string"
+ },
+ "remindAt": {
+ "description": "remindAt.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "status.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "tableName.",
+ "nullable": true,
+ "type": "string"
+ },
+ "title": {
+ "description": "title.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTimelineDetailV1": {
+ "description": "A permitted field change from a core audit.",
+ "properties": {
+ "fieldName": {
+ "description": "Changed field metadata name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "message": {
+ "description": "Optional audit message.",
+ "nullable": true,
+ "type": "string"
+ },
+ "newValue": {
+ "description": "New display value.",
+ "nullable": true,
+ "type": "string"
+ },
+ "oldValue": {
+ "description": "Previous display value.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTimelineItemV1": {
+ "description": "One visible event in the merged record timeline.",
+ "properties": {
+ "actorName": {
+ "description": "Actor display name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "actorUserId": {
+ "description": "Actor identity, when known.",
+ "nullable": true,
+ "type": "string"
+ },
+ "at": {
+ "description": "Event time.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "details": {
+ "description": "Field details filtered by caller permissions.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationTimelineDetailV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "id": {
+ "description": "Identifier within the source.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "kind": {
+ "description": "Event source.",
+ "enum": [
+ "ACTIVITY",
+ "AUDIT"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "refId": {
+ "description": "Related record key.",
+ "nullable": true,
+ "type": "string"
+ },
+ "refTable": {
+ "description": "Related table metadata name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "summary": {
+ "description": "Human-readable event summary.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CollaborationTimelinePageV1": {
+ "description": "Merged events, newest first.",
+ "properties": {
+ "items": {
+ "description": "Merged events, newest first.",
+ "items": {
+ "$ref": "#/components/schemas/CollaborationTimelineItemV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "nextCursor": {
+ "description": "Opaque continuation token; null when finished or the service has no continuation support.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisAxisV1": {
+ "nullable": true,
+ "properties": {
+ "field": {
+ "description": "Field.",
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "valueType": {
+ "description": "Value type.",
+ "enum": [
+ "COUNT",
+ "DECIMAL",
+ "PERCENT",
+ "DATE",
+ "DATE_TIME",
+ "DURATION",
+ "TEXT"
+ ],
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCandidateKeyV1": {
+ "nullable": true,
+ "properties": {
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "rowCount": {
+ "description": "Row count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "description": "Open the matching records using this table and QueryFilter; null when suppressed.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCapabilitiesV1": {
+ "nullable": true,
+ "properties": {
+ "canAnalyze": {
+ "description": "Whether this session may analyze the table; false responses expose no fields.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableLabel": {
+ "description": "Table label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisCapabilityFieldV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "limits": {
+ "$ref": "#/components/schemas/DataAnalysisLimitsV1",
+ "description": "Limits.",
+ "nullable": true
+ },
+ "backendCapabilities": {
+ "description": "Backend capabilities.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "sqlWorkbenchAvailable": {
+ "description": "Whether SQL Workbench metadata is installed in this instance.",
+ "nullable": true,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCapabilityFieldV1": {
+ "nullable": true,
+ "properties": {
+ "name": {
+ "description": "Name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "Type.",
+ "nullable": true,
+ "type": "string"
+ },
+ "kind": {
+ "description": "Semantic field kind: NUMERIC, DATE, DATE_TIME, TEXT, BOOLEAN or CATEGORY.",
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultChartKind": {
+ "description": "Default chart kind.",
+ "enum": [
+ "HISTOGRAM",
+ "BOX",
+ "BAR",
+ "PARETO",
+ "TIME_SERIES",
+ "SCATTER",
+ "HEATMAP"
+ ],
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisChartV1": {
+ "nullable": true,
+ "properties": {
+ "stacked": {
+ "description": "Stack category series to a total share of one when true.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "kind": {
+ "description": "Semantic field kind: NUMERIC, DATE, DATE_TIME, TEXT, BOOLEAN or CATEGORY.",
+ "enum": [
+ "HISTOGRAM",
+ "BOX",
+ "BAR",
+ "PARETO",
+ "TIME_SERIES",
+ "SCATTER",
+ "HEATMAP"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "alternatives": {
+ "description": "Alternatives.",
+ "items": {
+ "enum": [
+ "HISTOGRAM",
+ "BOX",
+ "BAR",
+ "PARETO",
+ "TIME_SERIES",
+ "SCATTER",
+ "HEATMAP"
+ ],
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "x": {
+ "$ref": "#/components/schemas/DataAnalysisAxisV1",
+ "description": "X.",
+ "nullable": true
+ },
+ "y": {
+ "$ref": "#/components/schemas/DataAnalysisAxisV1",
+ "description": "Y.",
+ "nullable": true
+ },
+ "series": {
+ "description": "Series.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisSeriesV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "annotations": {
+ "description": "Annotations.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisColumnProfileRequestV1": {
+ "additionalProperties": false,
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints."
+ },
+ "exact": {
+ "description": "Request exact computation instead of the configured estimate.",
+ "type": "boolean"
+ },
+ "fieldName": {
+ "description": "Readable field name to profile or enumerate.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "fieldName"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisColumnProfileV1": {
+ "nullable": true,
+ "properties": {
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints.",
+ "nullable": true
+ },
+ "estimate": {
+ "description": "True when statistics describe a sample rather than the entire filtered population.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "truncated": {
+ "description": "True when the row limit prevented a complete scan.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "rowsScanned": {
+ "description": "Number of source rows included in computation.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "asOf": {
+ "description": "As of.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "dataVersion": {
+ "description": "Data version.",
+ "nullable": true,
+ "type": "string"
+ },
+ "warnings": {
+ "description": "Warnings.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "fieldName": {
+ "description": "Readable field name to profile or enumerate.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fieldLabel": {
+ "description": "Field label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "fieldType": {
+ "description": "Field type.",
+ "nullable": true,
+ "type": "string"
+ },
+ "counts": {
+ "description": "Counts.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "numeric": {
+ "$ref": "#/components/schemas/DataAnalysisNumericProfileV1",
+ "description": "Numeric.",
+ "nullable": true
+ },
+ "dates": {
+ "$ref": "#/components/schemas/DataAnalysisDateProfileV1",
+ "description": "Dates.",
+ "nullable": true
+ },
+ "text": {
+ "$ref": "#/components/schemas/DataAnalysisTextProfileV1",
+ "description": "Text.",
+ "nullable": true
+ },
+ "booleans": {
+ "description": "Booleans.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "topValues": {
+ "description": "Top values.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Chart.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCompareRequestV1": {
+ "properties": {
+ "filterA": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Population A filter; null selects the whole permitted table.",
+ "nullable": true
+ },
+ "filterB": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Population B filter; null selects the whole permitted table.",
+ "nullable": true
+ },
+ "labelA": {
+ "description": "Display name of population A; default A.",
+ "type": "string"
+ },
+ "labelB": {
+ "description": "Display name of population B; default B.",
+ "type": "string"
+ },
+ "fields": {
+ "description": "Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "fields"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisCompareV1": {
+ "properties": {
+ "fields": {
+ "description": "Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisFieldComparisonV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisComparisonSideV1": {
+ "properties": {
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "metrics": {
+ "description": "Typed metrics with exact population drills unless privacy suppresses them.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisComparisonValueV1": {
+ "properties": {
+ "value": {
+ "description": "Value.",
+ "nullable": true
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "sideA": {
+ "$ref": "#/components/schemas/DataAnalysisComparisonSideV1",
+ "description": "Side a.",
+ "nullable": true
+ },
+ "sideB": {
+ "$ref": "#/components/schemas/DataAnalysisComparisonSideV1",
+ "description": "Side b.",
+ "nullable": true
+ },
+ "delta": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "B minus A, in original units (share differences are fractions).",
+ "nullable": true
+ },
+ "percentDelta": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "(B minus A) divided by absolute A, a fraction; null at a zero baseline.",
+ "nullable": true
+ },
+ "significance": {
+ "$ref": "#/components/schemas/DataAnalysisSignificanceV1",
+ "description": "Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCorrelationCellV1": {
+ "properties": {
+ "xField": {
+ "description": "FULL numeric field on the x axis.",
+ "nullable": true,
+ "type": "string"
+ },
+ "yField": {
+ "description": "FULL numeric field on the y axis.",
+ "nullable": true,
+ "type": "string"
+ },
+ "n": {
+ "description": "Pairwise non-null population count; null when privacy suppresses it.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "r": {
+ "description": "Pearson correlation; null for insufficient data, zero variance or privacy suppression.",
+ "nullable": true,
+ "type": "number"
+ },
+ "scatter": {
+ "$ref": "#/components/schemas/DataAnalysisScatterRequestV1",
+ "description": "POST the included parameters to the table scatter endpoint.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCorrelationRequestV1": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Current-user query filter; record locks and core field rules apply.",
+ "nullable": true
+ },
+ "fields": {
+ "description": "Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "fields"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisCorrelationV1": {
+ "properties": {
+ "fields": {
+ "description": "Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "cells": {
+ "description": "Cells.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisCorrelationCellV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Semantic series; category comparisons are grouped and category time series are stacked.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCrosstabCellV1": {
+ "properties": {
+ "rowIndex": {
+ "description": "Row index.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "columnIndex": {
+ "description": "Column index.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "count": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Cell count with its exact drill, or a suppressed metric.",
+ "nullable": true
+ },
+ "rowShare": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Cell count divided by row total; suppressed if it could disclose a hidden cell.",
+ "nullable": true
+ },
+ "columnShare": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Cell count divided by column total; suppressed if it could disclose a hidden cell.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisCrosstabRequestV1": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Current-user query filter; record locks and core field rules apply.",
+ "nullable": true
+ },
+ "rowField": {
+ "description": "FULL field defining crosstab rows.",
+ "type": "string"
+ },
+ "columnField": {
+ "description": "FULL field defining crosstab columns.",
+ "type": "string"
+ },
+ "limit": {
+ "description": "Maximum sample points (1 to 2000, default 2000) or kept crosstab categories per axis (1 to 20, default 20).",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "rowField",
+ "columnField"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisCrosstabV1": {
+ "properties": {
+ "rows": {
+ "description": "Rows.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotHeaderV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "columns": {
+ "description": "Columns.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotHeaderV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "cells": {
+ "description": "Cells.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisCrosstabCellV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "significance": {
+ "$ref": "#/components/schemas/DataAnalysisSignificanceV1",
+ "description": "Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisDateProfileV1": {
+ "nullable": true,
+ "properties": {
+ "metrics": {
+ "description": "Metrics.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "unit": {
+ "description": "Unit.",
+ "nullable": true,
+ "type": "string"
+ },
+ "buckets": {
+ "description": "Buckets.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "gaps": {
+ "description": "Gaps.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "dayOfWeek": {
+ "description": "Day of week.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "hourOfDay": {
+ "description": "Hour of day.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisDistinctValuesPageV1": {
+ "nullable": true,
+ "properties": {
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints.",
+ "nullable": true
+ },
+ "estimate": {
+ "description": "True when statistics describe a sample rather than the entire filtered population.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "truncated": {
+ "description": "True when the row limit prevented a complete scan.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "rowsScanned": {
+ "description": "Number of source rows included in computation.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "asOf": {
+ "description": "As of.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "dataVersion": {
+ "description": "Data version.",
+ "nullable": true,
+ "type": "string"
+ },
+ "warnings": {
+ "description": "Warnings.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "fieldName": {
+ "description": "Readable field name to profile or enumerate.",
+ "nullable": true,
+ "type": "string"
+ },
+ "page": {
+ "description": "Zero-based page number.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "pageSize": {
+ "description": "Maximum values per page, from 1 to 500.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "hasMore": {
+ "description": "Has more.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "totalDistinct": {
+ "description": "Total distinct.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "values": {
+ "description": "Values.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisDistinctValuesRequestV1": {
+ "additionalProperties": false,
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints."
+ },
+ "fieldName": {
+ "description": "Readable field name to profile or enumerate.",
+ "type": "string"
+ },
+ "page": {
+ "description": "Zero-based page number.",
+ "type": "integer"
+ },
+ "pageSize": {
+ "description": "Maximum values per page, from 1 to 500.",
+ "type": "integer"
+ },
+ "search": {
+ "description": "Optional search text applied to stored values.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "fieldName"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisDrillV1": {
+ "nullable": true,
+ "properties": {
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisDuplicatesRequestV1": {
+ "additionalProperties": false,
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints."
+ },
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "limit": {
+ "description": "Maximum duplicate groups to return, from 1 to 500; default 50.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "fields"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisDuplicatesResultV1": {
+ "nullable": true,
+ "properties": {
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints.",
+ "nullable": true
+ },
+ "estimate": {
+ "description": "True when statistics describe a sample rather than the entire filtered population.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "truncated": {
+ "description": "True when the row limit prevented a complete scan.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "rowsScanned": {
+ "description": "Number of source rows included in computation.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "asOf": {
+ "description": "As of.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "dataVersion": {
+ "description": "Data version.",
+ "nullable": true,
+ "type": "string"
+ },
+ "warnings": {
+ "description": "Warnings.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "groups": {
+ "description": "Groups.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisFieldComparisonV1": {
+ "properties": {
+ "field": {
+ "description": "FULL field whose distribution is compared over time.",
+ "nullable": true,
+ "type": "string"
+ },
+ "values": {
+ "description": "Values.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisComparisonValueV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "significance": {
+ "$ref": "#/components/schemas/DataAnalysisSignificanceV1",
+ "description": "Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion.",
+ "nullable": true
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Semantic series; category comparisons are grouped and category time series are stacked.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisFieldSummaryV1": {
+ "nullable": true,
+ "properties": {
+ "field": {
+ "description": "Field.",
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "description": "Type.",
+ "nullable": true,
+ "type": "string"
+ },
+ "completeness": {
+ "description": "Non-empty share as a 0..1 ratio rounded to six decimals.",
+ "nullable": true,
+ "type": "number"
+ },
+ "distinct": {
+ "description": "Distinct.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "uniqueness": {
+ "description": "Distinct share as a 0..1 ratio rounded to six decimals.",
+ "nullable": true,
+ "type": "number"
+ },
+ "constant": {
+ "description": "Constant.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "empty": {
+ "description": "Empty.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "nulls": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Nulls.",
+ "nullable": true
+ },
+ "blanks": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Blanks.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisFileV1": {
+ "format": "binary",
+ "type": "string"
+ },
+ "DataAnalysisLimitsV1": {
+ "nullable": true,
+ "properties": {
+ "maxRows": {
+ "description": "Max rows.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "sampleThresholdRows": {
+ "description": "Sample threshold rows.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "minGroupSize": {
+ "description": "Min group size.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisMetricV1": {
+ "nullable": true,
+ "properties": {
+ "key": {
+ "description": "Key.",
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "description": "Plain-English metric label, ready to display.",
+ "nullable": true,
+ "type": "string"
+ },
+ "value": {
+ "description": "Raw numeric or temporal value. PERCENT is a 0..1 ratio rounded to six decimals; DECIMAL field statistics have ten significant digits. DATE_TIME is an ISO instant.",
+ "nullable": true,
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "nullable": true,
+ "type": "object"
+ }
+ ]
+ },
+ "valueType": {
+ "description": "Value type.",
+ "enum": [
+ "COUNT",
+ "DECIMAL",
+ "PERCENT",
+ "DATE",
+ "DATE_TIME",
+ "DURATION",
+ "TEXT"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "estimate": {
+ "description": "Whether this metric is estimated; the population rows metric remains exact.",
+ "type": "boolean"
+ },
+ "formatted": {
+ "description": "Display-ready value, including grouping, field display formats, percent signs and session-zone dates; null when absent or suppressed.",
+ "nullable": true,
+ "type": "string"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "description": "Open the matching records using this table and QueryFilter; null when suppressed.",
+ "nullable": true
+ },
+ "suppressed": {
+ "description": "Suppressed.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "suppressedReason": {
+ "description": "Suppressed reason.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisNumericProfileV1": {
+ "nullable": true,
+ "properties": {
+ "metrics": {
+ "description": "Metrics.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "histogram": {
+ "description": "Histogram.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "outliers": {
+ "description": "Outliers.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPivotCellV1": {
+ "properties": {
+ "rowIndex": {
+ "description": "Zero-based index in rowHeaders.",
+ "type": "integer"
+ },
+ "columnIndex": {
+ "description": "Zero-based index in columnHeaders.",
+ "type": "integer"
+ },
+ "values": {
+ "description": "Metrics in requested measure order; suppressed metrics have no value or drill.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPivotDimensionV1": {
+ "properties": {
+ "field": {
+ "description": "FULL field name, optionally joinTable.field through an exposed join.",
+ "type": "string"
+ },
+ "dateBucket": {
+ "description": "Optional calendar or cyclic bucket in the session timezone.",
+ "enum": [
+ "YEAR",
+ "QUARTER",
+ "MONTH",
+ "WEEK",
+ "DAY",
+ "HOUR",
+ "DAY_OF_WEEK",
+ "HOUR_OF_DAY"
+ ],
+ "type": "string"
+ },
+ "numericBins": {
+ "$ref": "#/components/schemas/DataAnalysisPivotNumericBinsV1",
+ "description": "Optional equal-width numeric bins; mutually exclusive with dateBucket."
+ }
+ },
+ "required": [
+ "field"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisPivotHeaderV1": {
+ "properties": {
+ "value": {
+ "description": "Typed group key; null for a blank group or Other.",
+ "nullable": true
+ },
+ "label": {
+ "description": "Display label, including Other (k groups).",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPivotMeasureInfoV1": {
+ "properties": {
+ "key": {
+ "description": "Stable measure key by request position.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Display label.",
+ "type": "string"
+ },
+ "valueType": {
+ "description": "Semantic metric type.",
+ "enum": [
+ "COUNT",
+ "DECIMAL",
+ "PERCENT",
+ "DATE",
+ "DATE_TIME",
+ "DURATION",
+ "TEXT"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPivotMeasureV1": {
+ "properties": {
+ "operator": {
+ "description": "Aggregate operator. COUNT counts records, including null values.",
+ "enum": [
+ "COUNT",
+ "SUM",
+ "AVG",
+ "MIN",
+ "MAX",
+ "COUNT_DISTINCT",
+ "PERCENTILE"
+ ],
+ "type": "string"
+ },
+ "field": {
+ "description": "FULL field to aggregate; optional for COUNT.",
+ "type": "string"
+ },
+ "percentile": {
+ "description": "PERCENTILE only: percentile_cont fraction from 0 to 1.",
+ "type": "number"
+ }
+ },
+ "required": [
+ "operator"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisPivotNumericBinsV1": {
+ "properties": {
+ "count": {
+ "description": "Number of bins, 1–200; defaults to 20.",
+ "type": "integer"
+ },
+ "min": {
+ "description": "Optional explicit lower bound; otherwise a nice enclosing edge.",
+ "type": "number"
+ },
+ "max": {
+ "description": "Optional explicit upper bound; final interior bin includes this value.",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPivotRequestV1": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "User query filter, passed through for core enforcement."
+ },
+ "rows": {
+ "description": "One to three row dimensions.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotDimensionV1"
+ },
+ "type": "array"
+ },
+ "columns": {
+ "description": "Zero to two column dimensions; defaults to empty.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotDimensionV1"
+ },
+ "type": "array"
+ },
+ "values": {
+ "description": "One to six measures.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotMeasureV1"
+ },
+ "type": "array"
+ },
+ "showTotals": {
+ "description": "Include row, column and grand totals; defaults to true.",
+ "type": "boolean"
+ },
+ "limitGroups": {
+ "description": "Kept groups per dimension; default 50, maximum 200.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "rows",
+ "values"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisPivotV1": {
+ "properties": {
+ "rowHeaders": {
+ "description": "Row header tuples in cell-index order.",
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotHeaderV1"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "columnHeaders": {
+ "description": "Column header tuples; an empty tuple represents no column dimensions.",
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotHeaderV1"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "measures": {
+ "description": "Measure metadata in request order.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotMeasureInfoV1"
+ },
+ "type": "array"
+ },
+ "cells": {
+ "description": "Sparse cells; absent combinations are not materialized.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPivotCellV1"
+ },
+ "type": "array"
+ },
+ "rowTotals": {
+ "description": "Metric tuples aligned with rowHeaders; empty when totals disabled.",
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "columnTotals": {
+ "description": "Metric tuples aligned with columnHeaders; empty when totals disabled.",
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "grandTotals": {
+ "description": "Grand-total metrics; empty when totals disabled.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "type": "array"
+ },
+ "truncatedRows": {
+ "description": "Row groups were merged into Other.",
+ "type": "boolean"
+ },
+ "truncatedColumns": {
+ "description": "Column groups were merged into Other.",
+ "type": "boolean"
+ },
+ "estimate": {
+ "description": "True when bounded streamed fallback produced a partial result.",
+ "type": "boolean"
+ },
+ "warnings": {
+ "description": "Privacy, partial-result and joined-drill limitations.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "asOf": {
+ "description": "UTC timestamp of computation.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisPointV1": {
+ "nullable": true,
+ "properties": {
+ "x": {
+ "description": "X.",
+ "nullable": true,
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "nullable": true,
+ "type": "object"
+ }
+ ]
+ },
+ "y": {
+ "description": "Y.",
+ "nullable": true,
+ "type": "number"
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "description": "Open the matching records using this table and QueryFilter; null when suppressed.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisRunStartedV1": {
+ "nullable": true,
+ "properties": {
+ "runId": {
+ "description": "Run id.",
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "Status.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisRunStatusV1": {
+ "nullable": true,
+ "properties": {
+ "runId": {
+ "description": "Run id.",
+ "nullable": true,
+ "type": "string"
+ },
+ "status": {
+ "description": "Status.",
+ "nullable": true,
+ "type": "string"
+ },
+ "error": {
+ "description": "Error.",
+ "nullable": true,
+ "type": "string"
+ },
+ "columnProfile": {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileV1",
+ "description": "Completed column result; null for other operations or unfinished runs.",
+ "nullable": true
+ },
+ "tableProfile": {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileV1",
+ "description": "Completed table result; null for other operations or unfinished runs.",
+ "nullable": true
+ },
+ "startedAt": {
+ "description": "Started at.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "finishedAt": {
+ "description": "Finished at.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSavedEntryV1": {
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "tableName": {
+ "type": "string"
+ },
+ "tableLabel": {
+ "type": "string"
+ },
+ "owner": {
+ "type": "string"
+ },
+ "updated": {
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "starred": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSavedListV1": {
+ "properties": {
+ "analyses": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisSavedEntryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSavedRequestV1": {
+ "properties": {
+ "kind": {
+ "enum": [
+ "COLUMN_PROFILE",
+ "TABLE_PROFILE",
+ "PIVOT",
+ "COMPARE",
+ "CORRELATION",
+ "CROSSTAB",
+ "SHIFT"
+ ],
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Source QQQ table name; required for ad hoc export, supplied by the path for SQL.",
+ "type": "string"
+ },
+ "request": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisPivotRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisCompareRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisCorrelationRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisCrosstabRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisShiftRequestV1"
+ }
+ ],
+ "description": "Typed request matching kind. Field names, filters and dimensions use the existing analysis request contracts."
+ },
+ "format": {
+ "description": "Required for export; ignored for SQL.",
+ "enum": [
+ "csv",
+ "xlsx"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "request"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisSavedResultV1": {
+ "properties": {
+ "kind": {
+ "enum": [
+ "COLUMN_PROFILE",
+ "TABLE_PROFILE",
+ "PIVOT",
+ "COMPARE",
+ "CORRELATION",
+ "CROSSTAB",
+ "SHIFT"
+ ],
+ "type": "string"
+ },
+ "warnings": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "columnProfile": {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileV1",
+ "nullable": true
+ },
+ "compare": {
+ "$ref": "#/components/schemas/DataAnalysisCompareV1",
+ "nullable": true
+ },
+ "correlation": {
+ "$ref": "#/components/schemas/DataAnalysisCorrelationV1",
+ "nullable": true
+ },
+ "crosstab": {
+ "$ref": "#/components/schemas/DataAnalysisCrosstabV1",
+ "nullable": true
+ },
+ "pivot": {
+ "$ref": "#/components/schemas/DataAnalysisPivotV1",
+ "nullable": true
+ },
+ "shift": {
+ "$ref": "#/components/schemas/DataAnalysisShiftV1",
+ "nullable": true
+ },
+ "tableProfile": {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileV1",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisScatterRequestV1": {
+ "properties": {
+ "tableName": {
+ "description": "Table for the scatter link; route parameter takes precedence.",
+ "nullable": true,
+ "type": "string"
+ },
+ "exact": {
+ "description": "Compatibility flag; scatter always returns the bounded sample.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Current-user query filter; record locks and core field rules apply.",
+ "nullable": true
+ },
+ "xField": {
+ "description": "FULL numeric field on the x axis.",
+ "type": "string"
+ },
+ "yField": {
+ "description": "FULL numeric field on the y axis.",
+ "type": "string"
+ },
+ "limit": {
+ "description": "Maximum sample points (1 to 2000, default 2000) or kept crosstab categories per axis (1 to 20, default 20).",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "xField",
+ "yField"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisScatterV1": {
+ "properties": {
+ "n": {
+ "description": "Pairwise non-null population count; null when privacy suppresses it.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "sampleSize": {
+ "description": "Number of displayed paired records.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "sampling": {
+ "description": "Sampling method; core query currently uses a deterministic primary-key prefix.",
+ "nullable": true,
+ "type": "string"
+ },
+ "points": {
+ "description": "Points.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPointV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "trend": {
+ "$ref": "#/components/schemas/DataAnalysisTrendLineV1",
+ "description": "Least-squares slope, intercept and r fitted to the displayed sample.",
+ "nullable": true
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Semantic series; category comparisons are grouped and category time series are stacked.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSeriesV1": {
+ "nullable": true,
+ "properties": {
+ "name": {
+ "description": "Name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "points": {
+ "description": "Points.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisPointV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisShiftBucketV1": {
+ "properties": {
+ "value": {
+ "description": "Value.",
+ "nullable": true
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "complete": {
+ "description": "True when the calendar bucket end has passed in the session timezone.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "metrics": {
+ "description": "Typed metrics with exact population drills unless privacy suppresses them.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisShiftRequestV1": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Current-user query filter; record locks and core field rules apply.",
+ "nullable": true
+ },
+ "field": {
+ "description": "FULL field whose distribution is compared over time.",
+ "type": "string"
+ },
+ "dateField": {
+ "description": "FULL DATE or DATE_TIME field for session-timezone calendar buckets.",
+ "type": "string"
+ },
+ "bucket": {
+ "description": "Calendar unit: HOUR, DAY, WEEK, MONTH, QUARTER or YEAR; default MONTH.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "field",
+ "dateField"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisShiftV1": {
+ "properties": {
+ "buckets": {
+ "description": "Buckets.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisShiftBucketV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "psi": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Population stability index, null when inapplicable; zero shares are floored at 0.000001.",
+ "nullable": true
+ },
+ "sentence": {
+ "description": "Plain-language result or reason the statistic is not applicable.",
+ "nullable": true,
+ "type": "string"
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Semantic series; category comparisons are grouped and category time series are stacked.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSignificanceV1": {
+ "properties": {
+ "test": {
+ "description": "Test.",
+ "nullable": true,
+ "type": "string"
+ },
+ "statistic": {
+ "description": "Statistic.",
+ "nullable": true,
+ "type": "number"
+ },
+ "df": {
+ "description": "Degrees of freedom; null when undefined.",
+ "nullable": true,
+ "type": "number"
+ },
+ "pValue": {
+ "description": "Two-sided p-value; p >= 0.05 is never significant.",
+ "nullable": true,
+ "type": "number"
+ },
+ "applicable": {
+ "description": "Whether all test validity and privacy requirements hold.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sentence": {
+ "description": "Plain-language result or reason the statistic is not applicable.",
+ "nullable": true,
+ "type": "string"
+ },
+ "cramersV": {
+ "description": "Cramer association strength computed on the pooled contingency table; null when invalid.",
+ "nullable": true,
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisSqlV1": {
+ "properties": {
+ "available": {
+ "type": "boolean"
+ },
+ "note": {
+ "type": "string"
+ },
+ "sql": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisStarV1": {
+ "properties": {
+ "starred": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisStartRunRequestV1": {
+ "additionalProperties": false,
+ "properties": {
+ "operation": {
+ "description": "COLUMN_PROFILE or TABLE_PROFILE.",
+ "enum": [
+ "COLUMN_PROFILE",
+ "TABLE_PROFILE"
+ ],
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Table name.",
+ "type": "string"
+ },
+ "request": {
+ "description": "Profile parameters for the selected operation, without tableName.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileRequestV1"
+ },
+ {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileRequestV1"
+ }
+ ]
+ }
+ },
+ "required": [
+ "operation",
+ "tableName",
+ "request"
+ ],
+ "type": "object"
+ },
+ "DataAnalysisTableProfileRequestV1": {
+ "additionalProperties": false,
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints."
+ },
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisTableProfileV1": {
+ "nullable": true,
+ "properties": {
+ "tableName": {
+ "description": "Table name.",
+ "nullable": true,
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Core QueryFilter JSON, identical to the table query and count endpoints.",
+ "nullable": true
+ },
+ "estimate": {
+ "description": "True when statistics describe a sample rather than the entire filtered population.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "truncated": {
+ "description": "True when the row limit prevented a complete scan.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "rowsScanned": {
+ "description": "Number of source rows included in computation.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "asOf": {
+ "description": "As of.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "dataVersion": {
+ "description": "Data version.",
+ "nullable": true,
+ "type": "string"
+ },
+ "warnings": {
+ "description": "Warnings.",
+ "items": {
+ "type": "string"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "rowCount": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1",
+ "description": "Row count.",
+ "nullable": true
+ },
+ "fields": {
+ "description": "Readable fields to include; omit for all analyzable fields on a table profile.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisFieldSummaryV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "heatmap": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "Heatmap.",
+ "nullable": true
+ },
+ "candidateKeys": {
+ "description": "Candidate keys.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisCandidateKeyV1"
+ },
+ "nullable": true,
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisTextProfileV1": {
+ "nullable": true,
+ "properties": {
+ "metrics": {
+ "description": "Metrics.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisMetricV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "histogram": {
+ "description": "Histogram.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "patterns": {
+ "description": "Patterns.",
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisValueCountV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "sampleRows": {
+ "description": "Actual number of rows in the sample, not an extrapolated count.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisTrendLineV1": {
+ "properties": {
+ "slope": {
+ "description": "Slope.",
+ "nullable": true,
+ "type": "number"
+ },
+ "intercept": {
+ "description": "Intercept.",
+ "nullable": true,
+ "type": "number"
+ },
+ "r": {
+ "description": "Pearson correlation; null for insufficient data, zero variance or privacy suppression.",
+ "nullable": true,
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisValueCountV1": {
+ "nullable": true,
+ "properties": {
+ "value": {
+ "description": "Value.",
+ "nullable": true,
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "nullable": true,
+ "type": "object"
+ }
+ ]
+ },
+ "label": {
+ "description": "Label.",
+ "nullable": true,
+ "type": "string"
+ },
+ "count": {
+ "description": "Count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "share": {
+ "description": "Share as a 0..1 ratio rounded to six decimals.",
+ "nullable": true,
+ "type": "number"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "description": "Open the matching records using this table and QueryFilter; null when suppressed.",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisWatchBucketV1": {
+ "properties": {
+ "start": {
+ "description": "Calendar date or hour-start instant in the user's time zone.",
+ "type": "string"
+ },
+ "value": {
+ "nullable": true,
+ "type": "number"
+ },
+ "categories": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisWatchPreviewV1": {
+ "properties": {
+ "series": {
+ "items": {
+ "$ref": "#/components/schemas/DataAnalysisWatchBucketV1"
+ },
+ "type": "array"
+ },
+ "chart": {
+ "$ref": "#/components/schemas/DataAnalysisChartV1",
+ "description": "TIME_SERIES with baseline band annotations."
+ },
+ "verdict": {
+ "$ref": "#/components/schemas/DataAnalysisWatchVerdictV1"
+ }
+ },
+ "type": "object"
+ },
+ "DataAnalysisWatchVerdictV1": {
+ "properties": {
+ "evaluated": {
+ "description": "False for insufficient history or privacy suppression; must not resolve an alert.",
+ "type": "boolean"
+ },
+ "firing": {
+ "type": "boolean"
+ },
+ "value": {
+ "nullable": true,
+ "type": "number"
+ },
+ "baseline": {
+ "nullable": true,
+ "type": "number"
+ },
+ "baselineLow": {
+ "nullable": true,
+ "type": "number"
+ },
+ "baselineHigh": {
+ "nullable": true,
+ "type": "number"
+ },
+ "message": {
+ "type": "string"
+ },
+ "drill": {
+ "$ref": "#/components/schemas/DataAnalysisDrillV1",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "EdiAckV1": {
+ "description": "Concatenated acknowledgement previews; type is 997, 999, TA1, CONTRL, NONE or MIXED. text is null for PHI.",
+ "properties": {
+ "text": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiAssociationV1": {
+ "description": "Direct QQQ association and its target fields.",
+ "properties": {
+ "fields": {
+ "items": {
+ "$ref": "#/components/schemas/EdiFieldV1"
+ },
+ "type": "array"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "table": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiDiffV1": {
+ "description": "Only differing records are returned. Both lists are empty for PHI.",
+ "properties": {
+ "againstExpected": {
+ "items": {
+ "$ref": "#/components/schemas/EdiDifferenceV1"
+ },
+ "type": "array"
+ },
+ "againstPreviousRevision": {
+ "items": {
+ "$ref": "#/components/schemas/EdiDifferenceV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiDifferenceV1": {
+ "description": "One document comparison; documentIndex is zero based.",
+ "properties": {
+ "after": {
+ "additionalProperties": true,
+ "nullable": true,
+ "type": "object"
+ },
+ "before": {
+ "description": "Expected JSON or a previous mapped record.",
+ "nullable": true
+ },
+ "documentIndex": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "EdiElementV1": {
+ "description": "Element or composite component; codes contain at most 200 active codes in lexical order.",
+ "properties": {
+ "codeListId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "codes": {
+ "items": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "component": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "id": {
+ "nullable": true,
+ "type": "string"
+ },
+ "maxLength": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "minLength": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "position": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "type": {
+ "nullable": true,
+ "type": "string"
+ },
+ "usage": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiErrorV1": {
+ "description": "Deprecated since 1.1.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiFieldV1": {
+ "description": "QQQ target field metadata.",
+ "properties": {
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "possibleValueSourceName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "required": {
+ "type": "boolean"
+ },
+ "type": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiFindingV1": {
+ "description": "Value-free diagnostic. PHI messages are generic; only positions and codes are retained.",
+ "properties": {
+ "code": {
+ "nullable": true,
+ "type": "string"
+ },
+ "elementPosition": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "loopId": {
+ "nullable": true,
+ "type": "string"
+ },
+ "message": {
+ "nullable": true,
+ "type": "string"
+ },
+ "segmentId": {
+ "nullable": true,
+ "type": "string"
+ },
+ "segmentPosition": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "severity": {
+ "nullable": true,
+ "type": "string"
+ },
+ "snipLevel": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "EdiGuideTreeV1": {
+ "description": "Ordered guide tree. Root segments are outside loops; nested loops retain parent scope.",
+ "properties": {
+ "loops": {
+ "items": {
+ "$ref": "#/components/schemas/EdiLoopV1"
+ },
+ "type": "array"
+ },
+ "segments": {
+ "items": {
+ "$ref": "#/components/schemas/EdiSegmentV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiLoopV1": {
+ "description": "Guide loop, nested within its parent; repeat is the maximum occurrence count.",
+ "properties": {
+ "id": {
+ "nullable": true,
+ "type": "string"
+ },
+ "loops": {
+ "items": {
+ "$ref": "#/components/schemas/EdiLoopV1"
+ },
+ "type": "array"
+ },
+ "repeat": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "segments": {
+ "items": {
+ "$ref": "#/components/schemas/EdiSegmentV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiParseV1": {
+ "description": "Counts of wire interchanges, groups and documents.",
+ "properties": {
+ "documents": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "groups": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "interchanges": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "EdiPreviewRequestV1": {
+ "description": "mapId is required. Supply exactly one of sampleId or sampleBase64. Uploads are at most 5 MiB decoded, stored encrypted. ruleOverrides replaces the whole rule set in memory. CURRENT (default) uses the newest active guide in the pinned guide family; ORIGINAL uses the pinned guide.",
+ "properties": {
+ "guideRevision": {
+ "enum": [
+ "CURRENT",
+ "ORIGINAL"
+ ],
+ "nullable": true,
+ "type": "string"
+ },
+ "mapId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "ruleOverrides": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRuleV1"
+ },
+ "nullable": true,
+ "type": "array"
+ },
+ "sampleBase64": {
+ "format": "byte",
+ "maxLength": 6990508,
+ "nullable": true,
+ "type": "string"
+ },
+ "sampleId": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "sampleName": {
+ "maxLength": 255,
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiPreviewV1": {
+ "description": "Parse, validate, acknowledge and map without target writes. PHI suppresses result, ack text, and both diffs.",
+ "properties": {
+ "ack": {
+ "$ref": "#/components/schemas/EdiAckV1"
+ },
+ "diff": {
+ "$ref": "#/components/schemas/EdiDiffV1"
+ },
+ "findings": {
+ "items": {
+ "$ref": "#/components/schemas/EdiFindingV1"
+ },
+ "type": "array"
+ },
+ "parse": {
+ "$ref": "#/components/schemas/EdiParseV1"
+ },
+ "phiSuppressed": {
+ "type": "boolean"
+ },
+ "result": {
+ "$ref": "#/components/schemas/EdiResultV1",
+ "nullable": true
+ }
+ },
+ "type": "object"
+ },
+ "EdiRecordV1": {
+ "description": "Field values and recursively associated records. Values use the target table field types.",
+ "properties": {
+ "associations": {
+ "additionalProperties": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRecordV1"
+ },
+ "type": "array"
+ },
+ "type": "object"
+ },
+ "values": {
+ "additionalProperties": true,
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "EdiResultV1": {
+ "description": "Mapped records in document order; no target writes.",
+ "properties": {
+ "records": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRecordV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiRuleErrorsV1": {
+ "description": "Correlate errors using zero-based index, optional id and sequence.",
+ "properties": {
+ "errors": {
+ "items": {
+ "nullable": true,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "id": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "index": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "sequence": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "EdiRuleV1": {
+ "description": "Map rule. id is optional for unsaved rules. transformArgs is a JSON object encoded as a string, as in core table CRUD.",
+ "properties": {
+ "condition": {
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultValue": {
+ "nullable": true,
+ "type": "string"
+ },
+ "ediPath": {
+ "nullable": true,
+ "type": "string"
+ },
+ "id": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "qqqPath": {
+ "nullable": true,
+ "type": "string"
+ },
+ "required": {
+ "nullable": true,
+ "type": "boolean"
+ },
+ "sequence": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "transform": {
+ "nullable": true,
+ "type": "string"
+ },
+ "transformArgs": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiSegmentV1": {
+ "description": "Segment definition in guide sequence order.",
+ "properties": {
+ "elements": {
+ "items": {
+ "$ref": "#/components/schemas/EdiElementV1"
+ },
+ "type": "array"
+ },
+ "id": {
+ "nullable": true,
+ "type": "string"
+ },
+ "max": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "min": {
+ "nullable": true,
+ "type": "integer"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ },
+ "position": {
+ "nullable": true,
+ "type": "string"
+ },
+ "usage": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiTargetV1": {
+ "description": "Target metadata visible to the caller, current rules and registered transforms.",
+ "properties": {
+ "associations": {
+ "items": {
+ "$ref": "#/components/schemas/EdiAssociationV1"
+ },
+ "type": "array"
+ },
+ "fields": {
+ "items": {
+ "$ref": "#/components/schemas/EdiFieldV1"
+ },
+ "type": "array"
+ },
+ "rules": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRuleV1"
+ },
+ "type": "array"
+ },
+ "table": {
+ "nullable": true,
+ "type": "string"
+ },
+ "transforms": {
+ "items": {
+ "$ref": "#/components/schemas/EdiTransformV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiTransformV1": {
+ "description": "Registered transform and JSON Schema describing its string-valued arguments.",
+ "properties": {
+ "argumentSchema": {
+ "additionalProperties": true,
+ "description": "JSON Schema: type, properties, required and additionalProperties. All transform arguments are strings.",
+ "type": "object"
+ },
+ "name": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EdiValidateRequestV1": {
+ "description": "rules is required and may be empty; rules are never persisted.",
+ "properties": {
+ "rules": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRuleV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "EdiValidationV1": {
+ "description": "One result per submitted rule, including rules with no errors.",
+ "properties": {
+ "rules": {
+ "items": {
+ "$ref": "#/components/schemas/EdiRuleErrorsV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchErrorV1": {
+ "description": "Deprecated since 1.1.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "description": "Framework error message.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchIndexStatusV1": {
+ "properties": {
+ "countsCheckedAt": {
+ "description": "Saved validation completion; null when validation counts are unavailable.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "documentCount": {
+ "description": "Saved validation document count, else last indexing run count; not live.",
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "enabled": {
+ "description": "Whether this index is enabled.",
+ "nullable": false,
+ "type": "boolean"
+ },
+ "lastError": {
+ "description": "Persisted indexing error; null when absent.",
+ "nullable": true,
+ "type": "string"
+ },
+ "lastSuccessfulSync": {
+ "description": "Newest successful basepull/full-reindex/reconcile watermark.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "realTimeErrorCount": {
+ "description": "Persisted real-time indexing error count.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "sourceCount": {
+ "description": "Source count from saved IndexValidator report; null without validation.",
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "status": {
+ "description": "Persisted indexing state, such as ACTIVE or NEEDS_REINDEX.",
+ "nullable": true,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Indexed source table metadata name.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchStatusV1": {
+ "properties": {
+ "activeShards": {
+ "description": "Cluster health counter; null when unavailable.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "backlogTruncated": {
+ "description": "Counts are lower bounds when more than 1000 backlog rows exist.",
+ "nullable": false,
+ "type": "boolean"
+ },
+ "checkedAt": {
+ "description": "Snapshot completion time; remains unchanged on cache hits.",
+ "format": "date-time",
+ "nullable": false,
+ "type": "string"
+ },
+ "clusterHealth": {
+ "description": "OpenSearch health color; null when unknown.",
+ "nullable": true,
+ "type": "string"
+ },
+ "clusterReachable": {
+ "description": "Whether OpenSearch answered; null when not probed.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "exhausted": {
+ "description": "Exhausted failed events, from the same bounded backlog read.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "homeHref": {
+ "description": "Quick Search home link, including the configured metadata prefix.",
+ "nullable": false,
+ "type": "string"
+ },
+ "indexes": {
+ "description": "At most 100 persisted index rows, ordered by id.",
+ "items": {
+ "$ref": "#/components/schemas/QuickSearchIndexStatusV1"
+ },
+ "type": "array"
+ },
+ "indexingPaused": {
+ "description": "Indexing is paused; search can still serve.",
+ "nullable": true,
+ "type": "boolean"
+ },
+ "lastError": {
+ "description": "Last known indexing/search error or snapshot failure; null when absent.",
+ "nullable": true,
+ "type": "string"
+ },
+ "lastSuccessfulSync": {
+ "description": "Newest successful indexing watermark; not a guarantee all tables are current.",
+ "format": "date-time",
+ "nullable": true,
+ "type": "string"
+ },
+ "nodes": {
+ "description": "Cluster health counter; null when unavailable.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "pending": {
+ "description": "Pending and awaiting-reindex failed events, from at most 1000 backlog rows.",
+ "nullable": true,
+ "type": "integer"
+ },
+ "state": {
+ "description": "Overall availability; incomplete diagnostics are DEGRADED.",
+ "enum": [
+ "OK",
+ "DEGRADED",
+ "DOWN",
+ "DISABLED"
+ ],
+ "nullable": false,
+ "type": "string"
+ },
+ "tablesTruncated": {
+ "description": "More than 100 index rows exist.",
+ "nullable": false,
+ "type": "boolean"
+ },
+ "unassignedShards": {
+ "description": "Cluster health counter; null when unavailable.",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchSuggestGroupV1": {
+ "nullable": false,
+ "properties": {
+ "hasMore": {
+ "description": "An extra accessible item was found in the bounded batch. False does not prove the index has no further matches.",
+ "nullable": false,
+ "type": "boolean"
+ },
+ "items": {
+ "description": "At most limitPerTable accessible items in per-table relevance order.",
+ "items": {
+ "$ref": "#/components/schemas/QuickSearchSuggestItemV1"
+ },
+ "nullable": false,
+ "type": "array"
+ },
+ "tableLabel": {
+ "description": "Source table label, falling back to its metadata name.",
+ "nullable": false,
+ "type": "string"
+ },
+ "tableName": {
+ "description": "Source table metadata name.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchSuggestItemV1": {
+ "nullable": false,
+ "properties": {
+ "label": {
+ "description": "Filtered record label, falling back to tableLabel #recordId when blank.",
+ "nullable": false,
+ "type": "string"
+ },
+ "recordId": {
+ "description": "Source record primary key.",
+ "nullable": false,
+ "type": "string"
+ },
+ "subtitle": {
+ "description": "Already-filtered result subtitle; null when absent.",
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "QuickSearchSuggestV1": {
+ "nullable": false,
+ "properties": {
+ "groups": {
+ "description": "Readable tables ordered by best accessible score; at most maxTables.",
+ "items": {
+ "$ref": "#/components/schemas/QuickSearchSuggestGroupV1"
+ },
+ "nullable": false,
+ "type": "array"
+ },
+ "query": {
+ "description": "Search term after trimming and collapsing whitespace.",
+ "nullable": false,
+ "type": "string"
+ },
+ "truncated": {
+ "description": "More tables had accessible hits than maxTables.",
+ "nullable": false,
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataBreakGlassV1": {
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "expiresAt": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "scope": {
+ "nullable": true,
+ "type": "string"
+ },
+ "ceiling": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataErrorV1": {
+ "description": "Deprecated since 1.1.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataRevealAllowanceV1": {
+ "properties": {
+ "tableName": {
+ "type": "string"
+ },
+ "fieldName": {
+ "type": "string"
+ },
+ "remainingDailyAllowance": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataRevealOptionsResponseV1": {
+ "properties": {
+ "reasonOptions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "allowFreeTextReason": {
+ "type": "boolean"
+ },
+ "requireFreeText": {
+ "type": "boolean"
+ },
+ "revealMinutes": {
+ "type": "integer"
+ },
+ "remainingDailyAllowance": {
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataRevealRequestV1": {
+ "description": "tableName, primaryKey and fieldName are required. Supply a policy reason or allowed free text; maximum 500 characters.",
+ "properties": {
+ "tableName": {
+ "type": "string"
+ },
+ "fieldName": {
+ "type": "string"
+ },
+ "primaryKey": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ],
+ "description": "Record primary key (string or number)."
+ },
+ "reason": {
+ "maxLength": 500,
+ "nullable": true,
+ "type": "string"
+ },
+ "reasonText": {
+ "maxLength": 500,
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataRevealResponseV1": {
+ "properties": {
+ "value": {
+ "description": "Authorized raw field value.",
+ "nullable": true
+ },
+ "displayValue": {
+ "nullable": true,
+ "type": "string"
+ },
+ "expiresAt": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "revealId": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SecuredDataStatusResponseV1": {
+ "properties": {
+ "breakGlass": {
+ "$ref": "#/components/schemas/SecuredDataBreakGlassV1",
+ "nullable": true
+ },
+ "revealsUsedToday": {
+ "type": "integer"
+ },
+ "revealAllowances": {
+ "items": {
+ "$ref": "#/components/schemas/SecuredDataRevealAllowanceV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchBackendV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "vendor": {
+ "nullable": true,
+ "type": "string"
+ },
+ "dialect": {
+ "$ref": "#/components/schemas/SqlWorkbenchDialectV1"
+ },
+ "readOnlyCredentials": {
+ "type": "boolean"
+ },
+ "readOnlyEnforced": {
+ "type": "boolean"
+ },
+ "transactionalDdl": {
+ "type": "boolean"
+ },
+ "writeAllowed": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchBinaryValueV1": {
+ "properties": {
+ "$binary": {
+ "type": "boolean"
+ },
+ "length": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "hexPreview": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchCancelledV1": {
+ "properties": {
+ "cancelled": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchCapabilitiesV1": {
+ "properties": {
+ "version": {
+ "type": "string"
+ },
+ "canWrite": {
+ "type": "boolean"
+ },
+ "canShare": {
+ "type": "boolean"
+ },
+ "writeModeEnabled": {
+ "type": "boolean"
+ },
+ "limits": {
+ "$ref": "#/components/schemas/SqlWorkbenchLimitsV1"
+ },
+ "backends": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchBackendV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchCellV1": {
+ "properties": {
+ "cellKey": {
+ "type": "string"
+ },
+ "cellType": {
+ "type": "string"
+ },
+ "title": {
+ "nullable": true,
+ "type": "string"
+ },
+ "content": {
+ "type": "string"
+ },
+ "backendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sortOrder": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchColumnKindV1": {
+ "enum": [
+ "number",
+ "string",
+ "boolean",
+ "date",
+ "datetime",
+ "time",
+ "json",
+ "binary",
+ "array",
+ "other"
+ ],
+ "type": "string"
+ },
+ "SqlWorkbenchColumnV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "typeName": {
+ "type": "string"
+ },
+ "jdbcType": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "kind": {
+ "$ref": "#/components/schemas/SqlWorkbenchColumnKindV1"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchDatabaseSchemaV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "tables": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchSchemaTableV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchDeletedV1": {
+ "properties": {
+ "deleted": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchDialectV1": {
+ "enum": [
+ "postgresql",
+ "mysql",
+ "sqlite",
+ "h2",
+ "sql"
+ ],
+ "type": "string"
+ },
+ "SqlWorkbenchEmptyRequestV1": {
+ "type": "object"
+ },
+ "SqlWorkbenchErrorV1": {
+ "description": "Deprecated since 1.1.0: errors use BasicErrorResponseV1.",
+ "properties": {
+ "error": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchExecuteRequestV1": {
+ "properties": {
+ "backendName": {
+ "type": "string"
+ },
+ "sql": {
+ "type": "string"
+ },
+ "params": {
+ "$ref": "#/components/schemas/SqlWorkbenchParametersV1"
+ },
+ "mode": {
+ "type": "string"
+ },
+ "notebookId": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "cellKey": {
+ "nullable": true,
+ "type": "string"
+ },
+ "pageSize": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "confirmToken": {
+ "nullable": true,
+ "type": "string"
+ },
+ "acknowledgeRowGuard": {
+ "type": "boolean"
+ },
+ "executionUuid": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchExecutionV1": {
+ "properties": {
+ "executionUuid": {
+ "type": "string"
+ },
+ "status": {
+ "$ref": "#/components/schemas/SqlWorkbenchStatusV1"
+ },
+ "mode": {
+ "type": "string"
+ },
+ "backendName": {
+ "type": "string"
+ },
+ "durationMs": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "statements": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchStatementV1"
+ },
+ "type": "array"
+ },
+ "columns": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchColumnV1"
+ },
+ "type": "array"
+ },
+ "rows": {
+ "$ref": "#/components/schemas/SqlWorkbenchRowsDataV1"
+ },
+ "rowCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "hasMore": {
+ "type": "boolean"
+ },
+ "truncated": {
+ "type": "boolean"
+ },
+ "truncatedReason": {
+ "nullable": true,
+ "type": "string"
+ },
+ "rowsAffected": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "error": {
+ "type": "string"
+ },
+ "sqlState": {
+ "nullable": true,
+ "type": "string"
+ },
+ "dryRunSupported": {
+ "type": "boolean"
+ },
+ "dryRunNote": {
+ "nullable": true,
+ "type": "string"
+ },
+ "totalAffectedRows": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "rowGuardExceeded": {
+ "type": "boolean"
+ },
+ "rowGuardLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "confirmToken": {
+ "type": "string"
+ },
+ "expiresAt": {
+ "type": "string"
+ },
+ "previewAffectedRows": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "actualAffectedRows": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchExplainRequestV1": {
+ "properties": {
+ "backendName": {
+ "type": "string"
+ },
+ "sql": {
+ "type": "string"
+ },
+ "params": {
+ "$ref": "#/components/schemas/SqlWorkbenchParametersV1"
+ },
+ "analyze": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchExplainV1": {
+ "properties": {
+ "executionUuid": {
+ "type": "string"
+ },
+ "status": {
+ "$ref": "#/components/schemas/SqlWorkbenchStatusV1"
+ },
+ "mode": {
+ "type": "string"
+ },
+ "backendName": {
+ "type": "string"
+ },
+ "dialect": {
+ "$ref": "#/components/schemas/SqlWorkbenchDialectV1"
+ },
+ "analyze": {
+ "type": "boolean"
+ },
+ "plan": {
+ "$ref": "#/components/schemas/SqlWorkbenchPlanNodeV1"
+ },
+ "raw": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "sqlState": {
+ "nullable": true,
+ "type": "string"
+ },
+ "durationMs": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchExportFileV1": {
+ "format": "binary",
+ "type": "string"
+ },
+ "SqlWorkbenchExportJsonV1": {
+ "description": "Rows keyed by unique column labels, with duplicate labels suffixed.",
+ "items": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SqlWorkbenchValueV1"
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "SqlWorkbenchFreeObjectV1": {
+ "additionalProperties": true,
+ "type": "object"
+ },
+ "SqlWorkbenchHistoryEntryV1": {
+ "properties": {
+ "executionUuid": {
+ "type": "string"
+ },
+ "backendName": {
+ "type": "string"
+ },
+ "mode": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "sqlText": {
+ "type": "string"
+ },
+ "notebookId": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "cellKey": {
+ "nullable": true,
+ "type": "string"
+ },
+ "startTime": {
+ "nullable": true,
+ "type": "string"
+ },
+ "durationMs": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "rowsReturned": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "rowsAffected": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "errorMessage": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchHistoryV1": {
+ "properties": {
+ "executions": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchHistoryEntryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchLimitsV1": {
+ "properties": {
+ "maxRows": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "pageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxPageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxResultBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "statementTimeoutSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "writeStatementTimeoutSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxAffectedRowsWithoutAcknowledgement": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxAffectedRows": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxSqlLength": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "maxStatementsPerRun": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebookContentV1": {
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultBackendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "parameters": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookParameterV1"
+ },
+ "type": "array"
+ },
+ "cells": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchCellV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebookParameterV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "defaultValue": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebookRequestV1": {
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultBackendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "parameters": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookParameterV1"
+ },
+ "type": "array"
+ },
+ "cells": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchCellV1"
+ },
+ "type": "array"
+ },
+ "comment": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebookSummaryV1": {
+ "properties": {
+ "id": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "visibility": {
+ "type": "string"
+ },
+ "ownerUserId": {
+ "type": "string"
+ },
+ "ownerName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultBackendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "currentVersion": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "canEdit": {
+ "type": "boolean"
+ },
+ "createDate": {
+ "nullable": true,
+ "type": "string"
+ },
+ "modifyDate": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebookV1": {
+ "properties": {
+ "id": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "nullable": true,
+ "type": "string"
+ },
+ "visibility": {
+ "type": "string"
+ },
+ "ownerUserId": {
+ "type": "string"
+ },
+ "ownerName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "defaultBackendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "currentVersion": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "canEdit": {
+ "type": "boolean"
+ },
+ "createDate": {
+ "nullable": true,
+ "type": "string"
+ },
+ "modifyDate": {
+ "nullable": true,
+ "type": "string"
+ },
+ "parameters": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookParameterV1"
+ },
+ "type": "array"
+ },
+ "cells": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchCellV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchNotebooksV1": {
+ "properties": {
+ "notebooks": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookSummaryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchParametersV1": {
+ "additionalProperties": {},
+ "description": "Named SQL parameter values. JSON decimals are parsed exactly as BigDecimal.",
+ "type": "object"
+ },
+ "SqlWorkbenchPlanNodeV1": {
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "detail": {
+ "nullable": true,
+ "type": "string"
+ },
+ "startupCost": {
+ "nullable": true,
+ "type": "number"
+ },
+ "totalCost": {
+ "nullable": true,
+ "type": "number"
+ },
+ "planRows": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "actualTimeMs": {
+ "nullable": true,
+ "type": "number"
+ },
+ "actualRows": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "loops": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ },
+ "extra": {
+ "$ref": "#/components/schemas/SqlWorkbenchFreeObjectV1"
+ },
+ "children": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchPlanNodeV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchPublishRequestV1": {
+ "properties": {
+ "shared": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchQqqFieldV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sqlName": {
+ "type": "string"
+ },
+ "type": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchQqqTableV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "sqlName": {
+ "type": "string"
+ },
+ "fields": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchQqqFieldV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchRowsDataV1": {
+ "items": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchValueV1"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "SqlWorkbenchRowsV1": {
+ "properties": {
+ "executionUuid": {
+ "type": "string"
+ },
+ "columns": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchColumnV1"
+ },
+ "type": "array"
+ },
+ "rows": {
+ "$ref": "#/components/schemas/SqlWorkbenchRowsDataV1"
+ },
+ "offset": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "rowCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "truncated": {
+ "type": "boolean"
+ },
+ "truncatedReason": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSchemaColumnV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "typeName": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSchemaTableV1": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "columns": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchSchemaColumnV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSchemaV1": {
+ "properties": {
+ "backendName": {
+ "type": "string"
+ },
+ "dialect": {
+ "$ref": "#/components/schemas/SqlWorkbenchDialectV1"
+ },
+ "schemas": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchDatabaseSchemaV1"
+ },
+ "type": "array"
+ },
+ "truncated": {
+ "type": "boolean"
+ },
+ "keywords": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "functions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "qqqTables": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchQqqTableV1"
+ },
+ "type": "array"
+ },
+ "cachedAt": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSnapshotRequestV1": {
+ "properties": {
+ "executionUuid": {
+ "type": "string"
+ },
+ "cellKey": {
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSnapshotResultV1": {
+ "properties": {
+ "columns": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchColumnV1"
+ },
+ "type": "array"
+ },
+ "rows": {
+ "$ref": "#/components/schemas/SqlWorkbenchRowsDataV1"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSnapshotV1": {
+ "properties": {
+ "id": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cellKey": {
+ "nullable": true,
+ "type": "string"
+ },
+ "executionUuid": {
+ "nullable": true,
+ "type": "string"
+ },
+ "label": {
+ "nullable": true,
+ "type": "string"
+ },
+ "backendName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "rowCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "truncated": {
+ "type": "boolean"
+ },
+ "createDate": {
+ "nullable": true,
+ "type": "string"
+ },
+ "result": {
+ "$ref": "#/components/schemas/SqlWorkbenchSnapshotResultV1"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchSnapshotsV1": {
+ "properties": {
+ "snapshots": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchSnapshotV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchStatementKindV1": {
+ "enum": [
+ "READ",
+ "EXPLAIN_ANALYZE",
+ "WRITE",
+ "DDL",
+ "FORBIDDEN"
+ ],
+ "type": "string"
+ },
+ "SqlWorkbenchStatementV1": {
+ "properties": {
+ "index": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "kind": {
+ "$ref": "#/components/schemas/SqlWorkbenchStatementKindV1"
+ },
+ "leadingKeyword": {
+ "nullable": true,
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ },
+ "affectedRows": {
+ "format": "int64",
+ "nullable": true,
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchStatusV1": {
+ "enum": [
+ "SUCCEEDED",
+ "FAILED",
+ "TIMED_OUT",
+ "CANCELLED",
+ "REJECTED",
+ "PREVIEW",
+ "DRIFTED"
+ ],
+ "type": "string"
+ },
+ "SqlWorkbenchValueV1": {
+ "anyOf": [
+ {
+ "nullable": true,
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "$ref": "#/components/schemas/SqlWorkbenchBinaryValueV1"
+ },
+ {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchValueV1"
+ },
+ "type": "array"
+ },
+ {
+ "$ref": "#/components/schemas/SqlWorkbenchFreeObjectV1"
+ }
+ ],
+ "description": "JSON-safe JDBC value; null, scalar, binary preview, nested array or vendor JSON object."
+ },
+ "SqlWorkbenchVersionSummaryV1": {
+ "properties": {
+ "versionNumber": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "savedByName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "comment": {
+ "nullable": true,
+ "type": "string"
+ },
+ "createDate": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchVersionV1": {
+ "properties": {
+ "versionNumber": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "savedByName": {
+ "nullable": true,
+ "type": "string"
+ },
+ "comment": {
+ "nullable": true,
+ "type": "string"
+ },
+ "createDate": {
+ "type": "string"
+ },
+ "notebook": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookContentV1"
+ }
+ },
+ "type": "object"
+ },
+ "SqlWorkbenchVersionsV1": {
+ "properties": {
+ "versions": {
+ "items": {
+ "$ref": "#/components/schemas/SqlWorkbenchVersionSummaryV1"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "securitySchemes": {
+ "sessionUuidCookie": {
+ "description": "The session cookie set by POST /qqq/v1/manageSession (web clients).",
+ "in": "cookie",
+ "name": "sessionUUID",
+ "type": "apiKey"
+ },
+ "bearerAuth": {
+ "bearerFormat": "JWT or session UUID",
+ "description": "`Authorization: Bearer `, where the token is either\n- an OAuth2 access token (a signed JWT) issued by the app's identity provider to the app's client,\n or to its native client (`values.nativeClientId` in GET /qqq/v1/metaData/authentication), for\n example from the device-authorization grant or auth-code + PKCE. It is verified against the\n provider's keys (issuer, audience, expiry, signature) and gives the same user and permissions\n as signing in on the web. When it expires (401), refresh it at the provider and retry; or\n- a session UUID returned by POST /qqq/v1/manageSession, which the server keeps refreshed.",
+ "scheme": "bearer",
+ "type": "http"
+ },
+ "oauth2": {
+ "description": "The app's OAuth2 / OpenID Connect provider. The real endpoints come from the provider's discovery\ndocument: `{values.baseUrl}.well-known/openid-configuration`, with values from\nGET /qqq/v1/metaData/authentication. Native clients use `values.nativeClientId` (a public client)\nwith auth-code + PKCE (loopback or custom-scheme redirect URI registered at the provider) or the\ndevice-authorization grant (`device_authorization_endpoint`, RFC 8628), then send the access token\nas `Authorization: Bearer`.",
+ "flows": {
+ "authorizationCode": {
+ "authorizationUrl": "/authorize",
+ "scopes": {
+ "email": "Email address",
+ "offline_access": "A refresh token, to renew the access token without signing in again",
+ "openid": "OpenID Connect sign-in",
+ "profile": "Name, username and groups (permissions come from the groups)"
+ },
+ "tokenUrl": "/token"
+ }
+ },
+ "type": "oauth2"
+ }
+ }
+ },
+ "info": {
+ "contact": {
+ "email": "contact@kingsrook.com"
+ },
+ "description": "## Intro\nThis is the definition of the standard API implemented by QQQ Middleware.\n\nDevelopers of QQQ Frontends (e.g., javascript libraries, or native applications) use this API to access\na QQQ Backend server.\n\nAs such, this API itself is not concerned with any of the application-level details of any particular\napplication built using QQQ. Instead, this API is all about the generic endpoints used for any application\nbuilt on QQQ. For example, many endpoints work with a `${table}` path parameter - whose possible values\nare defined by the application - but which are not known to this API.\n\n## Flow\nThe typical flow of a user (as implemented in a frontend that utilizes this API) looks like:\n1. Frontend calls `.../metaData/authentication`, to know what type of authentication provider is used by the backend, and display an appropriate UI to the user for authenticating.\n2. User authenticates in frontend, as required for the authentication provider.\n3. Frontend calls `.../manageSession`, providing authentication details (e.g., an accessToken or other credentials) to the backend.\n4. The response from the `manageSession` call (assuming success), sets the `sessionUUID` Cookie, which should be included in all subsequent requests for authentication.\n5. After the user is authenticated, the frontend calls `.../metaData`, to discover the apps, tables, processes, etc, that the application is made up of (and that the authenticated user has permission to access).\n6. As the user interacts with apps, tables, process, etc, the frontend utilizes the appropriate endpoints as required.\n\n## Client channel\nEvery request should name its client in the `X-QQQ-Client` header: `channel[/detail]`, e.g. `next-ui`, `cli`,\nor `assistant/` (the accepted channels are listed by `GET .../version`; an unknown one is refused with 400).\nThe channel is recorded in audits. It is attribution only: the actor is always the signed-in user, and a channel\nnever grants anything - but some objects are denied to some channels (e.g. the AI assistant can never see its own\nconfiguration, identity and permission administration, audits, API keys or secrets), exactly as if the user had\nno permission for them.\n",
+ "title": "QQQ Middleware API",
+ "version": "1.6.0",
+ "x-qqq-extensions": [
+ {
+ "name": "esb",
+ "version": "1.1.0",
+ "description": "ESB overview, the ESB of tables and processes, and messages and dead letters on destinations."
+ },
+ {
+ "name": "health",
+ "version": "1.1.0",
+ "description": "Central health summary, components, history and on-demand checks."
+ },
+ {
+ "name": "alerts",
+ "version": "1.2.0",
+ "description": "Alerts inbox and record panel"
+ },
+ {
+ "name": "assistant",
+ "version": "1.3.0",
+ "description": "QQQ Assistant: conversations, streamed turns, feedback, pending actions and data access explanations"
+ },
+ {
+ "name": "collaboration",
+ "version": "1.1.0",
+ "description": "Record collaboration: favorites, recents, attachments, tags, conversations, following, timeline, people and presence"
+ },
+ {
+ "name": "data-analysis",
+ "version": "1.5.0",
+ "description": "Profiles, pivots, comparisons, distribution shifts, correlations, scatter samples, crosstabs and anomaly watch previews as the signed-in user."
+ },
+ {
+ "name": "edi",
+ "version": "1.1.0",
+ "description": "EDI sandbox and mapper, using the signed-in user's permissions."
+ },
+ {
+ "name": "quick-search",
+ "version": "1.1.0",
+ "description": "Quick Search administration and suggestions"
+ },
+ {
+ "name": "secured-data",
+ "version": "1.1.0",
+ "description": "Reveal grants and break-glass status"
+ },
+ {
+ "name": "sql-workbench",
+ "version": "1.1.0",
+ "description": "Audited SQL execution and notebooks"
+ }
+ ]
+ },
+ "openapi": "3.0.3",
+ "paths": {
+ "/qqq/v1/version": {
+ "get": {
+ "description": "Describes the semantic version of this UI API (MAJOR.MINOR.PATCH, where MAJOR matches the URL\nversion), the optional core features the server supports, and the extensions (modules and qbits)\nregistered on it, each with its own semantic version.\n\nA client should call this first, before authentication, and stop with a clear message when\napiVersion is outside the range it supports. Not secured.",
+ "operationId": "getVersion",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Server with one extension": {
+ "value": {
+ "apiVersion": "1.1.0",
+ "basePath": "/qqq/v1",
+ "extensions": [
+ {
+ "description": "ESB overview, destinations, messages and dead letters",
+ "name": "esb",
+ "pathPrefix": "/esb",
+ "version": "1.0.0"
+ }
+ ],
+ "features": [
+ "recordSearch",
+ "tableVariants",
+ "version"
+ ],
+ "supportedMajorVersions": [
+ 1
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/VersionResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "Get the UI API version",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/realtime/stream": {
+ "get": {
+ "description": "SSE invalidation hints. Each event has id :, an event name and JSON data. hello identifies the connection; comment pings maintain it. Last-Event-ID replays retained events on the same pod and session, otherwise resync asks clients to refetch. Core event payloads use the Realtime*EventV1 components. job.progress uses RealtimeJobProgressEventV1; an advancing logSeq tells clients to poll the job log. Qbits publish through RealtimeBus with their own event names, such as presence.changed and comment.added, described by RealtimeEventV1. Subscriptions require a separate POST; session-ended closes the stream and channel-revoked removes a subscription.",
+ "operationId": "openRealtimeStream",
+ "parameters": [
+ {
+ "description": "Last received : cursor.",
+ "in": "header",
+ "name": "Last-Event-ID",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "text/event-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/RealtimeEventV1"
+ }
+ }
+ },
+ "description": "Realtime named events and comment heartbeats."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Open the realtime event stream",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/realtime/subscriptions": {
+ "post": {
+ "description": "Add or remove record:{table}:{pk}, table:{table}, user:me, or instance channels. Records require a permission-checked GetAction and tables require READ. Refusals give no reason. The connection must belong to the authenticated session; otherwise 404. Active user channels are returned as user:me. Channel limits apply.",
+ "operationId": "updateRealtimeSubscriptions",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "add": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "connectionId": {
+ "type": "string"
+ },
+ "remove": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RealtimeSubscriptionResponseV1"
+ }
+ }
+ },
+ "description": "Current subscriptions and refused additions."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Malformed subscription request."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Connection not found."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Change realtime subscriptions",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/metaData/authentication": {
+ "get": {
+ "description": "For a frontend to determine which authentication provider or mechanism to use, it should begin its lifecycle\nby requesting this metaData object, and inspecting the `type` property in the response.\n\nNote that this endpoint is not secured, as its purpose is to be called as part of the workflow that results\nin a user being authenticated.",
+ "operationId": "getAuthenticationMetaData",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "For FULLY_ANONYMOUS type": {
+ "value": {
+ "name": "anonymous",
+ "type": "FULLY_ANONYMOUS"
+ }
+ },
+ "For AUTH_0 type": {
+ "value": {
+ "name": "auth0",
+ "type": "AUTH_0",
+ "values": {
+ "audience": "myapp.mydomain.com",
+ "baseUrl": "https://myapp.auth0.com/",
+ "clientId": "abcdefg1234567"
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/AuthenticationMetaDataResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "Get authentication metaData",
+ "tags": [
+ "Authentication"
+ ]
+ }
+ },
+ "/qqq/v1/branding/{role}": {
+ "get": {
+ "description": "The image the app declares for a branding role (`logo` or `icon`), from the application's\nstatic overlay, available before sign-in. 404 when the app declares none for the role, or\ndeclares a data: URI or an external URL (those are in `branding` of GET /metaData/authentication).\nSince 1.6.0.",
+ "operationId": "getBrandingAsset",
+ "parameters": [
+ {
+ "description": "logo or icon.",
+ "in": "path",
+ "name": "role",
+ "required": true,
+ "schema": {
+ "enum": [
+ "logo",
+ "icon"
+ ],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "image/*": {
+ "schema": {
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "description": "The image (png, jpeg, gif, webp, avif, ico or svg)."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "Get a branding image",
+ "tags": [
+ "Authentication"
+ ]
+ }
+ },
+ "/qqq/v1/manageSession": {
+ "post": {
+ "description": "After a frontend authenticates the user as per the requirements of the authentication provider specified by the\n`type` field in the `metaData/authentication` response, data from that authentication provider should be posted\nto this endpoint, to create a session within the QQQ application.\n\nThe response object will include a session identifier (`uuid`) to authenticate the user in subsequent API calls.\n\nFor the `TABLE_BASED` type, send the user's credentials in an `Authorization: Basic` header (base64 of\n`username:password`, UTF-8); the body may be empty. The password is verified against the user table and a\nsession row is stored; a `401` response means the credentials were refused.\n\nTo resume the session the browser already holds (for example after a page reload), post an empty object:\na request with no credentials and no `sessionUUID` resumes the session named by the `sessionUUID` cookie,\nwhich may be `HttpOnly`. That response carries the session's `values` but not its `uuid`; a `401`\nresponse means there is no valid session to resume.",
+ "operationId": "manageSession",
+ "parameters": [
+ {
+ "description": "For `TABLE_BASED` authentication: `Basic ` followed by the base64 encoding of `username:password` (UTF-8).\nNot used by other authentication types.",
+ "example": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
+ "in": "header",
+ "name": "Authorization",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "Data required to create the session. Specific needs may vary based on the AuthenticationModule type in the QQQ Backend.",
+ "properties": {
+ "accessToken": {
+ "description": "An access token from a downstream authentication provider (e.g., Auth0), to use as the basis for authentication and authorization.",
+ "type": "string"
+ },
+ "code": {
+ "description": "OAuth2 authorization code, for the backend to exchange with the identity provider (authorization-code + PKCE sign-in).",
+ "type": "string"
+ },
+ "codeVerifier": {
+ "description": "PKCE code verifier that goes with `code`.",
+ "type": "string"
+ },
+ "redirectUri": {
+ "description": "Redirect URI the authorization `code` was issued to.",
+ "type": "string"
+ },
+ "sessionUUID": {
+ "description": "UUID of an existing session, to resume it instead of signing in again. Omit it (and all credentials) to resume the session named by the sessionUUID cookie.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "With no custom values": {
+ "value": {
+ "uuid": "01234567-89AB-CDEF-0123-456789ABCDEF"
+ }
+ },
+ "With custom values": {
+ "value": {
+ "uuid": "98765432-10FE-DCBA-9876-543210FEDCBA",
+ "values": {
+ "region": "US",
+ "userCategoryId": 47
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ManageSessionResponseV1"
+ }
+ }
+ },
+ "description": "Successful response - session has been created"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Invalid token": {
+ "value": {
+ "error": "Unable to decode access token.",
+ "message": "Unable to decode access token."
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Authentication error - session was not created"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "Create a session",
+ "tags": [
+ "Authentication"
+ ]
+ }
+ },
+ "/qqq/v1/logout": {
+ "post": {
+ "description": "Invalidates the current session server-side, deleting it from the session store\nand clearing any cached data. The session cookie is also removed.\n\nFrontends should call this endpoint before performing client-side logout\n(clearing localStorage, redirecting to IdP logout, etc.) to ensure the\nsession cannot be resumed.",
+ "operationId": "logout",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Successful logout": {}
+ },
+ "schema": {
+ "$ref": "#/components/schemas/LogoutResponseV1"
+ }
+ }
+ },
+ "description": "Session has been invalidated"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "Logout and invalidate session",
+ "tags": [
+ "Authentication"
+ ]
+ }
+ },
+ "/qqq/v1/oidc/backchannel-logout": {
+ "post": {
+ "description": "Receives logout notifications from the Identity Provider (IdP) when a user\nlogs out from the IdP or another application in the SSO ecosystem.\n\nThe IdP sends a POST request with a 'logout_token' JWT parameter containing\neither a 'sub' (subject) or 'sid' (session ID) claim. QQQ validates the RS256\nsignature against the configured OAuth2 provider's discovered JWKS, issuer,\nclient audience, logout event and timestamps before deleting matching sessions\nfrom the configured session table. Both subject and session ID must match when\nboth are present. Invalid tokens or unsupported configuration return HTTP 400.\n\nThis endpoint should be registered with your IdP as the back-channel logout URI.",
+ "operationId": "oidcBackChannelLogout",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Successful logout": {}
+ },
+ "schema": {
+ "$ref": "#/components/schemas/BackChannelLogoutResponseV1"
+ }
+ }
+ },
+ "description": "Back-channel logout processed successfully"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "summary": "OIDC Back-Channel Logout",
+ "tags": [
+ "Authentication"
+ ]
+ }
+ },
+ "/qqq/v1/metaData": {
+ "get": {
+ "description": "Load the overall metadata, as is relevant to a frontend, for the entire application, with permissions applied, as per the\nauthenticated user.\n\nThis includes:\n- Apps (both as a map of name to AppMetaData (`apps`), but also as a tree (`appTree`), for presenting\nhierarchical navigation),\n- Tables (but without all details, e.g., fields),\n- Processes (also without full details, e.g., screens),\n- Reports\n- Widgets\n- Branding\n- Help Contents\n- Environment values\n",
+ "operationId": "getMetaData",
+ "parameters": [
+ {
+ "description": "Name of the frontend requesting the meta-data.\nGenerally a QQQ frontend library, unless a custom application frontend has been built.",
+ "example": "qqq-frontend-material-dashboard",
+ "in": "query",
+ "name": "frontendName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Version of the frontend requesting the meta-data.",
+ "example": "0.23.0",
+ "in": "query",
+ "name": "frontendVersion",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the application requesting the meta-data. e.g., an instance of a specific frontend\n(i.e., an application might be deployed with 2 different qqq-frontend-material-dashboard frontends,\nin which case this attribute allows differentiation between them).",
+ "example": "my-admin-web-app",
+ "in": "query",
+ "name": "applicationName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Version of the application requesting the meta-data.",
+ "example": "20241021",
+ "in": "query",
+ "name": "applicationVersion",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Example": {
+ "value": {
+ "appTree": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "icon": {
+ "name": "person_add",
+ "semanticName": "person-add"
+ },
+ "label": "Sample Person Process",
+ "name": "samplePersonProcess",
+ "type": "PROCESS"
+ }
+ ],
+ "icon": {
+ "name": "child_friendly"
+ },
+ "label": "Child App",
+ "name": "childApp",
+ "type": "APP"
+ },
+ {
+ "icon": {
+ "name": "person_outline"
+ },
+ "label": "Person",
+ "name": "person",
+ "type": "TABLE"
+ }
+ ],
+ "icon": {
+ "name": "home",
+ "semanticName": "home"
+ },
+ "label": "Home App",
+ "name": "homeApp",
+ "type": "APP"
+ }
+ ],
+ "apps": {
+ "homeApp": {
+ "childMap": {
+ "person": {
+ "icon": {
+ "name": "person_outline"
+ },
+ "label": "Person",
+ "name": "person",
+ "type": "TABLE"
+ },
+ "childApp": {
+ "icon": {
+ "name": "child_friendly"
+ },
+ "label": "Child App",
+ "name": "childApp",
+ "type": "APP"
+ }
+ },
+ "children": [
+ {
+ "icon": {
+ "name": "child_friendly"
+ },
+ "label": "Child App",
+ "name": "childApp",
+ "type": "APP"
+ },
+ {
+ "icon": {
+ "name": "person_outline"
+ },
+ "label": "Person",
+ "name": "person",
+ "type": "TABLE"
+ }
+ ],
+ "icon": {
+ "name": "home",
+ "semanticName": "home"
+ },
+ "label": "Home App",
+ "name": "homeApp",
+ "sections": [
+ {
+ "icon": {
+ "name": "badge"
+ },
+ "label": "Home App",
+ "name": "homeApp",
+ "tables": [
+ "person"
+ ]
+ }
+ ]
+ },
+ "childApp": {
+ "childMap": {
+ "samplePersonProcess": {
+ "icon": {
+ "name": "person_add",
+ "semanticName": "person-add"
+ },
+ "label": "Sample Person Process",
+ "name": "samplePersonProcess",
+ "type": "PROCESS"
+ }
+ },
+ "children": [
+ {
+ "icon": {
+ "name": "person_add",
+ "semanticName": "person-add"
+ },
+ "label": "Sample Person Process",
+ "name": "samplePersonProcess",
+ "type": "PROCESS"
+ }
+ ],
+ "icon": {
+ "name": "child_friendly"
+ },
+ "label": "Child App",
+ "name": "childApp",
+ "sections": [
+ {
+ "icon": {
+ "name": "badge"
+ },
+ "label": "Child App",
+ "name": "childApp",
+ "processes": [
+ "samplePersonProcess"
+ ]
+ }
+ ]
+ }
+ },
+ "metaDataGeneration": 0,
+ "processes": {
+ "person.bulkInsert": {
+ "durableJobAlways": false,
+ "durableJobEligible": false,
+ "hasPermission": true,
+ "icon": {
+ "name": "library_add",
+ "semanticName": "library-add"
+ },
+ "iconName": "library_add",
+ "iconSemanticName": "library-add",
+ "isHidden": true,
+ "label": "Person Bulk Insert",
+ "name": "person.bulkInsert",
+ "stepFlow": "LINEAR",
+ "tableName": "person"
+ },
+ "person.bulkEdit": {
+ "durableJobAlways": false,
+ "durableJobEligible": false,
+ "hasPermission": true,
+ "isHidden": true,
+ "label": "Person Bulk Edit",
+ "name": "person.bulkEdit",
+ "stepFlow": "LINEAR",
+ "tableName": "person"
+ },
+ "samplePersonProcess": {
+ "durableJobAlways": false,
+ "durableJobEligible": false,
+ "hasPermission": true,
+ "icon": {
+ "name": "person_add",
+ "semanticName": "person-add"
+ },
+ "iconName": "person_add",
+ "iconSemanticName": "person-add",
+ "isHidden": false,
+ "label": "Sample Person Process",
+ "name": "samplePersonProcess",
+ "stepFlow": "LINEAR",
+ "tableName": "person"
+ },
+ "person.bulkDelete": {
+ "durableJobAlways": false,
+ "durableJobEligible": false,
+ "hasPermission": true,
+ "isHidden": true,
+ "label": "Person Bulk Delete",
+ "name": "person.bulkDelete",
+ "stepFlow": "LINEAR",
+ "tableName": "person"
+ },
+ "person.bulkEditWithFile": {
+ "durableJobAlways": false,
+ "durableJobEligible": false,
+ "hasPermission": true,
+ "isHidden": true,
+ "label": "Person Bulk Edit With File",
+ "name": "person.bulkEditWithFile",
+ "stepFlow": "LINEAR",
+ "tableName": "person"
+ }
+ },
+ "tables": {
+ "person": {
+ "capabilities": [
+ "TABLE_COUNT",
+ "TABLE_GET",
+ "TABLE_QUERY",
+ "QUERY_STATS",
+ "TABLE_INSERT",
+ "TABLE_UPDATE",
+ "TABLE_DELETE",
+ "TABLE_EXPORT"
+ ],
+ "deletePermission": true,
+ "editPermission": true,
+ "icon": {
+ "name": "person_outline"
+ },
+ "insertPermission": true,
+ "isHidden": false,
+ "label": "Person",
+ "metaDataGeneration": 0,
+ "name": "person",
+ "readPermission": true
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/MetaDataResponseV1"
+ }
+ }
+ },
+ "description": "Overall metadata for the application."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get instance metaData",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/preferences": {
+ "get": {
+ "description": "Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.",
+ "operationId": "listPreferenceSections",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferencesResponseV1"
+ }
+ }
+ },
+ "description": "Current preferences for the session user"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List visible sections and the signed-in user's preferences",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/delivery/destinations": {
+ "get": {
+ "operationId": "listDeliveryDestinations",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DeliveryDestinationsResponseV1"
+ }
+ }
+ },
+ "description": "Delivery response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List authorized output destinations",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/delivery/destinations/{name}/targets": {
+ "post": {
+ "operationId": "chooseDeliveryTargets",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DeliveryTargetsRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DeliveryTargetStepResponseV1"
+ }
+ }
+ },
+ "description": "Delivery response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Describe the next delivery target",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/delivery/output/{logId}": {
+ "get": {
+ "operationId": "getDeliveryOutput",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "logId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/DeliveryOutputResponseV1"
+ }
+ }
+ },
+ "description": "Stored output; multiple attachments form a ZIP archive"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Download stored output as its owner or delivery administrator",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/preferences/{sectionName}": {
+ "get": {
+ "description": "Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.",
+ "operationId": "getPreferenceSection",
+ "parameters": [
+ {
+ "description": "Registered visible preference section name, from GET /preferences.",
+ "in": "path",
+ "name": "sectionName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferenceSectionV1"
+ }
+ }
+ },
+ "description": "Current preferences for the session user"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read one visible section for the signed-in user",
+ "tags": [
+ "General"
+ ]
+ },
+ "patch": {
+ "description": "Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.",
+ "operationId": "updatePreferenceSection",
+ "parameters": [
+ {
+ "description": "Registered visible preference section name, from GET /preferences.",
+ "in": "path",
+ "name": "sectionName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferenceSectionPatchRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferenceSectionV1"
+ }
+ }
+ },
+ "description": "Current preferences for the session user"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Partially update the signed-in user's preferences",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/preferences/{sectionName}/actions/{actionName}": {
+ "post": {
+ "description": "Runs a registered action for the authenticated session user. ROW actions target only rows loaded for that user and allowed by actionNames. Unknown actions or hidden sections return 404; invalid inputs return 400; unauthenticated requests return 401. Clients must confirm confirmationText before running. Secrets are shown once and must not be stored, logged, cached, or sent to analytics by clients. Responses use Cache-Control: no-store.",
+ "operationId": "runPreferenceSectionAction",
+ "parameters": [
+ {
+ "description": "Registered visible preference section name, from GET /preferences.",
+ "in": "path",
+ "name": "sectionName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Registered action name from the visible section.",
+ "in": "path",
+ "name": "actionName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferenceActionRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PreferenceActionResponseV1"
+ }
+ }
+ },
+ "description": "Current preferences for the session user"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run an action on the signed-in user's preferences",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/metaData/table/{tableName}": {
+ "get": {
+ "description": "Load the full metadata for a single table, including all fields, which a frontend\nneeds to display to users.",
+ "operationId": "getTableMetaData",
+ "parameters": [
+ {
+ "description": "Name of the table to load.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Example": {
+ "value": {
+ "tableMetaData": {
+ "capabilities": [
+ "TABLE_COUNT",
+ "TABLE_GET",
+ "TABLE_QUERY",
+ "QUERY_STATS",
+ "TABLE_INSERT",
+ "TABLE_UPDATE",
+ "TABLE_DELETE",
+ "TABLE_EXPORT"
+ ],
+ "clientCapabilities": {
+ "audits": {
+ "available": false,
+ "level": "NONE"
+ },
+ "bulkDelete": {
+ "available": true,
+ "processName": "person.bulkDelete"
+ },
+ "bulkEdit": {
+ "available": true,
+ "processName": "person.bulkEdit"
+ },
+ "bulkEditWithFile": {
+ "available": true,
+ "processName": "person.bulkEditWithFile"
+ },
+ "bulkInsert": {
+ "available": true,
+ "processName": "person.bulkInsert"
+ },
+ "savedViews": {
+ "available": false
+ }
+ },
+ "deletePermission": true,
+ "editPermission": true,
+ "fields": {
+ "id": {
+ "displayFormat": "%s",
+ "isEditable": true,
+ "isHeavy": false,
+ "isHidden": false,
+ "isRequired": false,
+ "label": "Id",
+ "name": "id",
+ "type": "INTEGER"
+ }
+ },
+ "hasRestrictedFields": false,
+ "icon": {
+ "name": "person_outline"
+ },
+ "insertPermission": true,
+ "isHidden": false,
+ "label": "Person",
+ "metaDataGeneration": 0,
+ "name": "person",
+ "primaryKeyField": "id",
+ "readPermission": true,
+ "sections": [
+ {
+ "fieldNames": [
+ "id"
+ ],
+ "hidden": false,
+ "icon": {
+ "name": "badge"
+ },
+ "label": "Identity",
+ "name": "identity",
+ "tier": "T1"
+ }
+ ],
+ "usesVariants": false
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableMetaDataResponseV1"
+ }
+ }
+ },
+ "description": "The full table metadata"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get table metaData",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/query": {
+ "post": {
+ "description": "Execute a query against a table, returning records that match a filter.",
+ "operationId": "queryTable",
+ "parameters": [
+ {
+ "description": "Name of the table to query.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "QueryFilter to specify matching records to be returned by the query"
+ },
+ "joins": {
+ "description": "QueryJoin objects to specify tables to be joined into the query",
+ "items": {
+ "$ref": "#/components/schemas/QueryJoin"
+ },
+ "type": "array"
+ },
+ "tableVariant": {
+ "$ref": "#/components/schemas/TableVariant",
+ "description": "For tables that use variant backends, specification of which variant to use."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "records": [
+ {
+ "displayValues": {
+ "id": "17",
+ "quantity": "1,000",
+ "storeId": "QQQ-Mart"
+ },
+ "recordLabel": "Item 17",
+ "tableName": "item",
+ "values": {
+ "id": 17,
+ "quantity": 1000,
+ "storeId": 42
+ }
+ }
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableQueryResponseV1"
+ }
+ }
+ },
+ "description": "The records matching query"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Query for records from a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/count": {
+ "post": {
+ "description": "Execute a query against a table, returning the number of records that match a filter.",
+ "operationId": "countTable",
+ "parameters": [
+ {
+ "description": "Name of the table to count.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Whether or not to also return the count distinct records from the main table (e.g., in case of a to-many join; by default, do not).",
+ "example": "true",
+ "in": "query",
+ "name": "includeDistinct",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "QueryFilter to specify matching records to be returned by the query"
+ },
+ "joins": {
+ "description": "QueryJoin objects to specify tables to be joined into the query",
+ "items": {
+ "$ref": "#/components/schemas/QueryJoin"
+ },
+ "type": "array"
+ },
+ "tableVariant": {
+ "$ref": "#/components/schemas/TableVariant",
+ "description": "For tables that use variant backends, specification of which variant to use."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "count": 42
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableCountResponseV1"
+ }
+ }
+ },
+ "description": "The number (count) of records matching the query"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Count records in a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/search": {
+ "post": {
+ "description": "Search for records whose search fields (declared per table in its meta-data, and listed as `searchFields` in the\ntable meta-data) match a search term. String fields match when they contain the term, ignoring case; integer\nfields match when they equal a numeric term. Only tables that the user has permission to read are searched,\nrecord security locks apply, and each table returns at most `limitPerTable` records (default 5, maximum 25), after skipping `offset` matches in each table (for paging one table). An instance may have a record search\nprovider (e.g., a search index) that searches some tables instead; if it fails, those tables are searched with\nthe default search, and the response's `provider` and `tables` say so.\n\nEach result can carry plain-text `highlights` of the fields that match (with the matched spans as character\noffsets - never markup), `details` (other search field values), `updatedAt` and, from a provider, a `score`.\nOnly fields the user may see are used. All of these, and `tables` and `provider`, are optional: clients must\ntolerate their absence.",
+ "operationId": "searchRecords",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "searchTerm": {
+ "description": "Text to search for (required; at most 100 characters after trimming).",
+ "example": "Kelkhoff",
+ "type": "string"
+ },
+ "tableNames": {
+ "description": "Optional list of table names to search. When omitted or empty, every table with search fields is searched.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "limitPerTable": {
+ "description": "Maximum number of records to return from each table.",
+ "type": "number"
+ },
+ "offset": {
+ "description": "Number of matches to skip in each table, for paging (default 0, maximum 1000). Mainly useful with one table in tableNames.",
+ "type": "number"
+ },
+ "sort": {
+ "description": "Order of the results within each table: RELEVANCE (default) or RECENT (most recently modified first, for tables with a last-modified field).",
+ "enum": [
+ "RELEVANCE",
+ "RECENT"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Matches in one table": {
+ "value": {
+ "provider": {
+ "status": "OK"
+ },
+ "results": [
+ {
+ "details": [
+ {
+ "displayValue": "Saint Louis",
+ "fieldLabel": "City",
+ "fieldName": "city"
+ }
+ ],
+ "highlights": [
+ {
+ "fieldLabel": "Email",
+ "fieldName": "email",
+ "matches": [
+ {
+ "end": 14,
+ "start": 6
+ }
+ ],
+ "text": "darin.kelkhoff@example.com"
+ }
+ ],
+ "recordId": "1",
+ "recordLabel": "Darin Kelkhoff",
+ "score": 7.25,
+ "tableLabel": "Person",
+ "tableName": "person",
+ "updatedAt": "2026-10-01T14:30:00Z"
+ },
+ {
+ "recordId": "2",
+ "recordLabel": "Tim Kelkhoff",
+ "score": 6.5,
+ "tableLabel": "Person",
+ "tableName": "person"
+ }
+ ],
+ "tables": [
+ {
+ "hasMore": true,
+ "resultCount": 2,
+ "source": "PROVIDER",
+ "tableLabel": "Person",
+ "tableName": "person",
+ "totalCount": 14
+ }
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/RecordSearchResponseV1"
+ }
+ }
+ },
+ "description": "The records matching the search term"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search records across tables",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/help/search": {
+ "get": {
+ "description": "Search help visible to the session. Label hits weigh 3, summary hits 2 and content hits 1. Stable ties sort by kind and key. Limit defaults to 20 and is capped at 50.",
+ "operationId": "searchHelp",
+ "parameters": [
+ {
+ "in": "query",
+ "name": "q",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "number"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HelpSearchResponseV1"
+ }
+ }
+ },
+ "description": "Help search results"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search visible application help",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/help/coverage": {
+ "get": {
+ "description": "Requires INSERT or EDIT permission on helpContent. Includes hidden targets. Totals reflect kind and parent scope before missingOnly is applied.",
+ "operationId": "getHelpCoverage",
+ "parameters": [
+ {
+ "in": "query",
+ "name": "kind",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "missingOnly",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "in": "query",
+ "name": "parentKey",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HelpCoverageResponseV1"
+ }
+ }
+ },
+ "description": "Help coverage results"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No INSERT or EDIT permission on helpContent"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Inspect application help coverage",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/variants": {
+ "get": {
+ "description": "List the variants a table's backend can be scoped to (for example one data set per store). Requires read\npermission on the table and on the backend's variant options table.",
+ "operationId": "listTableVariants",
+ "parameters": [
+ {
+ "description": "Name of the table whose variants to list.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "A table with variants": {
+ "value": {
+ "variants": [
+ {
+ "id": "1",
+ "name": "Main Street",
+ "type": "store"
+ }
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableVariantsResponseV1"
+ }
+ }
+ },
+ "description": "The variants the table can be scoped to."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List a table's backend variants",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/apis": {
+ "get": {
+ "description": "The application APIs (served by the API middleware beside this one) that expose the table, with each API's versions and the root-relative path of the table's OpenAPI document in each version. Empty when the application serves no APIs. The caller must be allowed to read the table.",
+ "operationId": "listTableApis",
+ "parameters": [
+ {
+ "description": "Name of the table.",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TableApisResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List the APIs that expose a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}": {
+ "delete": {
+ "description": "Delete a single record from a table, identified by its primary key value.",
+ "operationId": "deleteRecord",
+ "parameters": [
+ {
+ "description": "Name of the table to delete from.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record to delete.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "deletedRecordCount": 1
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableDeleteResponseV1"
+ }
+ }
+ },
+ "description": "The number of records that were deleted"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete a record from a table",
+ "tags": [
+ "Tables"
+ ]
+ },
+ "get": {
+ "description": "Fetch a single record from a table, identified by its primary key value.",
+ "operationId": "getRecord",
+ "parameters": [
+ {
+ "description": "Name of the table to get the record from.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record to get.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Whether or not to include associated records.",
+ "example": "true",
+ "in": "query",
+ "name": "includeAssociations",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "description": "JSON array of QueryJoin objects specifying tables to join into the get.",
+ "example": "[{\"joinTable\":\"orderLine\",\"select\":true}]",
+ "in": "query",
+ "name": "queryJoins",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "For tables that use variant backends, JSON object naming the variant to read from (the same `type` and `id` as in query requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "record": {
+ "displayValues": {
+ "id": "1",
+ "firstName": "Darin",
+ "lastName": "Kelkhoff"
+ },
+ "recordLabel": "Darin Kelkhoff",
+ "tableName": "person",
+ "values": {
+ "id": 1,
+ "firstName": "Darin",
+ "lastName": "Kelkhoff"
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableGetResponseV1"
+ }
+ }
+ },
+ "description": "The record matching the given primary key"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a record from a table by primary key",
+ "tags": [
+ "Tables"
+ ]
+ },
+ "patch": {
+ "description": "Update an existing record in a table, identified by its primary key. The request body should contain the field values to update.",
+ "operationId": "updateRecord",
+ "parameters": [
+ {
+ "description": "Optional optimistic version from the last read, encoded as a string in the version field's format (ISO-8601 for modify dates). A mismatch returns 409 RecordConflictV1 and leaves the record unchanged. Omit for an unconditional update. Tables with recordVersionField set to an empty string opt out.",
+ "in": "query",
+ "name": "expectedVersion",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the table containing the record to update.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record to update.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "JSON object with field names as keys and field values as values.",
+ "properties": {
+ "fieldName": {
+ "description": "Value for a field in the record. Repeat for each field to update.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "multipart/form-data": {
+ "schema": {
+ "description": "Form fields named for the record's fields (an empty field clears the value), a file for each blob field to set, and optionally an `associations` field: JSON of association name to a list of associated records. With the request header `X-QQQ-Association-Format: record-v1`, each associated record is `{\"values\": {...}, \"associations\": {...}}`, nested to any depth, and exactly one `associations` field is required.",
+ "properties": {
+ "fieldName": {
+ "description": "Value for a field in the record. Repeat for each field to set.",
+ "type": "string"
+ },
+ "associations": {
+ "description": "JSON object of association name to a list of associated records.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "record": {
+ "displayValues": {
+ "id": "1",
+ "firstName": "Darin",
+ "lastName": "Kelkhoff"
+ },
+ "recordLabel": "Darin Kelkhoff",
+ "tableName": "person",
+ "values": {
+ "id": 1,
+ "firstName": "Darin",
+ "lastName": "Kelkhoff"
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableUpdateResponseV1"
+ }
+ }
+ },
+ "description": "The record that was updated"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RecordConflictV1"
+ }
+ }
+ },
+ "description": "The record changed since it was read."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Update a record in a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/features": {
+ "get": {
+ "description": "Features and capabilities for a visible record, with optional summary provider contributions.",
+ "operationId": "getRecordFeatures",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RecordFeatureSummaryV1"
+ }
+ }
+ },
+ "description": "Record collaboration summary"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get record collaboration features",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/formAdjuster/{identifier}/{event}": {
+ "post": {
+ "description": "Run one of a table form's adjusters and return the changes to apply to the form. The identifier is `table:{tableName}` for the table's on-load adjuster, or a field's `formAdjusterIdentifier` (from its `materialDashboard` supplemental metadata) for that field's adjusters. The caller must be allowed to insert or edit records in the table. Answers 404 when the application registers no form adjusters.",
+ "operationId": "runFormAdjuster",
+ "parameters": [
+ {
+ "description": "Name of the table whose form is being adjusted.",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "`table:{tableName}`, or a field's `formAdjusterIdentifier`.",
+ "in": "path",
+ "name": "identifier",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Which adjuster to run.",
+ "in": "path",
+ "name": "event",
+ "required": true,
+ "schema": {
+ "enum": [
+ "onLoad",
+ "onChange"
+ ],
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "The form's state when the event fired.",
+ "properties": {
+ "fieldName": {
+ "description": "The field the event is for (field adjusters).",
+ "type": "string"
+ },
+ "newValue": {
+ "description": "The field's new value (field adjusters); sent to the adjuster as text."
+ },
+ "allValues": {
+ "additionalProperties": true,
+ "description": "Every value of the form, by field name.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FormAdjusterOutputV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run a form adjuster",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/apis/{apiName}/{version}/openapi": {
+ "get": {
+ "description": "The OpenAPI 3 document of the table in one version of an application API that exposes it (as listed by `GET /table/{tableName}/apis`). The caller must be allowed to read the table. Answers 404 when no API by that name exposes the table in that version.",
+ "operationId": "getTableApiDocument",
+ "parameters": [
+ {
+ "description": "Name of the table.",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The API's name (`name` in `GET /table/{tableName}/apis`).",
+ "in": "path",
+ "name": "apiName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The API version (`versions[].version`).",
+ "in": "path",
+ "name": "version",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/TableApiDocumentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a table's OpenAPI document in an application API",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}": {
+ "post": {
+ "description": "Insert a new record into a table. The request body should contain the field values for the new record.",
+ "operationId": "insertRecord",
+ "parameters": [
+ {
+ "description": "Name of the table to insert into.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "JSON object with field names as keys and field values as values.",
+ "properties": {
+ "fieldName": {
+ "description": "Value for a field in the record. Repeat for each field to set.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "multipart/form-data": {
+ "schema": {
+ "description": "Form fields named for the record's fields (an empty field clears the value), a file for each blob field to set, and optionally an `associations` field: JSON of association name to a list of associated records. With the request header `X-QQQ-Association-Format: record-v1`, each associated record is `{\"values\": {...}, \"associations\": {...}}`, nested to any depth, and exactly one `associations` field is required.",
+ "properties": {
+ "fieldName": {
+ "description": "Value for a field in the record. Repeat for each field to set.",
+ "type": "string"
+ },
+ "associations": {
+ "description": "JSON object of association name to a list of associated records.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "record": {
+ "displayValues": {
+ "id": "47",
+ "firstName": "New",
+ "lastName": "Person"
+ },
+ "recordLabel": "New Person",
+ "tableName": "person",
+ "values": {
+ "id": 47,
+ "firstName": "New",
+ "lastName": "Person"
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/TableInsertResponseV1"
+ }
+ }
+ },
+ "description": "The record that was inserted"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Insert a record into a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/query": {
+ "post": {
+ "description": "Lists one page of the picker's target records as the user may read them: the user's filter (the target table's own filter builder or a saved view), ANDed with the picker's filter (resolved from the parent record or form values) and the search term. Needs READ on the target table; table permissions, record security locks and field security locks apply as on the table query route. Reads limit + 1 rows for hasMore (no count). For MULTI_CHILD and LINK with a primaryKey, linkedIds says which returned records the parent already has rows for.",
+ "operationId": "queryRelatedRecordPicker",
+ "parameters": [
+ {
+ "description": "Name of the table that declares the picker (e.g. the order).",
+ "example": "sales_order",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the picker, from the table metadata's relatedRecordPickers.",
+ "example": "addSkus",
+ "in": "path",
+ "name": "pickerName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "primaryKey": {
+ "description": "Primary key of the parent record (required for MULTI_CHILD and LINK; for SINGLE, the record being edited, if any). Read with the user's own security.",
+ "type": "string"
+ },
+ "values": {
+ "description": "Current form values (SINGLE on a create form, when there is no primaryKey), for ${input.fieldName} variables in the picker's filters",
+ "type": "object"
+ },
+ "searchTerm": {
+ "description": "Case-insensitive text matched (contains) against the target table's search fields, or its record-label fields",
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "The user's filter on the target table (criteria and orderBys on target fields only); ANDed with the picker's filter"
+ },
+ "skip": {
+ "description": "Records to skip (offset paging)",
+ "type": "integer"
+ },
+ "limit": {
+ "description": "Records per page, 1 to 200 (default 50)",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RelatedRecordPickerQueryResponseV1"
+ }
+ }
+ },
+ "description": "Query the records a related-record picker offers: result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Query the records a related-record picker offers",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/prepare": {
+ "post": {
+ "description": "Builds, without saving, one child row per picked target: the picker's child field defaults, values copied from the target, and the parent and target keys. The client shows the reviewFieldNames of each row for the user to fill, then calls add. Needs INSERT on the child table; every target must be available through the picker's query (else 400).",
+ "operationId": "prepareRelatedRecordPicker",
+ "parameters": [
+ {
+ "description": "Name of the table that declares the picker (e.g. the order).",
+ "example": "sales_order",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the picker, from the table metadata's relatedRecordPickers.",
+ "example": "addSkus",
+ "in": "path",
+ "name": "pickerName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "primaryKey": {
+ "description": "Primary key of the parent record. Read with the user's own security.",
+ "type": "string"
+ },
+ "targetIds": {
+ "description": "Primary keys of the picked target records",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RelatedRecordPickerPrepareResponseV1"
+ }
+ }
+ },
+ "description": "Prepare child rows for picked records (MULTI_CHILD, LINK): result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Prepare child rows for picked records (MULTI_CHILD, LINK)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/add": {
+ "post": {
+ "description": "Inserts one row per picked target (targetIds) or per reviewed row (records), all or nothing, through the standard insert action: INSERT permission on the child table, record security locks, validation, customizers, automations and audit. Only the picker's review fields are taken from the client; the parent and target keys always come from the server. Every target must be available through the picker's query (else 400). Row errors are a 400 naming each row, and nothing is saved.",
+ "operationId": "addRelatedRecords",
+ "parameters": [
+ {
+ "description": "Name of the table that declares the picker (e.g. the order).",
+ "example": "sales_order",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the picker, from the table metadata's relatedRecordPickers.",
+ "example": "addSkus",
+ "in": "path",
+ "name": "pickerName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "primaryKey": {
+ "description": "Primary key of the parent record. Read with the user's own security.",
+ "type": "string"
+ },
+ "targetIds": {
+ "description": "Primary keys of the picked target records",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "records": {
+ "description": "Reviewed child rows (instead of targetIds), e.g. the prepare route's rows after the user filled the review fields",
+ "items": {
+ "properties": {
+ "values": {
+ "description": "The row's values: the childTargetFieldName (which target) and the picker's reviewFieldNames; other values are ignored, and the parent and target keys always come from the server",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RelatedRecordPickerAddResponseV1"
+ }
+ }
+ },
+ "description": "Add child or join rows for picked records (MULTI_CHILD, LINK): result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Add child or join rows for picked records (MULTI_CHILD, LINK)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/remove": {
+ "post": {
+ "description": "Deletes the parent's join rows for the given targets through the standard delete action (DELETE permission on the join table, record security locks, audit). Only for LINK pickers (else 400); child rows of a MULTI_CHILD picker are deleted with the table delete route.",
+ "operationId": "removeRelatedRecords",
+ "parameters": [
+ {
+ "description": "Name of the table that declares the picker (e.g. the order).",
+ "example": "sales_order",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the picker, from the table metadata's relatedRecordPickers.",
+ "example": "addSkus",
+ "in": "path",
+ "name": "pickerName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "primaryKey": {
+ "description": "Primary key of the parent record. Read with the user's own security.",
+ "type": "string"
+ },
+ "targetIds": {
+ "description": "Primary keys of the picked target records",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RelatedRecordPickerRemoveResponseV1"
+ }
+ }
+ },
+ "description": "Unlink picked records (LINK): result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Unlink picked records (LINK)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer": {
+ "get": {
+ "description": "Fetch a single record (with display values), along with each of its table's associated scripts:\nthe script type, the script that the record references (if any) with its revisions (newest first),\nand, for scripts that can be tested, the fields to test them with.\n\nRequires permission to read records from the table. If the record is not found, a 404 is returned.",
+ "operationId": "getRecordDeveloperMode",
+ "parameters": [
+ {
+ "description": "Name of the table that the record is in.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "associatedScripts": [
+ {
+ "associatedScript": {
+ "fieldName": "greetingScriptId",
+ "scriptTypeId": 1
+ },
+ "script": {
+ "recordLabel": "Darin Kelkhoff - Greeting",
+ "tableName": "script",
+ "values": {
+ "id": 7,
+ "name": "Darin Kelkhoff - Greeting",
+ "scriptTypeId": 1,
+ "currentScriptRevisionId": 12
+ }
+ },
+ "scriptRevisions": [
+ {
+ "tableName": "scriptRevision",
+ "values": {
+ "id": 12,
+ "scriptId": 7,
+ "sequenceNo": 2,
+ "commitMessage": "Say hello by name"
+ }
+ }
+ ],
+ "scriptType": {
+ "recordLabel": "Greeting",
+ "tableName": "scriptType",
+ "values": {
+ "id": 1,
+ "name": "Greeting"
+ }
+ },
+ "testInputFields": [
+ {
+ "displayFormat": "%s",
+ "isEditable": true,
+ "isHeavy": false,
+ "isHidden": false,
+ "isRequired": false,
+ "label": "Name",
+ "name": "name",
+ "type": "STRING"
+ }
+ ],
+ "testOutputFields": [
+ {
+ "displayFormat": "%s",
+ "isEditable": true,
+ "isHeavy": false,
+ "isHidden": false,
+ "isRequired": false,
+ "label": "Message",
+ "name": "message",
+ "type": "STRING"
+ }
+ ]
+ }
+ ],
+ "record": {
+ "displayValues": {
+ "id": "1",
+ "firstName": "Darin",
+ "greetingScriptId": "7"
+ },
+ "recordLabel": "Darin Kelkhoff",
+ "tableName": "person",
+ "values": {
+ "id": 1,
+ "firstName": "Darin",
+ "greetingScriptId": 7
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/RecordDeveloperModeResponseV1"
+ }
+ }
+ },
+ "description": "The record, with its table's associated scripts"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a record's associated scripts (developer mode)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/panels": {
+ "get": {
+ "description": "Fetch the panels shown on a record's developer view: one per developer panel provider (built in, or\nregistered by modules and qbits in the instance's developerPanels supplemental meta-data) that is available\nfor this table and record for the current user - for example record security, ESB events, quick search\nindexing, or SQL workbench queries.\n\nRequires permission to read records from the table, and the record must be visible under its record\nsecurity locks. If the record is not found, a 404 is returned. A provider that fails yields a panel\nwith an error message rather than failing the request.",
+ "operationId": "listRecordDeveloperPanels",
+ "parameters": [
+ {
+ "description": "Name of the table that the record is in.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "Record security": {
+ "value": {
+ "panels": [
+ {
+ "blocks": [
+ {
+ "columns": [
+ "Security key",
+ "Field",
+ "Scope",
+ "Null values",
+ "This record's value",
+ "Your access"
+ ],
+ "label": "Locks",
+ "rows": [
+ [
+ "store",
+ "storeId",
+ "READ_AND_WRITE",
+ "DENY",
+ "42",
+ "Your session has key value 42"
+ ]
+ ],
+ "type": "TABLE"
+ }
+ ],
+ "id": "recordSecurity",
+ "order": 150,
+ "statusLabel": "1 lock",
+ "statusTone": "SUCCESS",
+ "title": "Record Security"
+ }
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/RecordDeveloperPanelsResponseV1"
+ }
+ }
+ },
+ "description": "The record's developer panels"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a record's developer panels",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/associatedScript/{fieldName}": {
+ "post": {
+ "description": "Save new contents for the script that a record references in one of its table's associated script\nfields, as a new revision of that script. If the record does not yet reference a script, one is\ninserted (and the record is updated to reference it).\n\nRequires permission to edit records in the table.",
+ "operationId": "storeAssociatedScript",
+ "parameters": [
+ {
+ "description": "Name of the table that the record is in.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the associated script field (in the table) whose script is being stored.",
+ "example": "greetingScriptId",
+ "in": "path",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "contents": {
+ "description": "The script's new contents (its code).",
+ "example": "return (\"Hello, \" + input.getName());",
+ "type": "string"
+ },
+ "commitMessage": {
+ "description": "A message describing the change. If not given, a default message is used.",
+ "example": "Say hello by name",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "scriptId": 7,
+ "scriptName": "Darin Kelkhoff - Greeting",
+ "scriptRevisionId": 13,
+ "scriptRevisionSequenceNo": 3
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/RecordAssociatedScriptStoreResponseV1"
+ }
+ }
+ },
+ "description": "The script, and the revision that was stored"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Store a new revision of a record's associated script (developer mode)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/associatedScript/{fieldName}/{scriptRevisionId}/logs": {
+ "get": {
+ "description": "Fetch the logs (up to 100, newest first) of runs of a script revision, each with its log lines.\n\nRequires permission to read records from the table, and the record must exist (else a 404 is returned).",
+ "operationId": "getAssociatedScriptLogs",
+ "parameters": [
+ {
+ "description": "Name of the table that the record is in.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the associated script field (in the table) whose script the revision is of.",
+ "example": "greetingScriptId",
+ "in": "path",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Id of the script revision to get logs for.",
+ "example": "12",
+ "in": "path",
+ "name": "scriptRevisionId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {
+ "scriptLogRecords": [
+ {
+ "tableName": "scriptLog",
+ "values": {
+ "id": 101,
+ "scriptRevisionId": 12,
+ "startTimestamp": "2024-10-21T14:30:00Z",
+ "hadError": false,
+ "scriptLogLine": [
+ {
+ "tableName": "scriptLogLine",
+ "values": {
+ "id": 1001,
+ "scriptLogId": 101,
+ "timestamp": "2024-10-21T14:30:00Z",
+ "text": "Hello, Darin"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/RecordAssociatedScriptLogsResponseV1"
+ }
+ }
+ },
+ "description": "The script revision's logs"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get the logs of a record's associated script revision (developer mode)",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/possibleValues/{fieldName}": {
+ "post": {
+ "description": "Search for possible values associated with a field on a table.\nReturns a list of id/label pairs that match the given search criteria.",
+ "operationId": "searchTablePossibleValues",
+ "parameters": [
+ {
+ "description": "Name of the table containing the field.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the field whose possible values should be searched.",
+ "example": "partnerPersonId",
+ "in": "path",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "searchTerm": {
+ "description": "Text to search for within possible value labels",
+ "type": "string"
+ },
+ "ids": {
+ "description": "List of specific ids to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "values": {
+ "description": "Map of other field values, used for filter interpolation on possible value source filters",
+ "type": "object"
+ },
+ "useCase": {
+ "description": "Use case for possible value search filtering. Controls behavior when filter values are missing.",
+ "enum": [
+ "FORM",
+ "FILTER"
+ ],
+ "type": "string"
+ },
+ "labels": {
+ "description": "List of specific labels to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "processValues": {
+ "description": "Map of field values from the current process step, used for filter interpolation",
+ "type": "object"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Optional default filter to apply to the possible value search"
+ },
+ "picker": {
+ "description": "Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count)",
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key)"
+ },
+ "afterId": {
+ "description": "Keyset paging: the last option id of the previous page, when ordered by the primary key alone",
+ "type": "string"
+ },
+ "skip": {
+ "description": "Offset paging, for orderings other than the primary key",
+ "type": "integer"
+ },
+ "limit": {
+ "description": "Options per page (default: the picker's pageSize; at most 200)",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PossibleValuesResponseV1"
+ }
+ }
+ },
+ "description": "List of possible value options matching the search criteria."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search possible values for a table field",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/possibleValues/{fieldName}": {
+ "post": {
+ "description": "Search for possible values associated with an input field on a process.\nReturns a list of id/label pairs that match the given search criteria.",
+ "operationId": "searchProcessPossibleValues",
+ "parameters": [
+ {
+ "description": "Name of the process containing the field.",
+ "example": "greetInteractive",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the field whose possible values should be searched.",
+ "example": "partnerPersonId",
+ "in": "path",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "searchTerm": {
+ "description": "Text to search for within possible value labels",
+ "type": "string"
+ },
+ "ids": {
+ "description": "List of specific ids to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "values": {
+ "description": "Map of other field values, used for filter interpolation on possible value source filters",
+ "type": "object"
+ },
+ "useCase": {
+ "description": "Use case for possible value search filtering. Controls behavior when filter values are missing.",
+ "enum": [
+ "FORM",
+ "FILTER"
+ ],
+ "type": "string"
+ },
+ "labels": {
+ "description": "List of specific labels to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "processValues": {
+ "description": "Map of field values from the current process step, used for filter interpolation",
+ "type": "object"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Optional default filter to apply to the possible value search"
+ },
+ "picker": {
+ "description": "Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count)",
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key)"
+ },
+ "afterId": {
+ "description": "Keyset paging: the last option id of the previous page, when ordered by the primary key alone",
+ "type": "string"
+ },
+ "skip": {
+ "description": "Offset paging, for orderings other than the primary key",
+ "type": "integer"
+ },
+ "limit": {
+ "description": "Options per page (default: the picker's pageSize; at most 200)",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PossibleValuesResponseV1"
+ }
+ }
+ },
+ "description": "List of possible value options matching the search criteria."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search possible values for a process field",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/possibleValues/{possibleValueSourceName}": {
+ "post": {
+ "description": "Search for possible values from a standalone possible value source\n(not associated with a specific table or process field).\nReturns a list of id/label pairs that match the given search criteria.",
+ "operationId": "searchPossibleValues",
+ "parameters": [
+ {
+ "description": "Name of the possible value source to search.",
+ "example": "person",
+ "in": "path",
+ "name": "possibleValueSourceName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "searchTerm": {
+ "description": "Text to search for within possible value labels",
+ "type": "string"
+ },
+ "ids": {
+ "description": "List of specific ids to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "values": {
+ "description": "Map of other field values, used for filter interpolation on possible value source filters",
+ "type": "object"
+ },
+ "useCase": {
+ "description": "Use case for possible value search filtering. Controls behavior when filter values are missing.",
+ "enum": [
+ "FORM",
+ "FILTER"
+ ],
+ "type": "string"
+ },
+ "labels": {
+ "description": "List of specific labels to look up",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "processValues": {
+ "description": "Map of field values from the current process step, used for filter interpolation",
+ "type": "object"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Optional default filter to apply to the possible value search"
+ },
+ "picker": {
+ "description": "Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count)",
+ "properties": {
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key)"
+ },
+ "afterId": {
+ "description": "Keyset paging: the last option id of the previous page, when ordered by the primary key alone",
+ "type": "string"
+ },
+ "skip": {
+ "description": "Offset paging, for orderings other than the primary key",
+ "type": "integer"
+ },
+ "limit": {
+ "description": "Options per page (default: the picker's pageSize; at most 200)",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PossibleValuesResponseV1"
+ }
+ }
+ },
+ "description": "List of possible value options matching the search criteria."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search a standalone possible value source",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/widget/{widgetName}": {
+ "post": {
+ "description": "Render a widget by name, passing in query parameters as a JSON object in the request body.\nThe response shape varies by widget type.",
+ "operationId": "getWidgetData",
+ "parameters": [
+ {
+ "description": "Name of the widget to render.",
+ "example": "myWidget",
+ "in": "path",
+ "name": "widgetName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Dynamic inputs to pass to the widget renderer (e.g. the record id, dropdown selections). The same inputs may instead be sent as query parameters; a body value wins over a query parameter of the same name.",
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/WidgetData"
+ }
+ }
+ },
+ "description": "The rendered widget data itself (not wrapped): one of the WidgetData shapes, chosen by its `type`."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Render a widget",
+ "tags": [
+ "Widgets"
+ ]
+ }
+ },
+ "/qqq/v1/metaData/process/{processName}": {
+ "get": {
+ "description": "Load the full metadata for a single process, including all screens (aka, frontend steps), which a frontend\nneeds to display to users.",
+ "operationId": "getProcessMetaData",
+ "parameters": [
+ {
+ "description": "Name of the process to load.",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "TODO": {
+ "value": {}
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ProcessMetaDataResponseV1"
+ }
+ }
+ },
+ "description": "The full process metadata"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get process metaData",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/init": {
+ "post": {
+ "description": "For a user to start running a process, this endpoint should be called, to start the process\nand run its first step(s) (any backend steps before the first frontend step).\n\nAdditional process-specific values should posted in a form param named `values`, as JSON object\nwith keys defined by the process in question.\n\nFor a process which needs to operate on a set of records that a user selected, see\n`recordsParam`, and `recordIds` or `filterJSON`.\n\nThe response will include a `processUUID`, to be included in all subsequent requests relevant\nto the process.\n\nNote that this request, if it takes longer than a given threshold* to complete, will return a\na `jobUUID`, which should be sent to the `/processes/{processName}/{processUUID}/status/{jobUUID}`\nendpoint, to poll for a status update.\n\n*This threshold has a default value of 3,000 ms., but can be set per-request via the form\nparameter `stepTimeoutMillis`.\n",
+ "operationId": "initProcess",
+ "parameters": [
+ {
+ "description": "Name of the process to initialize",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "properties": {
+ "values": {
+ "description": "Process-specific field names and values.",
+ "type": "object"
+ },
+ "recordsParam": {
+ "description": "Specifies which other query-param will contain the indicator of initial records to pass in to the process.",
+ "examples": {
+ "recordIds": {
+ "value": "recordIds"
+ },
+ "filterJSON": {
+ "value": "recordIds"
+ }
+ },
+ "type": "string"
+ },
+ "recordIds": {
+ "description": "Comma-separated list of ids from the table this process is based on, to use as input records for the process. Needs `recordsParam=recordIds` value to be given as well.",
+ "examples": {
+ "one id": {
+ "value": "1701"
+ },
+ "multiple ids": {
+ "value": "42,47"
+ }
+ },
+ "type": "string"
+ },
+ "filterJSON": {
+ "description": "JSON encoded QQueryFilter object, to execute against the table this process is based on, to find input records for the process. Needs `recordsParam=filterJSON` value to be given as well.",
+ "examples": {
+ "empty filter (all records)": {
+ "value": "{}"
+ },
+ "filter by a condition": {
+ "value": "{\"criteria\":[{\"fieldName\":\"id\",\"operator\":\"LESS_THAN\",\"values\":[10]}],\"booleanOperator\":\"AND\"}"
+ }
+ },
+ "type": "string"
+ },
+ "stepTimeoutMillis": {
+ "description": "Optionally change the time that the server will wait for the job before letting it go asynchronous. Default value is 3000.",
+ "examples": {
+ "shorter timeout": {
+ "value": "500"
+ },
+ "longer timeout": {
+ "value": "60000"
+ }
+ },
+ "type": "integer"
+ },
+ "file": {
+ "description": "A file upload, for processes which expect to be initialized with an uploaded file.",
+ "format": "binary",
+ "type": "string"
+ },
+ "tableVariant": {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests). May also be given as a query parameter.",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "COMPLETE": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "reviewScreen",
+ "type": "COMPLETE"
+ }
+ },
+ "COMPLETE with metaDataAdjustment": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "inputScreen",
+ "processMetaDataAdjustment": {
+ "updatedFields": {
+ "someField": {
+ "isRequired": true,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "validation": {
+ "required": true
+ },
+ "isHidden": false
+ }
+ },
+ "updatedFrontendStepList": [
+ {
+ "components": [
+ {
+ "type": "EDIT_FORM"
+ }
+ ],
+ "name": "inputScreen",
+ "formFields": [
+ {
+ "isRequired": false,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "isHidden": false
+ }
+ ]
+ },
+ {
+ "components": [
+ {
+ "type": "PROCESS_SUMMARY_RESULTS"
+ }
+ ],
+ "name": "resultScreen"
+ }
+ ]
+ },
+ "type": "COMPLETE"
+ }
+ },
+ "JOB_STARTED": {
+ "value": {
+ "jobUUID": "98765432-10FE-DCBA-9876-543210FEDCBA",
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "JOB_STARTED"
+ }
+ },
+ "RUNNING": {
+ "value": {
+ "current": 47,
+ "total": 1701,
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING",
+ "message": "Processing person records"
+ }
+ },
+ "ERROR": {
+ "value": {
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING"
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ProcessStepResponseV1"
+ }
+ }
+ },
+ "description": "State of the initialization of the job, with different fields set, based on the\nstatus of the task."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Initialize a process",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/{processUUID}/step/{stepName}": {
+ "post": {
+ "description": "To run the next step in a process, this endpoint should be called, with the `processName`\nand existing `processUUID`, as well as the step that was just completed in the frontend,\ngiven as `stepName`.\n\nAdditional process-specific values should posted in a form param named `values`, as JSON object\nwith keys defined by the process in question.\n\nNote that this request, if it takes longer than a given threshold* to complete, will return a\na `jobUUID`, which should be sent to the `/processes/{processName}/{processUUID}/status/{jobUUID}`\nendpoint, to poll for a status update.\n\n*This threshold has a default value of 3,000 ms., but can be set per-request via the form\nparameter `stepTimeoutMillis`.\n",
+ "operationId": "stepProcess",
+ "parameters": [
+ {
+ "description": "Name of the process to perform the step in.",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Unique identifier for this run of the process - as was returned by the `init` call.",
+ "example": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "in": "path",
+ "name": "processUUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the frontend step that the user has just completed.",
+ "example": "inputForm",
+ "in": "path",
+ "name": "stepName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "properties": {
+ "values": {
+ "description": "Process-specific field names and values.",
+ "type": "object"
+ },
+ "stepTimeoutMillis": {
+ "description": "Optionally change the time that the server will wait for the job before letting it go asynchronous. Default value is 3000.",
+ "examples": {
+ "shorter timeout": {
+ "value": "500"
+ },
+ "longer timeout": {
+ "value": "60000"
+ }
+ },
+ "type": "integer"
+ },
+ "file": {
+ "description": "A file upload, for process steps which expect an uploaded file.",
+ "format": "binary",
+ "type": "string"
+ },
+ "tableVariant": {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests). May also be given as a query parameter.",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "COMPLETE": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "reviewScreen",
+ "type": "COMPLETE"
+ }
+ },
+ "COMPLETE with metaDataAdjustment": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "inputScreen",
+ "processMetaDataAdjustment": {
+ "updatedFields": {
+ "someField": {
+ "isRequired": true,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "validation": {
+ "required": true
+ },
+ "isHidden": false
+ }
+ },
+ "updatedFrontendStepList": [
+ {
+ "components": [
+ {
+ "type": "EDIT_FORM"
+ }
+ ],
+ "name": "inputScreen",
+ "formFields": [
+ {
+ "isRequired": false,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "isHidden": false
+ }
+ ]
+ },
+ {
+ "components": [
+ {
+ "type": "PROCESS_SUMMARY_RESULTS"
+ }
+ ],
+ "name": "resultScreen"
+ }
+ ]
+ },
+ "type": "COMPLETE"
+ }
+ },
+ "JOB_STARTED": {
+ "value": {
+ "jobUUID": "98765432-10FE-DCBA-9876-543210FEDCBA",
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "JOB_STARTED"
+ }
+ },
+ "RUNNING": {
+ "value": {
+ "current": 47,
+ "total": 1701,
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING",
+ "message": "Processing person records"
+ }
+ },
+ "ERROR": {
+ "value": {
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING"
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ProcessStepResponseV1"
+ }
+ }
+ },
+ "description": "State of the backend's running of the next step(s) of the job, with different fields set,\nbased on the status of the job."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run a step in a process",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/{processUUID}/status/{jobUUID}": {
+ "get": {
+ "description": "Get the status of a running job for a process.\n\nResponse is the same format as for an init or step call that completed synchronously.\n",
+ "operationId": "getProcessStatus",
+ "parameters": [
+ {
+ "description": "Name of the process that is being ran",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Unique identifier for this run of the process - as was returned by the `init` call.",
+ "example": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "in": "path",
+ "name": "processUUID",
+ "required": true,
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "description": "Unique identifier for the asynchronous job being executed, as returned by an `init` or `step` call that went asynch.",
+ "example": "98765432-10FE-DCBA-9876-543210FEDCBA",
+ "in": "path",
+ "name": "jobUUID",
+ "required": true,
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "COMPLETE": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "reviewScreen",
+ "type": "COMPLETE"
+ }
+ },
+ "COMPLETE with metaDataAdjustment": {
+ "value": {
+ "values": {
+ "firstLastName": "Aabramson",
+ "totalAge": 32768
+ },
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "nextStep": "inputScreen",
+ "processMetaDataAdjustment": {
+ "updatedFields": {
+ "someField": {
+ "isRequired": true,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "validation": {
+ "required": true
+ },
+ "isHidden": false
+ }
+ },
+ "updatedFrontendStepList": [
+ {
+ "components": [
+ {
+ "type": "EDIT_FORM"
+ }
+ ],
+ "name": "inputScreen",
+ "formFields": [
+ {
+ "isRequired": false,
+ "isEditable": true,
+ "name": "someField",
+ "displayFormat": "%s",
+ "type": "STRING",
+ "isHeavy": false,
+ "isHidden": false
+ }
+ ]
+ },
+ {
+ "components": [
+ {
+ "type": "PROCESS_SUMMARY_RESULTS"
+ }
+ ],
+ "name": "resultScreen"
+ }
+ ]
+ },
+ "type": "COMPLETE"
+ }
+ },
+ "JOB_STARTED": {
+ "value": {
+ "jobUUID": "98765432-10FE-DCBA-9876-543210FEDCBA",
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "JOB_STARTED"
+ }
+ },
+ "RUNNING": {
+ "value": {
+ "current": 47,
+ "total": 1701,
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING",
+ "message": "Processing person records"
+ }
+ },
+ "ERROR": {
+ "value": {
+ "processUUID": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "type": "RUNNING"
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ProcessStepResponseV1"
+ }
+ }
+ },
+ "description": "State of the backend's running of the specified job, with different fields set,\nbased on the status of the job."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get job status",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/{processUUID}/records": {
+ "get": {
+ "description": "Retrieve the records associated with a running or completed process, with support\nfor pagination via skip and limit query parameters.",
+ "operationId": "getProcessRecords",
+ "parameters": [
+ {
+ "description": "Name of the process",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Unique identifier for this run of the process",
+ "example": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "in": "path",
+ "name": "processUUID",
+ "required": true,
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "description": "Number of records to skip (default 0)",
+ "example": "0",
+ "in": "query",
+ "name": "skip",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Maximum number of records to return (default 20)",
+ "example": "20",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessRecordsResponseV1"
+ }
+ }
+ },
+ "description": "Paginated list of records from the process state."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get records from a process",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/{processUUID}/cancel": {
+ "post": {
+ "description": "Cancel a running process. If the process defines a cancel step, it will be executed.",
+ "operationId": "cancelProcess",
+ "parameters": [
+ {
+ "description": "Name of the process to cancel",
+ "example": "samplePersonProcess",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Unique identifier for this run of the process",
+ "example": "01234567-89AB-CDEF-0123-456789ABCDEF",
+ "in": "path",
+ "name": "processUUID",
+ "required": true,
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ },
+ {
+ "description": "For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).",
+ "example": "{\"type\":\"store\",\"id\":\"1\"}",
+ "in": "query",
+ "name": "tableVariant",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessCancelResponseV1"
+ }
+ }
+ },
+ "description": "Empty JSON object indicating successful cancellation."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Cancel a running process",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/processes/{processName}/jobs": {
+ "post": {
+ "description": "Launch an eligible process as a durable job: it survives pod restarts, runs in checkpointed chunks under leases, and can be paused, resumed, cancelled, restarted and retried with the job control processes on the jobs_job table. Values for the process's frontend steps are given up front. The job runs with the caller's permissions (never more). A launch from the assistant client channel waits for confirmation (status AWAITING_CONFIRMATION). Progress arrives as job.progress and job.status events on the realtime channel record:jobs_job:{jobId}.",
+ "operationId": "launchProcessJob",
+ "parameters": [
+ {
+ "description": "Name of the process to run as a job",
+ "example": "person.bulkEdit",
+ "in": "path",
+ "name": "processName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "The launch request.",
+ "properties": {
+ "values": {
+ "description": "Process values (what the frontend steps would have collected).",
+ "type": "object"
+ },
+ "filter": {
+ "description": "A records filter (QQueryFilter JSON) the process runs over.",
+ "type": "object"
+ },
+ "recordIds": {
+ "description": "Primary keys the process runs over.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "uploadRefs": {
+ "description": "Upload refs from POST /uploads.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "savedBulkLoadProfileId": {
+ "description": "A saved bulk load profile to load with.",
+ "type": "integer"
+ },
+ "profile": {
+ "description": "A bulk load profile (BulkLoadProfile v1 JSON) to load with.",
+ "type": "object"
+ },
+ "mode": {
+ "description": "EXECUTE (default) or VALIDATE (no store).",
+ "enum": [
+ "EXECUTE",
+ "VALIDATE"
+ ],
+ "type": "string"
+ },
+ "priority": {
+ "description": "0-9, default 5 (higher runs first).",
+ "type": "integer"
+ },
+ "notifyEmail": {
+ "description": "Email the owner when the job finishes.",
+ "type": "boolean"
+ },
+ "label": {
+ "description": "A label for the job (defaults to the process label).",
+ "type": "string"
+ },
+ "startAfterStep": {
+ "description": "The launch point: backend steps after this step run in the job.",
+ "type": "string"
+ },
+ "expectedRows": {
+ "description": "A known row count (e.g., from a count).",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProcessJobLaunchResponseV1"
+ }
+ }
+ },
+ "description": "The new job's id and status."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many jobs are waiting for this user (or for the assistant)."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run a process as a durable background job",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs": {
+ "get": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "listJobs",
+ "parameters": [
+ {
+ "description": "mine (default), or all (requires jobs_admin)",
+ "in": "query",
+ "name": "scope",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "active (default), recent, or all",
+ "in": "query",
+ "name": "state",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "1-200; default 50",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Optional process filter",
+ "in": "query",
+ "name": "processName",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobListResponseV1"
+ }
+ }
+ },
+ "description": "Job list result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: list",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs/{jobId}": {
+ "get": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "getJob",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "jobId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobDetailV1"
+ }
+ }
+ },
+ "description": "Job detail result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: detail",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs/{jobId}/progress": {
+ "get": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "getJobProgress",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "jobId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Last observed log id, default 0; response includes a twenty-id overlap",
+ "in": "query",
+ "name": "afterLogId",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "1-200 new lines, plus overlap; default 100",
+ "in": "query",
+ "name": "logLimit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobProgressPollV1"
+ }
+ }
+ },
+ "description": "Job progress result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: progress",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs/{jobId}/cancel": {
+ "post": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "cancelJob",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "jobId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobActionResponseV1"
+ }
+ }
+ },
+ "description": "Job cancel result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: cancel",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs/{jobId}/retry": {
+ "post": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "retryJob",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "jobId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobActionResponseV1"
+ }
+ }
+ },
+ "description": "Job retry result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: retry",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/jobs/track": {
+ "post": {
+ "description": "Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.",
+ "operationId": "trackJob",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobTrackRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/JobActionResponseV1"
+ }
+ }
+ },
+ "description": "Job track result"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Job not found or not visible"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid job transition"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Jobs: track",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/uploads": {
+ "post": {
+ "description": "Streams a file into the application's uploads storage and returns an opaque, expiring ref bound to the caller. Pass the ref in uploadRefs when launching a job (POST /processes/{processName}/jobs). Send multipart form data with one file field, or the raw file as the request body with the fileName query parameter.",
+ "operationId": "upload",
+ "parameters": [
+ {
+ "description": "The file's name, when the body is the raw file (not multipart).",
+ "example": "people.csv",
+ "in": "query",
+ "name": "fileName",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "description": "One file field.",
+ "properties": {
+ "file": {
+ "description": "The file.",
+ "format": "binary",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "application/octet-stream": {
+ "schema": {
+ "description": "The raw file (give its name in the fileName query parameter).",
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UploadRefResponseV1"
+ }
+ }
+ },
+ "description": "The upload's ref, name, size, content type and expiry."
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Upload a file for a job or a bulk load",
+ "tags": [
+ "Processes"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/export": {
+ "post": {
+ "description": "Export records from a table as a downloadable file in the specified format (CSV, XLSX, JSON, TSV).",
+ "operationId": "exportTable",
+ "parameters": [
+ {
+ "description": "Name of the table to export.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "format": {
+ "description": "Export format: csv, xlsx, json, tsv",
+ "type": "string"
+ },
+ "filename": {
+ "description": "Optional filename for the download. Generated if absent.",
+ "type": "string"
+ },
+ "filter": {
+ "$ref": "#/components/schemas/QueryFilter",
+ "description": "QueryFilter to specify matching records to export"
+ },
+ "fieldNames": {
+ "description": "Optional subset of field names to include in the export",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "limit": {
+ "description": "Optional maximum number of records to export",
+ "type": "integer"
+ },
+ "includeHeaderRow": {
+ "description": "Whether to include a header row (default true)",
+ "type": "boolean"
+ },
+ "tableVariant": {
+ "$ref": "#/components/schemas/TableVariant",
+ "description": "For tables that use variant backends, the variant to export from (the same `type` and `id` as in query requests)."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "description": "Binary file content in the requested export format"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Export records from a table",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/table/{tableName}/{primaryKey}/{fieldName}/{filename}": {
+ "get": {
+ "description": "Download the binary content of a blob field from a specific record.",
+ "operationId": "downloadRecordFieldFile",
+ "parameters": [
+ {
+ "description": "Name of the table containing the record.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Primary key value of the record.",
+ "example": "42",
+ "in": "path",
+ "name": "primaryKey",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the field to download.",
+ "example": "photo",
+ "in": "path",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Filename for the downloaded content.",
+ "example": "photo.jpg",
+ "in": "path",
+ "name": "filename",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "description": "Binary file content"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Download a field value from a record",
+ "tags": [
+ "Tables"
+ ]
+ }
+ },
+ "/qqq/v1/download/{file}": {
+ "get": {
+ "description": "Download a file from server-side storage by file path or storage table reference.",
+ "operationId": "download",
+ "parameters": [
+ {
+ "description": "Filename for the download.",
+ "example": "report.csv",
+ "in": "path",
+ "name": "file",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Server-side file path to download from.",
+ "in": "query",
+ "name": "filePath",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Name of the storage table to download from.",
+ "in": "query",
+ "name": "storageTableName",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage reference key for the file.",
+ "in": "query",
+ "name": "storageReference",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "description": "Binary file content"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Download a file",
+ "tags": [
+ "General"
+ ]
+ }
+ },
+ "/qqq/v1/reports/{reportName}": {
+ "get": {
+ "description": "Run a report and stream the generated file in the requested format. The report's input fields are given as\nquery parameters named for the fields; a missing required input is a 400. Requires permission to run the report.",
+ "operationId": "runReport",
+ "parameters": [
+ {
+ "description": "Name of the report to run.",
+ "example": "personReport",
+ "in": "path",
+ "name": "reportName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Output format: csv, xlsx, json (as for table export).",
+ "example": "csv",
+ "in": "query",
+ "name": "format",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "format": "binary",
+ "type": "string"
+ }
+ }
+ },
+ "description": "The generated report file, in the requested format"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run a report and download the file",
+ "tags": [
+ "Reports"
+ ]
+ }
+ },
+ "/qqq/v1/bulkLoad/uploads/{uploadRef}/profile": {
+ "get": {
+ "description": "Read an uploaded file (by its upload ref, which must be the session user's) and describe it for a bulk load into a table: whether row 1 is a header row, and each column's inferred type, percent blank, distinct count, maximum length and pattern class. Sample values are included only for columns mapped to an unclassified (or PUBLIC) field, or for every column when the request's `X-QQQ-AI-Route` header is `hipaa`; unmapped columns never get samples otherwise. Requires the table's bulk-insert process permission. Nothing is stored.",
+ "operationId": "getBulkLoadUploadProfile",
+ "parameters": [
+ {
+ "description": "The opaque ref of an upload the session user owns.",
+ "in": "path",
+ "name": "uploadRef",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The table the file would be loaded into.",
+ "example": "person",
+ "in": "query",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Sample values per column, where allowed (0 to 20; default 5).",
+ "in": "query",
+ "name": "sampleCount",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "profile": {
+ "value": {
+ "fileName": "people.csv",
+ "hasHeaderRow": true,
+ "rowsProfiled": 250,
+ "uploadRef": "u_4f2c"
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/BulkLoadUploadProfileResponseV1"
+ }
+ }
+ },
+ "description": "The upload's header guess and column profiles"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Profile an uploaded file for a bulk load",
+ "tags": [
+ "Bulk Load"
+ ]
+ }
+ },
+ "/qqq/v1/bulkLoad/{tableName}/suggestMapping": {
+ "post": {
+ "description": "Run the bulk load mapping suggester over an uploaded file's header row and return a v1 bulk load profile, the file columns it leaves unmapped, the required fields it does not fill, and the mapped fields with a possible value source (whose file values may need value mapping). The upload must be the session user's. Requires the table's bulk-insert process permission. Nothing is stored.",
+ "operationId": "suggestBulkLoadMapping",
+ "parameters": [
+ {
+ "description": "The table the file would be loaded into.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "uploadRef": {
+ "description": "The opaque ref of an upload the session user owns.",
+ "type": "string"
+ },
+ "isBulkEdit": {
+ "description": "Suggest a bulk edit profile (default false: bulk insert).",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "suggestion": {
+ "value": {
+ "profile": {
+ "version": "v1",
+ "layout": "FLAT",
+ "hasHeaderRow": true
+ }
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/BulkLoadSuggestMappingResponseV1"
+ }
+ }
+ },
+ "description": "The suggested profile and what it leaves unmapped"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Suggest a bulk load mapping for an uploaded file",
+ "tags": [
+ "Bulk Load"
+ ]
+ }
+ },
+ "/qqq/v1/bulkLoad/{tableName}/validate": {
+ "post": {
+ "description": "Run the table's bulk-insert process over an uploaded file with the given v1 bulk load profile - the same mapping, value mapping and validation a real load uses - and stop at its review step, so nothing is stored. SAMPLE validates the first 100 rows; FULL the whole file. Returns the standard process summary lines, counts, and error groups with row numbers. Values of classified fields are left out unless the request's `X-QQQ-AI-Route` header is `hipaa`. The upload must be the session user's. Requires the table's bulk-insert process permission.",
+ "operationId": "validateBulkLoad",
+ "parameters": [
+ {
+ "description": "The table the file would be loaded into.",
+ "example": "person",
+ "in": "path",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "uploadRef": {
+ "description": "The opaque ref of an upload the session user owns.",
+ "type": "string"
+ },
+ "profile": {
+ "description": "A v1 bulk load profile: version, layout (FLAT), hasHeaderRow, and fieldList entries of fieldName, columnIndex, headerName, defaultValue, doValueMapping, valueMappings and clearIfEmpty.",
+ "type": "object"
+ },
+ "mode": {
+ "description": "SAMPLE (default, the first 100 rows) or FULL.",
+ "enum": [
+ "SAMPLE",
+ "FULL"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "examples": {
+ "dryRun": {
+ "value": {
+ "errorCount": 1,
+ "mode": "SAMPLE",
+ "okCount": 2,
+ "processName": "person.bulkInsert",
+ "recordCount": 3
+ }
+ }
+ },
+ "schema": {
+ "$ref": "#/components/schemas/BulkLoadValidateResponseV1"
+ }
+ }
+ },
+ "description": "The dry run's summary and error groups"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Dry-run a bulk load profile over an uploaded file",
+ "tags": [
+ "Bulk Load"
+ ]
+ }
+ },
+ "/qqq/v1/esb/overview": {
+ "get": {
+ "description": "Every broker connection and destination, with the tables and processes publishing to each and the triggers consuming it, and what the user may do. Needs the ESB app permission.",
+ "operationId": "getEsbOverview",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EsbOverviewResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "ESB overview",
+ "tags": [
+ "ESB"
+ ]
+ }
+ },
+ "/qqq/v1/esb/table/{table}": {
+ "get": {
+ "description": "The destinations a table publishes its events to, the triggers subscribed to them (on processes the user can access), and what the user may do. Needs READ on the table.",
+ "operationId": "getEsbTableByTable",
+ "parameters": [
+ {
+ "description": "Table name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EsbTableResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "ESB of a table",
+ "tags": [
+ "ESB"
+ ]
+ }
+ },
+ "/qqq/v1/esb/process/{process}": {
+ "get": {
+ "description": "The destinations a process publishes its lifecycle events to, the triggers that run it, and what the user may do. Needs access to the process.",
+ "operationId": "getEsbProcessByProcess",
+ "parameters": [
+ {
+ "description": "Process name.",
+ "in": "path",
+ "name": "process",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EsbProcessResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "ESB of a process",
+ "tags": [
+ "ESB"
+ ]
+ }
+ },
+ "/qqq/v1/esb/deadLetters/{trigger}": {
+ "get": {
+ "description": "A page of the messages on a trigger dead-letter destination, oldest first. Needs the operate permission.",
+ "operationId": "getEsbDeadLettersByTrigger",
+ "parameters": [
+ {
+ "description": "Trigger name.",
+ "in": "path",
+ "name": "trigger",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Messages to skip (default 0).",
+ "in": "query",
+ "name": "offset",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Messages to return (default and maximum set by the server).",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EsbMessagePageResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Dead letters of a trigger",
+ "tags": [
+ "ESB"
+ ]
+ }
+ },
+ "/qqq/v1/esb/messages/{destination}": {
+ "get": {
+ "description": "A page of the messages waiting on a destination (or, with trigger, on that trigger subscription of a topic), oldest first. Needs the operate permission.",
+ "operationId": "getEsbMessagesByDestination",
+ "parameters": [
+ {
+ "description": "Destination name.",
+ "in": "path",
+ "name": "destination",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "For a topic: the trigger whose subscription to browse.",
+ "in": "query",
+ "name": "trigger",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Messages to skip (default 0).",
+ "in": "query",
+ "name": "offset",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Messages to return (default and maximum set by the server).",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EsbMessagePageResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Messages on a destination",
+ "tags": [
+ "ESB"
+ ]
+ }
+ },
+ "/qqq/v1/health/summary": {
+ "get": {
+ "description": "Requires health.read permission. Returns redacted health state.",
+ "operationId": "getHealthSummary",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HealthSummaryV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Health summary",
+ "tags": [
+ "Health"
+ ]
+ }
+ },
+ "/qqq/v1/health/components/{name}": {
+ "get": {
+ "description": "Requires health.read permission. Returns redacted health state.",
+ "operationId": "getHealthComponentsByName",
+ "parameters": [
+ {
+ "description": "Stable health check or component name.",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HealthComponentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Health component",
+ "tags": [
+ "Health"
+ ]
+ }
+ },
+ "/qqq/v1/health/checks/{name}/history": {
+ "get": {
+ "description": "Requires health.read permission. Returns redacted health state.",
+ "operationId": "getHealthChecksByNameHistory",
+ "parameters": [
+ {
+ "description": "Stable health check or component name.",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "limit is capped at 500; from/to are inclusive ISO-8601 instants.",
+ "in": "query",
+ "name": "from",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "limit is capped at 500; from/to are inclusive ISO-8601 instants.",
+ "in": "query",
+ "name": "to",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "limit is capped at 500; from/to are inclusive ISO-8601 instants.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HealthHistoryV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Health history",
+ "tags": [
+ "Health"
+ ]
+ }
+ },
+ "/qqq/v1/health/checks/{name}/run": {
+ "post": {
+ "description": "Requires health.write permission. Returns redacted health state.",
+ "operationId": "postHealthChecksByNameRun",
+ "parameters": [
+ {
+ "description": "Stable health check or component name.",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HealthRunV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Health run",
+ "tags": [
+ "Health"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/inbox/summary": {
+ "get": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsInboxSummary",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsInboxSummaryV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read the bell summary",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/inbox": {
+ "get": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsInbox",
+ "parameters": [
+ {
+ "description": "all or unread; other values behave as all.",
+ "in": "query",
+ "name": "status",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Case-insensitive category filter.",
+ "in": "query",
+ "name": "category",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Case-insensitive severity filter.",
+ "in": "query",
+ "name": "severity",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Default 0; negatives clamp to 0; malformed values use the default.",
+ "in": "query",
+ "name": "offset",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Default 25; clamped to 1..100; malformed values use the default.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsInboxPageV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Page the notification inbox",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/inbox/read": {
+ "post": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsInboxRead",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsInboxTargetV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Mark own notifications read",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/inbox/unread": {
+ "post": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsInboxUnread",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsUnreadTargetV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Mark own notifications unread",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/inbox/dismiss": {
+ "post": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsInboxDismiss",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsInboxTargetV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Dismiss own notifications",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/alerts/record-panel": {
+ "get": {
+ "description": "Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "alertsRecordPanel",
+ "parameters": [
+ {
+ "description": "Parent table name.",
+ "in": "query",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record key.",
+ "in": "query",
+ "name": "recordId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AlertsRecordPanelV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read visible alerts for a record",
+ "tags": [
+ "alerts"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/config": {
+ "get": {
+ "description": "Whether the assistant is available to this user, its persona and limits",
+ "operationId": "getAssistantConfig",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantConfigResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Whether the assistant is available to this user, its persona and limits",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/conversations": {
+ "get": {
+ "description": "The user's own conversations",
+ "operationId": "getAssistantConversations",
+ "parameters": [
+ {
+ "description": "ARCHIVED for archived conversations; active ones by default.",
+ "in": "query",
+ "name": "status",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantConversationListResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "The user's own conversations",
+ "tags": [
+ "assistant"
+ ]
+ },
+ "post": {
+ "description": "Start a conversation",
+ "operationId": "postAssistantConversations",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "Optional title and the page context it starts from.",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "context": {
+ "additionalProperties": true,
+ "description": "route, tableName, recordId, filter, selectedIds.",
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantConversationV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Start a conversation",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/conversations/{id}": {
+ "delete": {
+ "description": "Delete a conversation",
+ "operationId": "deleteAssistantConversationsById",
+ "parameters": [
+ {
+ "description": "The conversation id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Done (no body)"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete a conversation",
+ "tags": [
+ "assistant"
+ ]
+ },
+ "get": {
+ "description": "A conversation and a page of its messages",
+ "operationId": "getAssistantConversationsById",
+ "parameters": [
+ {
+ "description": "The conversation id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Only messages older than this message id.",
+ "in": "query",
+ "name": "before",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Page size (default 50, at most 200).",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantConversationDetailResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "A conversation and a page of its messages",
+ "tags": [
+ "assistant"
+ ]
+ },
+ "patch": {
+ "description": "Rename, pin or archive a conversation",
+ "operationId": "patchAssistantConversationsById",
+ "parameters": [
+ {
+ "description": "The conversation id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "The changed properties.",
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "pinned": {
+ "type": "boolean"
+ },
+ "status": {
+ "description": "ACTIVE or ARCHIVED.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantConversationV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Rename, pin or archive a conversation",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/conversations/{id}/turns": {
+ "post": {
+ "description": "Ask: start a turn and stream the reply as server-sent events",
+ "operationId": "postAssistantConversationsByIdTurns",
+ "parameters": [
+ {
+ "description": "The conversation id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "The user's text and the page context hint.",
+ "properties": {
+ "text": {
+ "description": "The user's message.",
+ "type": "string"
+ },
+ "pageContext": {
+ "additionalProperties": true,
+ "description": "Where the user is in the app.",
+ "type": "object"
+ },
+ "concurrency": {
+ "description": "supersede or concurrent (case-insensitive); defaults to the host configuration.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "text/event-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantTurnEventV1"
+ }
+ }
+ },
+ "description": "The turn's events, until message.end"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Ask: start a turn and stream the reply as server-sent events",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/turns/{turnId}/events": {
+ "get": {
+ "description": "Resume a turn's events after a sequence number (replay, then the live tail)",
+ "operationId": "getAssistantTurnsByTurnIdEvents",
+ "parameters": [
+ {
+ "description": "The turn id.",
+ "in": "path",
+ "name": "turnId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "The last sequence number already received (0 for all).",
+ "in": "query",
+ "name": "after",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "text/event-stream": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantTurnEventV1"
+ }
+ }
+ },
+ "description": "The turn's events after `after`, until message.end"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Resume a turn's events after a sequence number (replay, then the live tail)",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/turns/{turnId}/cancel": {
+ "post": {
+ "description": "Stop a running turn",
+ "operationId": "postAssistantTurnsByTurnIdCancel",
+ "parameters": [
+ {
+ "description": "The turn id.",
+ "in": "path",
+ "name": "turnId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantStatusResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "202": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantStatusResponseV1"
+ }
+ }
+ },
+ "description": "Legacy replica: cancellation accepted"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Stop a running turn",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/turns/active": {
+ "get": {
+ "description": "Find the user's active assistant runs",
+ "operationId": "getAssistantTurnsActive",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantActiveTurnsResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Find the user's active assistant runs",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/messages/{id}/feedback": {
+ "post": {
+ "description": "Thumbs up or down on an assistant message",
+ "operationId": "postAssistantMessagesByIdFeedback",
+ "parameters": [
+ {
+ "description": "The assistant message id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "The rating and an optional reason or comment.",
+ "properties": {
+ "rating": {
+ "description": "1 or -1.",
+ "type": "integer"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "comment": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Done (no body)"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Thumbs up or down on an assistant message",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/actions/{id}": {
+ "get": {
+ "description": "A write the assistant proposed, and its state",
+ "operationId": "getAssistantActionsById",
+ "parameters": [
+ {
+ "description": "The pending action id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantActionV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "A write the assistant proposed, and its state",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/actions/{id}/confirm": {
+ "post": {
+ "description": "Confirm a proposed write: it runs once, through the UI API, with this request's session",
+ "operationId": "postAssistantActionsByIdConfirm",
+ "parameters": [
+ {
+ "description": "The pending action id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantActionV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Confirm a proposed write: it runs once, through the UI API, with this request's session",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/actions/{id}/reject": {
+ "post": {
+ "description": "Cancel a proposed write; nothing changes",
+ "operationId": "postAssistantActionsByIdReject",
+ "parameters": [
+ {
+ "description": "The pending action id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantActionV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Cancel a proposed write; nothing changes",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/assistant/access": {
+ "get": {
+ "description": "Explain access: which UI API operations the assistant could call for this user, and why not",
+ "operationId": "getAssistantAccess",
+ "parameters": [
+ {
+ "description": "Only this table.",
+ "in": "query",
+ "name": "table",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Only the tables this text mentions.",
+ "in": "query",
+ "name": "prompt",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Attribute this request to an owned turn.",
+ "in": "query",
+ "name": "turnId",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantAccessResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "No access to the assistant"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (or not the user's own)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Already finished or decided"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Budget or rate limit"
+ },
+ "503": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Disabled, not configured, or the kill switch is on"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Explain access: which UI API operations the assistant could call for this user, and why not",
+ "tags": [
+ "assistant"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/presence": {
+ "delete": {
+ "description": "Leave presence. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "deleteQbitCollaborationPresence",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPresenceLeaveV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Leave presence",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "get": {
+ "description": "Get presence snapshot. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationPresence",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "query",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "query",
+ "name": "pk",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPresenceSnapshotV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get presence snapshot",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Renew presence. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationPresence",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPresenceRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPresenceSnapshotV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Renew presence",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/favorites": {
+ "delete": {
+ "description": "Unstar a target. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "deleteQbitCollaborationFavorites",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTargetRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Unstar a target",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "get": {
+ "description": "List personal favorites. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationFavorites",
+ "parameters": [
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFavoriteListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List personal favorites",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "put": {
+ "description": "Star a target. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "putQbitCollaborationFavorites",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTargetRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Star a target",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/recents": {
+ "get": {
+ "description": "List recent targets. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecents",
+ "parameters": [
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationRecentListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List recent targets",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Record a recent view. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecents",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTargetRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Record a recent view",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/favorites/order": {
+ "patch": {
+ "description": "Reorder personal favorites. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "patchQbitCollaborationFavoritesOrder",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFavoriteOrderRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Reorder personal favorites",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/attachments": {
+ "get": {
+ "description": "List record attachments. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkAttachments",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAttachmentListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List record attachments",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Upload an attachment. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecordsByTableByPkAttachments",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAttachmentUploadRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAttachmentV1"
+ }
+ }
+ },
+ "description": "Uploaded attachment"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Upload an attachment",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/attachments/{id}/download": {
+ "get": {
+ "description": "Get a temporary download URL; clients follow url. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationAttachmentsByIdDownload",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationDownloadV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a temporary download URL; clients follow url",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/attachments/{id}/preview": {
+ "get": {
+ "description": "Get a temporary preview URL; clients follow url. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationAttachmentsByIdPreview",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationDownloadV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a temporary preview URL; clients follow url",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/attachments/{id}": {
+ "delete": {
+ "description": "Delete an attachment. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "deleteQbitCollaborationAttachmentsById",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete an attachment",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "patch": {
+ "description": "Rename or describe an attachment. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "patchQbitCollaborationAttachmentsById",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAttachmentPatchRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAttachmentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Rename or describe an attachment",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/tags": {
+ "get": {
+ "description": "Search table tag vocabulary. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationTags",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "query",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Text to search in display names or vocabulary.",
+ "in": "query",
+ "name": "q",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search table tag vocabulary",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Create or suggest a tag. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationTags",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagCreateRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Create or suggest a tag",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/tags": {
+ "get": {
+ "description": "List applied record tags. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkTags",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List applied record tags",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "put": {
+ "description": "Add and remove record tags. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "putQbitCollaborationRecordsByTableByPkTags",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagApplyRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTagListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Add and remove record tags",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/comments": {
+ "get": {
+ "description": "Page record comment threads. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkComments",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentPageV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Page record comment threads",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Post a comment or reply. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecordsByTableByPkComments",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentPostRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Post a comment or reply",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/comments/{id}": {
+ "delete": {
+ "description": "Delete a comment thread. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "deleteQbitCollaborationCommentsById",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete a comment thread",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "patch": {
+ "description": "Edit the caller's comment. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "patchQbitCollaborationCommentsById",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentEditRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Edit the caller's comment",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/comments/{id}/resolve": {
+ "post": {
+ "description": "Resolve a comment thread. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationCommentsByIdResolve",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Resolve a comment thread",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/comments/{id}/reopen": {
+ "post": {
+ "description": "Reopen a comment thread. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationCommentsByIdReopen",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMutationResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Reopen a comment thread",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/comments/{id}/history": {
+ "get": {
+ "description": "Read comment edit history. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationCommentsByIdHistory",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationCommentHistoryV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read comment edit history",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/mentions/candidates": {
+ "get": {
+ "description": "Find people to mention on a record. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationMentionsCandidates",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "query",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "query",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Text to search in display names or vocabulary.",
+ "in": "query",
+ "name": "q",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMentionCandidateListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Find people to mention on a record",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/follow": {
+ "delete": {
+ "description": "Unfollow a record. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "deleteQbitCollaborationRecordsByTableByPkFollow",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFollowStateV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Unfollow a record",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "get": {
+ "description": "Get the caller's follow state. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkFollow",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFollowStateV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get the caller's follow state",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "put": {
+ "description": "Follow a record and configure notifications. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "putQbitCollaborationRecordsByTableByPkFollow",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFollowRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFollowStateV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Follow a record and configure notifications",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/followers": {
+ "get": {
+ "description": "List record followers. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkFollowers",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationFollowerListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List record followers",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/timeline": {
+ "get": {
+ "description": "Page the merged record timeline. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkTimeline",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Timeline continuation token; alias for cursor. Supply only one.",
+ "in": "query",
+ "name": "before",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Comma-separated AUDIT, ACTIVITY or activity type names (for example COMMENTED).",
+ "in": "query",
+ "name": "types",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTimelinePageV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Page the merged record timeline",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/people": {
+ "get": {
+ "description": "Search the active people directory. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationPeople",
+ "parameters": [
+ {
+ "description": "Text to search in display names or vocabulary.",
+ "in": "query",
+ "name": "q",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPersonListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Search the active people directory",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/people/{userId}": {
+ "get": {
+ "description": "Get an active directory person. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationPeopleByUserId",
+ "parameters": [
+ {
+ "description": "Stable directory user identity.",
+ "in": "path",
+ "name": "userId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationPersonV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get an active directory person",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/link": {
+ "get": {
+ "description": "Get a record link. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkLink",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationLinkV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a record link",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/shares/preview": {
+ "post": {
+ "description": "Preview share recipients. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecordsByTableByPkSharesPreview",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationShareRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationSharePreviewV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Preview share recipients",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/shares": {
+ "post": {
+ "description": "Share a record. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecordsByTableByPkShares",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationShareRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationShareListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Share a record",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/access-requests": {
+ "post": {
+ "description": "Request access to a record. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationAccessRequests",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAccessRequestCreateRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAccessRequestV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Request access to a record",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/access-requests/mine": {
+ "get": {
+ "description": "List my access requests. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationAccessRequestsMine",
+ "parameters": [
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAccessRequestListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List my access requests",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/tasks": {
+ "get": {
+ "description": "List record tasks. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationRecordsByTableByPkTasks",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Include completed and cancelled tasks; default false.",
+ "in": "query",
+ "name": "includeDone",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List record tasks",
+ "tags": [
+ "collaboration"
+ ]
+ },
+ "post": {
+ "description": "Create a task. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "postQbitCollaborationRecordsByTableByPkTasks",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskCreateRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Create a task",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/tasks/{id}": {
+ "patch": {
+ "description": "Update a task. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "patchQbitCollaborationTasksById",
+ "parameters": [
+ {
+ "description": "Collaboration object identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskPatchRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Update a task",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/tasks/mine": {
+ "get": {
+ "description": "List my tasks. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationTasksMine",
+ "parameters": [
+ {
+ "description": "Task status: OPEN (default), DONE or CANCELLED.",
+ "in": "query",
+ "name": "status",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Maximum items to return, from 1 to 100; default 20.",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Opaque nextCursor returned by the previous page; omit for the first page.",
+ "in": "query",
+ "name": "cursor",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationTaskListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List my tasks",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/assignment": {
+ "put": {
+ "description": "Set record owner and assignee. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "putQbitCollaborationRecordsByTableByPkAssignment",
+ "parameters": [
+ {
+ "description": "Parent table metadata name.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Parent record primary key.",
+ "in": "path",
+ "name": "pk",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAssignmentRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationAssignmentV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Set record owner and assignee",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/collaboration/my-work": {
+ "get": {
+ "description": "Get my work summary. Uses the signed-in caller's permissions and record visibility.",
+ "operationId": "getQbitCollaborationMyWork",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CollaborationMyWorkV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found (including invisible parents)"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get my work summary",
+ "tags": [
+ "collaboration"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/saved/{id}/run": {
+ "post": {
+ "description": "Re-run a visible saved analysis as the signed-in viewer. Requires saved READ and source READ/Analyze. Drops unavailable fields with a warning and returns the result typed by kind; inaccessible required axes or predicates produce no result.",
+ "operationId": "postQbitDataAnalysisSavedByIdRun",
+ "parameters": [
+ {
+ "description": "Owner-scoped analysis run or watch id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisSavedResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Run a saved analysis",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/saved": {
+ "get": {
+ "description": "List core-visible saved analyses with name, kind, source table label, owner, shared state, this viewer's starred flag and last update.",
+ "operationId": "getQbitDataAnalysisSaved",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisSavedListV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List visible saved analyses",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/saved/{id}/star": {
+ "delete": {
+ "description": "Remove the signed-in user's star on a visible saved analysis. Idempotent; uses standard saved delete permission and owner locks.",
+ "operationId": "deleteQbitDataAnalysisSavedByIdStar",
+ "parameters": [
+ {
+ "description": "Owner-scoped analysis run or watch id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisStarV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Unstar a saved analysis",
+ "tags": [
+ "data-analysis"
+ ]
+ },
+ "put": {
+ "description": "Star a visible saved analysis for the signed-in user. Idempotent; uses standard saved insert permission and the personal star record lock.",
+ "operationId": "putQbitDataAnalysisSavedByIdStar",
+ "parameters": [
+ {
+ "description": "Owner-scoped analysis run or watch id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisStarV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Star a saved analysis",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/sql": {
+ "post": {
+ "description": "Execute a typed analysis as the viewer and capture the main RDBMS aggregate SQL from core QueryStat. Requires installed SQL Workbench and its access permission. Non-RDBMS backends report unavailable; SQL is for reading and record security remains enforced at runtime.",
+ "operationId": "postQbitDataAnalysisTablesByTableSql",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisSavedRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisSqlV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read an analysis aggregate SQL statement",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/export": {
+ "post": {
+ "description": "Execute a typed analysis as the signed-in viewer and download its result table as CSV or XLSX. Requires source READ/Analyze and FULL fields; uses core report formats.",
+ "operationId": "postQbitDataAnalysisExport",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisSavedRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisFileV1"
+ }
+ },
+ "text/csv": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisFileV1"
+ }
+ }
+ },
+ "description": "Analysis result file"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Export an analysis result",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/saved/{id}/export": {
+ "get": {
+ "description": "Re-run a visible saved analysis as the viewer, applying current source permissions and dropping unavailable fields, then download its result table as CSV or XLSX.",
+ "operationId": "getQbitDataAnalysisSavedByIdExport",
+ "parameters": [
+ {
+ "description": "Visible saved analysis id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Result file format.",
+ "in": "query",
+ "name": "format",
+ "required": true,
+ "schema": {
+ "enum": [
+ "csv",
+ "xlsx"
+ ],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisFileV1"
+ }
+ },
+ "text/csv": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisFileV1"
+ }
+ }
+ },
+ "description": "Analysis result file"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Export a saved analysis",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/capabilities": {
+ "get": {
+ "description": "Discover whether the current user can analyze this table, readable fields, chart defaults, limits and backend capabilities.",
+ "operationId": "getQbitDataAnalysisTablesByTableCapabilities",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCapabilitiesV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Check analysis availability",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/column-profile": {
+ "post": {
+ "description": "Profile one column of a table under a filter: counts, nulls, distinct values, top values, numeric statistics and histogram, date patterns; every number has a drill-through filter unless privacy suppresses it.",
+ "operationId": "postQbitDataAnalysisTablesByTableColumnProfile",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisColumnProfileV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Profile one column",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/distinct-values": {
+ "post": {
+ "description": "Page through distinct stored values with display labels, counts and drill-through filters; search narrows stored values.",
+ "operationId": "postQbitDataAnalysisTablesByTableDistinctValues",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisDistinctValuesRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisDistinctValuesPageV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List distinct column values",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/compare": {
+ "post": {
+ "description": "Compare filtered A with filtered B (null means the whole permitted table). Return means, medians or category shares, B-minus-A deltas, valid significance tests and count-equivalent drills. Only FULL fields are accepted.",
+ "operationId": "postQbitDataAnalysisTablesByTableCompare",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCompareRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCompareV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Compare two populations",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/shift": {
+ "post": {
+ "description": "Compare category shares or numeric quartiles across session-timezone calendar buckets. Compute descriptive PSI between the first and last complete nonempty buckets using fixed categories or baseline quartile bins.",
+ "operationId": "postQbitDataAnalysisTablesByTableShift",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisShiftRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisShiftV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Measure distribution shift over time",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/correlation": {
+ "post": {
+ "description": "Compute a Pearson correlation matrix for 2 to 12 distinct FULL numeric fields, using paired non-null records. Every cell includes n and parameters for the scatter endpoint; core pushes down CORR or uses bounded streaming.",
+ "operationId": "postQbitDataAnalysisTablesByTableCorrelation",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCorrelationRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCorrelationV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Find numeric relationships",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/scatter": {
+ "post": {
+ "description": "Return at most 2000 paired numeric points as the user, ordered by primary key when core query sampling is unavailable, plus a least-squares line fitted to the sample. Privacy disables individual drills and suppresses small populations.",
+ "operationId": "postQbitDataAnalysisTablesByTableScatter",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisScatterRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisScatterV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Inspect a numeric relationship",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/crosstab": {
+ "post": {
+ "description": "Count combinations of two FULL fields with row and column shares, up to 20 categories per axis plus Other. Test independence using chi-square and Cramer V after pooling low expected counts; privacy suppresses small cells and their drills.",
+ "operationId": "postQbitDataAnalysisTablesByTableCrosstab",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCrosstabRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisCrosstabV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Cross-tabulate two fields",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/watches/{id}/preview": {
+ "post": {
+ "description": "Compute complete time buckets and a detector verdict under the signed-in user's READ, Analyze and FULL-field permissions. Includes a baseline band annotation. Does not update the watch or raise alerts.",
+ "operationId": "postQbitDataAnalysisWatchesByIdPreview",
+ "parameters": [
+ {
+ "description": "Owner-scoped analysis run or watch id.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisWatchPreviewV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Preview an anomaly watch",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/pivot": {
+ "post": {
+ "description": "Group records by up to 3 row and 2 column fields (with date or numeric buckets) and compute counts, sums, averages, min/max, distinct counts or percentiles per cell; every cell has a drill-through filter.",
+ "operationId": "postQbitDataAnalysisTablesByTablePivot",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisPivotRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisPivotV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Explore a pivot table",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/table-profile": {
+ "post": {
+ "description": "Profile readable fields under a filter for completeness, uniqueness, constant or empty columns and candidate keys.",
+ "operationId": "postQbitDataAnalysisTablesByTableTableProfile",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisTableProfileV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Profile table completeness and keys",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/tables/{table}/duplicates": {
+ "post": {
+ "description": "Group matching records by the selected readable fields and return repeated tuples with counts and drill-through filters.",
+ "operationId": "postQbitDataAnalysisTablesByTableDuplicates",
+ "parameters": [
+ {
+ "description": "QQQ table name to analyze.",
+ "in": "path",
+ "name": "table",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisDuplicatesRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisDuplicatesResultV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Find duplicate groups",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/runs": {
+ "post": {
+ "description": "Start an owner-scoped exact column or table profile. Poll the returned runId until COMPLETE or FAILED; results honor the current session permissions.",
+ "operationId": "postQbitDataAnalysisRuns",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisStartRunRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisRunStartedV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Start an exact profile run",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/data-analysis/runs/{runId}": {
+ "get": {
+ "description": "Read status, timestamps and the typed columnProfile or tableProfile result of an owner-scoped run. Completed results are rechecked against current permissions.",
+ "operationId": "getQbitDataAnalysisRunsByRunId",
+ "parameters": [
+ {
+ "description": "Owner-scoped analysis run or watch id.",
+ "in": "path",
+ "name": "runId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DataAnalysisRunStatusV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get an exact profile run",
+ "tags": [
+ "data-analysis"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/edi/guides/{guideId}/tree": {
+ "get": {
+ "description": "Read the guide tree. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.",
+ "operationId": "getQbitEdiGuidesByGuideIdTree",
+ "parameters": [
+ {
+ "description": "Positive record identifier.",
+ "in": "path",
+ "name": "guideId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiGuideTreeV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid request or sample exceeds 5 MiB"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible record"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "413": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Host HTTP request size limit exceeded"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read the guide tree",
+ "tags": [
+ "edi"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/edi/maps/{mapId}/target": {
+ "get": {
+ "description": "Read target metadata and map rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.",
+ "operationId": "getQbitEdiMapsByMapIdTarget",
+ "parameters": [
+ {
+ "description": "Positive record identifier.",
+ "in": "path",
+ "name": "mapId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiTargetV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid request or sample exceeds 5 MiB"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible record"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "413": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Host HTTP request size limit exceeded"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Read target metadata and map rules",
+ "tags": [
+ "edi"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/edi/sandbox/preview": {
+ "post": {
+ "description": "Preview an encrypted sample with optional unsaved rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.",
+ "operationId": "postQbitEdiSandboxPreview",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiPreviewRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiPreviewV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid request or sample exceeds 5 MiB"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible record"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "413": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Host HTTP request size limit exceeded"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Preview an encrypted sample with optional unsaved rules",
+ "tags": [
+ "edi"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/edi/maps/{mapId}/validate": {
+ "post": {
+ "description": "Validate unsaved map rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.",
+ "operationId": "postQbitEdiMapsByMapIdValidate",
+ "parameters": [
+ {
+ "description": "Positive record identifier.",
+ "in": "path",
+ "name": "mapId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiValidateRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EdiValidationV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid request or sample exceeds 5 MiB"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible record"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "413": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Host HTTP request size limit exceeded"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Validate unsaved map rules",
+ "tags": [
+ "edi"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/quick-search/status": {
+ "get": {
+ "description": "Requires Quick Search admin permission. Five-second instance cache; two-second refresh wait. Counts are saved diagnostics, not live source scans. Unknown values are null. Backlog counts are lower bounds when backlogTruncated is true.",
+ "operationId": "getQuickSearchStatus",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/QuickSearchStatusV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Diagnostic rate limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Quick Search admin permission required"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get Quick Search status",
+ "tags": [
+ "quick-search"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/quick-search/suggest": {
+ "get": {
+ "description": "Requires a signed-in session, not Quick Search admin permission. Results inherit table READ permissions, configured record security locks and protected-field exclusions. One bounded candidate batch per table; no extra scans. Unavailable search and normalized terms shorter than two characters return empty groups.",
+ "operationId": "getQuickSearchSuggestions",
+ "parameters": [
+ {
+ "description": "Search text: trim and collapse whitespace before applying the 2..100 character range. Shorter terms return empty groups; longer terms return 400.",
+ "in": "query",
+ "name": "q",
+ "required": true,
+ "schema": {
+ "description": "Normalized search term.",
+ "nullable": false,
+ "type": "string"
+ }
+ },
+ {
+ "description": "Items per table: integer 1..10, default 5.",
+ "in": "query",
+ "name": "limitPerTable",
+ "required": false,
+ "schema": {
+ "description": "Maximum items per table; default 5, maximum 10.",
+ "nullable": false,
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Groups to return: integer 1..20, default 8.",
+ "in": "query",
+ "name": "maxTables",
+ "required": false,
+ "schema": {
+ "description": "Maximum groups; default 8, maximum 20.",
+ "nullable": false,
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Optional comma-separated table metadata names. Unknown, disabled and unreadable tables are omitted.",
+ "in": "query",
+ "name": "tables",
+ "required": false,
+ "schema": {
+ "description": "Table-name filter; omitted means all eligible tables.",
+ "nullable": false,
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/QuickSearchSuggestV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing q, normalized term longer than 100 characters, or invalid limits"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Session permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get Quick Search suggestions",
+ "tags": [
+ "quick-search"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/secured-data/reveal": {
+ "post": {
+ "operationId": "postQbitSecuredDataReveal",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SecuredDataRevealRequestV1"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SecuredDataRevealResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid reveal request"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Reveal denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Record not found or locked"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Daily reveal cap reached"
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Reveal",
+ "tags": [
+ "secured-data"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/secured-data/reveal/options": {
+ "get": {
+ "operationId": "getQbitSecuredDataRevealOptions",
+ "parameters": [
+ {
+ "in": "query",
+ "name": "tableName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "fieldName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SecuredDataRevealOptionsResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "RevealOptions",
+ "tags": [
+ "secured-data"
+ ]
+ }
+ },
+ "/qqq/v1/qbit/secured-data/status": {
+ "get": {
+ "operationId": "getQbitSecuredDataStatus",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SecuredDataStatusResponseV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields."
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token."
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "The user (or the credential's scope) may not do this (code PERMISSION_DENIED)."
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Not found, or not visible to this user (code NOT_FOUND)."
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT)."
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Status",
+ "tags": [
+ "secured-data"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/capabilities": {
+ "get": {
+ "description": "Get caller capabilities and configured limits. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetCapabilities",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchCapabilitiesV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get caller capabilities and configured limits",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/schema/{backendName}": {
+ "get": {
+ "description": "Inspect a target backend schema. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetSchema",
+ "parameters": [
+ {
+ "description": "Configured target backend name.",
+ "in": "path",
+ "name": "backendName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "True to bypass the schema cache; default false.",
+ "in": "query",
+ "name": "refresh",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchSchemaV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Inspect a target backend schema",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/execute": {
+ "post": {
+ "description": "Execute read-only SQL or preview and confirm a gated write. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchExecute",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExecuteRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExecutionV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Execute read-only SQL or preview and confirm a gated write",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/explain": {
+ "post": {
+ "description": "Explain SQL; ANALYZE remains subject to write gates. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchExplain",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExplainRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExplainV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Explain SQL; ANALYZE remains subject to write gates",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/executions/{uuid}/rows": {
+ "get": {
+ "description": "Page or sort the caller's cached result. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetRows",
+ "parameters": [
+ {
+ "description": "Execution UUID; case insensitive.",
+ "in": "path",
+ "name": "uuid",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Rows to skip; default zero; negative values become zero.",
+ "in": "query",
+ "name": "offset",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Page size; nonpositive or absent uses the default. Rows cap at maxPageSize; history caps at 200 (default 50).",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Optional zero-based result column index.",
+ "in": "query",
+ "name": "sort",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Sort direction: desc (case insensitive) or asc (default).",
+ "in": "query",
+ "name": "dir",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchRowsV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Page or sort the caller's cached result",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/executions/{uuid}/cancel": {
+ "post": {
+ "description": "Cancel the caller's running execution. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchCancelExecution",
+ "parameters": [
+ {
+ "description": "Execution UUID; case insensitive.",
+ "in": "path",
+ "name": "uuid",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchEmptyRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchCancelledV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Cancel the caller's running execution",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/history": {
+ "get": {
+ "description": "List the caller's recent audited executions. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetHistory",
+ "parameters": [
+ {
+ "description": "Page size; nonpositive or absent uses the default. Rows cap at maxPageSize; history caps at 200 (default 50).",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Configured target backend name.",
+ "in": "query",
+ "name": "backendName",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchHistoryV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List the caller's recent audited executions",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks": {
+ "get": {
+ "description": "List visible personal or shared notebooks. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchListNotebooks",
+ "parameters": [
+ {
+ "description": "mine (default) or shared notebook library.",
+ "in": "query",
+ "name": "scope",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebooksV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List visible personal or shared notebooks",
+ "tags": [
+ "sql-workbench"
+ ]
+ },
+ "post": {
+ "description": "Create a personal notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchCreateNotebook",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Create a personal notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}": {
+ "delete": {
+ "description": "Delete an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchDeleteNotebook",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchDeletedV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete an owned notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ },
+ "get": {
+ "description": "Get a visible notebook and its cells. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetNotebook",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a visible notebook and its cells",
+ "tags": [
+ "sql-workbench"
+ ]
+ },
+ "put": {
+ "description": "Update an owned notebook and record a version. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchUpdateNotebook",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Update an owned notebook and record a version",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/publish": {
+ "post": {
+ "description": "Publish or withdraw an owned notebook with share permission. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchPublishNotebook",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchPublishRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Publish or withdraw an owned notebook with share permission",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/duplicate": {
+ "post": {
+ "description": "Make a personal copy of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchDuplicateNotebook",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchEmptyRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Make a personal copy of a visible notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions": {
+ "get": {
+ "description": "List versions of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchListVersions",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchVersionsV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List versions of a visible notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions/{n}": {
+ "get": {
+ "description": "Get a visible notebook version and saved content. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchGetVersion",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Notebook version number.",
+ "in": "path",
+ "name": "n",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchVersionV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Get a visible notebook version and saved content",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions/{n}/restore": {
+ "post": {
+ "description": "Restore an owned notebook version as a new version. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchRestoreVersion",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Notebook version number.",
+ "in": "path",
+ "name": "n",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchEmptyRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchNotebookV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Restore an owned notebook version as a new version",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/snapshots": {
+ "get": {
+ "description": "List snapshots of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchListSnapshots",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchSnapshotsV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "List snapshots of a visible notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ },
+ "post": {
+ "description": "Pin the caller's cached result to an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchCreateSnapshot",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchSnapshotRequestV1"
+ }
+ }
+ },
+ "required": false
+ },
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchSnapshotV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Pin the caller's cached result to an owned notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/notebooks/{id}/snapshots/{snapshotId}": {
+ "delete": {
+ "description": "Delete a snapshot from an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchDeleteSnapshot",
+ "parameters": [
+ {
+ "description": "Notebook identifier.",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Snapshot identifier.",
+ "in": "path",
+ "name": "snapshotId",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchDeletedV1"
+ }
+ }
+ },
+ "description": "Successful Response"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Delete a snapshot from an owned notebook",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ },
+ "/qqq/v1/sql-workbench/executions/{uuid}/export": {
+ "get": {
+ "description": "Export the caller's cached result as CSV, JSON or XLSX. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.",
+ "operationId": "sqlWorkbenchExportResult",
+ "parameters": [
+ {
+ "description": "Execution UUID; case insensitive.",
+ "in": "path",
+ "name": "uuid",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "csv (default), json or xlsx; case insensitive.",
+ "in": "query",
+ "name": "format",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExportJsonV1"
+ }
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExportFileV1"
+ }
+ },
+ "text/csv; charset=utf-8": {
+ "schema": {
+ "$ref": "#/components/schemas/SqlWorkbenchExportFileV1"
+ }
+ }
+ },
+ "description": "Attachment named sql-result-{short UUID}.{format}; Cache-Control: no-store"
+ },
+ "400": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Invalid input or execution limit exceeded"
+ },
+ "401": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Sign in required"
+ },
+ "403": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Permission denied"
+ },
+ "404": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Missing or invisible resource"
+ },
+ "409": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Execution UUID already used"
+ },
+ "429": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BasicErrorResponseV1"
+ }
+ }
+ },
+ "description": "Too many requests (code RATE_LIMITED); retry later."
+ }
+ },
+ "security": [
+ {
+ "sessionUuidCookie": [
+ "N/A"
+ ]
+ },
+ {
+ "bearerAuth": [
+ "N/A"
+ ]
+ },
+ {
+ "oauth2": [
+ "openid",
+ "profile",
+ "email"
+ ]
+ }
+ ],
+ "summary": "Export the caller's cached result as CSV, JSON or XLSX",
+ "tags": [
+ "sql-workbench"
+ ]
+ }
+ }
+ },
+ "servers": [
+ {
+ "description": "The QQQ server that serves this document (paths include /qqq/v1).",
+ "url": "/"
+ }
+ ],
+ "tags": [
+ {
+ "name": "Authentication"
+ },
+ {
+ "name": "Bulk Load"
+ },
+ {
+ "name": "General"
+ },
+ {
+ "name": "Processes"
+ },
+ {
+ "name": "Reports"
+ },
+ {
+ "name": "Tables"
+ },
+ {
+ "name": "Widgets"
+ },
+ {
+ "name": "ESB"
+ },
+ {
+ "name": "Health"
+ },
+ {
+ "description": "Operations of the alerts extension.",
+ "name": "alerts"
+ },
+ {
+ "description": "Operations of the assistant extension.",
+ "name": "assistant"
+ },
+ {
+ "description": "Operations of the collaboration extension.",
+ "name": "collaboration"
+ },
+ {
+ "description": "Operations of the data-analysis extension.",
+ "name": "data-analysis"
+ },
+ {
+ "description": "Operations of the edi extension.",
+ "name": "edi"
+ },
+ {
+ "description": "Operations of the quick-search extension.",
+ "name": "quick-search"
+ },
+ {
+ "description": "Operations of the secured-data extension.",
+ "name": "secured-data"
+ },
+ {
+ "description": "Operations of the sql-workbench extension.",
+ "name": "sql-workbench"
+ }
+ ]
+}
diff --git a/packages/ui-api-client/package.json b/packages/ui-api-client/package.json
new file mode 100644
index 0000000..f1843ad
--- /dev/null
+++ b/packages/ui-api-client/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@qrun-io/qqq-ui-api-client",
+ "version": "1.6.0-rc.1",
+ "description": "Typed TypeScript client for the QQQ UI API (/qqq/v1), generated from the merged OpenAPI document (core + extensions), with OAuth2 device-flow sign-in, token refresh and a realtime (SSE) reader.",
+ "license": "Apache-2.0",
+ "type": "module",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js"
+ },
+ "./openapi/qqq-v1.json": "./openapi/qqq-v1.json"
+ },
+ "files": [
+ "dist",
+ "openapi",
+ "README.md"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/QRun-IO/qqq-cli.git",
+ "directory": "packages/ui-api-client"
+ },
+ "publishConfig": {
+ "registry": "https://npm.pkg.github.com"
+ },
+ "scripts": {
+ "generate": "openapi-typescript openapi/qqq-v1.json --output src/schema.ts && node ../../scripts/fix-recursive-types.mjs src/schema.ts",
+ "build": "tsc -p tsconfig.json",
+ "test": "node --test \"dist/test/*.test.js\""
+ },
+ "dependencies": {
+ "openapi-fetch": "0.17.0"
+ },
+ "devDependencies": {
+ "openapi-typescript": "7.13.0"
+ }
+}
diff --git a/packages/ui-api-client/src/auth.ts b/packages/ui-api-client/src/auth.ts
new file mode 100644
index 0000000..79a02d5
--- /dev/null
+++ b/packages/ui-api-client/src/auth.ts
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * Sign-in for native clients (CLI, TUI, desktop), as documented in the QQQ docs
+ * UI-API-CLIENTS.md section 7: read GET /qqq/v1/metaData/authentication, use the app's public
+ * native client (values.nativeClientId) at its issuer with the OAuth2 device-authorization grant
+ * (RFC 8628), then send the access token as `Authorization: Bearer`; refresh it at the provider.
+ */
+
+/** Tokens from the provider, with an absolute expiry. */
+export interface TokenSet {
+ accessToken: string
+ refreshToken?: string
+ idToken?: string
+ /** Epoch milliseconds when the access token expires. */
+ expiresAt: number
+ scope?: string
+}
+
+/** What a native client needs to sign in to one QQQ server. */
+export interface NativeSignInConfig {
+ /** The issuer (OIDC discovery base URL) of the native client. */
+ issuer: string
+ clientId: string
+ scope: string
+}
+
+/** The parts of an OIDC discovery document a native client uses. */
+export interface ProviderEndpoints {
+ issuer: string
+ tokenEndpoint: string
+ deviceAuthorizationEndpoint?: string
+ authorizationEndpoint?: string
+}
+
+/** What to show the user while a device sign-in waits for approval. */
+export interface DevicePrompt {
+ verificationUri: string
+ verificationUriComplete?: string
+ userCode: string
+ expiresIn: number
+}
+
+/**
+ * Reads the server's authentication metadata and returns the native client sign-in settings.
+ *
+ * @param baseUrl - The server origin, e.g. https://admin.example.com.
+ * @param fetchImpl - Optional fetch.
+ * @returns The native client config, or throws when the server has none.
+ */
+export async function getNativeSignInConfig(baseUrl: string, fetchImpl: typeof fetch = fetch): Promise {
+ const response = await fetchImpl(new URL('/qqq/v1/metaData/authentication', baseUrl))
+ if (!response.ok) throw new Error(`GET /qqq/v1/metaData/authentication answered ${response.status}`)
+ const body = await response.json() as { type?: string; values?: Record }
+ const values = body.values ?? {}
+ if (body.type !== 'OAUTH2') throw new Error(`The server uses ${body.type ?? 'unknown'} authentication; this client supports OAUTH2.`)
+ const clientId = typeof values.nativeClientId === 'string' ? values.nativeClientId : undefined
+ if (!clientId) throw new Error('The server publishes no native client (values.nativeClientId); it cannot be used from a CLI yet.')
+ const issuer = typeof values.nativeClientBaseUrl === 'string' ? values.nativeClientBaseUrl : String(values.baseUrl)
+ const scopes = new Set(String(values.scopes ?? 'openid profile email').split(/\s+/).filter(Boolean))
+ scopes.add('offline_access')
+ return { issuer, clientId, scope: [...scopes].join(' ') }
+}
+
+/**
+ * Reads the provider's OIDC discovery document.
+ *
+ * @param issuer - The issuer URL.
+ * @param fetchImpl - Optional fetch.
+ */
+export async function discoverProvider(issuer: string, fetchImpl: typeof fetch = fetch): Promise {
+ const base = issuer.endsWith('/') ? issuer : `${issuer}/`
+ const response = await fetchImpl(new URL('.well-known/openid-configuration', base))
+ if (!response.ok) throw new Error(`OIDC discovery at ${base} answered ${response.status}`)
+ const doc = await response.json() as Record
+ if (!doc.token_endpoint) throw new Error('The provider discovery document has no token_endpoint')
+ return {
+ issuer: doc.issuer ?? issuer,
+ tokenEndpoint: doc.token_endpoint,
+ deviceAuthorizationEndpoint: doc.device_authorization_endpoint,
+ authorizationEndpoint: doc.authorization_endpoint,
+ }
+}
+
+/**
+ * Signs in with the device-authorization grant (RFC 8628): asks the provider for a code, shows it
+ * through `onPrompt`, then polls the token endpoint until the user approves (or denies, or the code
+ * expires).
+ *
+ * @param config - Native client settings (see {@link getNativeSignInConfig}).
+ * @param onPrompt - Shows the verification URI and code to the user.
+ * @param options - Optional fetch, abort signal and sleep (for tests).
+ */
+export async function deviceSignIn(
+ config: NativeSignInConfig,
+ onPrompt: (prompt: DevicePrompt) => void | Promise,
+ options: { fetch?: typeof fetch; signal?: AbortSignal; sleep?: (ms: number) => Promise } = {},
+): Promise {
+ const fetchImpl = options.fetch ?? fetch
+ const sleep = options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)))
+ const endpoints = await discoverProvider(config.issuer, fetchImpl)
+ if (!endpoints.deviceAuthorizationEndpoint) throw new Error('The provider does not offer the device-authorization grant')
+
+ const start = await postForm(fetchImpl, endpoints.deviceAuthorizationEndpoint, { client_id: config.clientId, scope: config.scope }, options.signal)
+ if (!start.ok) throw new Error(`Device authorization failed: ${start.body.error_description ?? start.body.error ?? start.status}`)
+ const deviceCode = String(start.body.device_code)
+ let interval = Number(start.body.interval ?? 5)
+ const expiresIn = Number(start.body.expires_in ?? 600)
+ const deadline = Date.now() + expiresIn * 1000
+
+ await onPrompt({
+ verificationUri: String(start.body.verification_uri),
+ verificationUriComplete: start.body.verification_uri_complete ? String(start.body.verification_uri_complete) : undefined,
+ userCode: String(start.body.user_code),
+ expiresIn,
+ })
+
+ while (Date.now() < deadline) {
+ await sleep(interval * 1000)
+ if (options.signal?.aborted) throw new Error('Sign-in cancelled')
+ const poll = await postForm(fetchImpl, endpoints.tokenEndpoint, {
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
+ client_id: config.clientId,
+ device_code: deviceCode,
+ }, options.signal)
+ if (poll.ok) return toTokenSet(poll.body)
+ const error = String(poll.body.error ?? '')
+ if (error === 'authorization_pending') continue
+ if (error === 'slow_down') {
+ interval += 5
+ continue
+ }
+ throw new Error(error === 'access_denied' ? 'Sign-in was denied' : error === 'expired_token' ? 'The code expired; sign in again' : `Sign-in failed: ${poll.body.error_description ?? error ?? poll.status}`)
+ }
+ throw new Error('The code expired; sign in again')
+}
+
+/**
+ * Refreshes the access token at the provider (refresh_token grant, public client).
+ *
+ * @param config - Native client settings.
+ * @param refreshToken - The current refresh token.
+ * @param fetchImpl - Optional fetch.
+ * @returns The new tokens (keep the new refresh token: providers may rotate it).
+ */
+export async function refreshTokens(config: NativeSignInConfig, refreshToken: string, fetchImpl: typeof fetch = fetch): Promise {
+ const endpoints = await discoverProvider(config.issuer, fetchImpl)
+ const result = await postForm(fetchImpl, endpoints.tokenEndpoint, {
+ grant_type: 'refresh_token',
+ client_id: config.clientId,
+ refresh_token: refreshToken,
+ })
+ if (!result.ok) throw new Error(`Refreshing the token failed: ${result.body.error_description ?? result.body.error ?? result.status}`)
+ const tokens = toTokenSet(result.body)
+ return { ...tokens, refreshToken: tokens.refreshToken ?? refreshToken }
+}
+
+/** True when the access token expires within `skewSeconds`. */
+export function isExpiring(tokens: TokenSet, skewSeconds = 60): boolean {
+ return Date.now() + skewSeconds * 1000 >= tokens.expiresAt
+}
+
+/** The (unverified) claims of a JWT, for display only - the server is what verifies tokens. */
+export function decodeJwtClaims(jwt: string): Record {
+ const payload = jwt.split('.')[1]
+ if (!payload) return {}
+ return JSON.parse(Buffer.from(payload.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8')) as Record
+}
+
+async function postForm(fetchImpl: typeof fetch, url: string, form: Record, signal?: AbortSignal): Promise<{ ok: boolean; status: number; body: Record }> {
+ const response = await fetchImpl(url, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', Accept: 'application/json' },
+ body: new URLSearchParams(form).toString(),
+ signal,
+ })
+ let body: Record = {}
+ try {
+ body = await response.json() as Record
+ } catch {
+ body = {}
+ }
+ return { ok: response.ok, status: response.status, body }
+}
+
+function toTokenSet(body: Record): TokenSet {
+ if (typeof body.access_token !== 'string') throw new Error('The token response has no access_token')
+ return {
+ accessToken: body.access_token,
+ refreshToken: typeof body.refresh_token === 'string' ? body.refresh_token : undefined,
+ idToken: typeof body.id_token === 'string' ? body.id_token : undefined,
+ expiresAt: Date.now() + Number(body.expires_in ?? 300) * 1000,
+ scope: typeof body.scope === 'string' ? body.scope : undefined,
+ }
+}
diff --git a/packages/ui-api-client/src/client.ts b/packages/ui-api-client/src/client.ts
new file mode 100644
index 0000000..accf7f8
--- /dev/null
+++ b/packages/ui-api-client/src/client.ts
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+import createClient, { type Client, type Middleware } from 'openapi-fetch'
+import type { paths } from './schema.js'
+import { UiApiError } from './errors.js'
+
+/** The typed client: `client.GET('/qqq/v1/metaData')`, `client.POST('/qqq/v1/table/{tableName}/query', ...)`. */
+export type UiApiClient = Client
+
+/** Options for {@link createUiApiClient}. */
+export interface UiApiClientOptions {
+ /** The server origin, e.g. https://admin.example.com (paths already include /qqq/v1). */
+ baseUrl: string
+ /** Returns the bearer token (an OAuth2 access token or a session UUID) for each request. */
+ token?: () => string | undefined | Promise
+ /** Called once on a 401; return true when it refreshed the token, to retry the request. */
+ onUnauthorized?: () => boolean | Promise
+ /** The client channel (X-QQQ-Client), e.g. `cli/qqq-cli 0.1.0`. */
+ clientChannel?: string
+ /** Optional fetch (tests, proxies). */
+ fetch?: typeof fetch
+ /** Extra headers on every request (e.g. a load-balancer affinity cookie). */
+ headers?: Record
+}
+
+/**
+ * Creates a typed UI API client. Every operation of the merged document (core and extensions) is a
+ * typed call; errors come back as `error` (BasicErrorResponseV1) - use {@link unwrap} to throw
+ * {@link UiApiError} instead.
+ *
+ * @param options - Server, token and channel.
+ */
+export function createUiApiClient(options: UiApiClientOptions): UiApiClient {
+ const baseFetch = options.fetch ?? fetch
+ const authedFetch: typeof fetch = async (input, init) => {
+ const request = new Request(input as RequestInfo, init)
+ const send = async (): Promise => {
+ const attempt = request.clone()
+ const token = await options.token?.()
+ if (token) attempt.headers.set('Authorization', `Bearer ${token}`)
+ return baseFetch(attempt)
+ }
+ let response = await send()
+ if (response.status === 401 && options.onUnauthorized && await options.onUnauthorized()) {
+ response = await send()
+ }
+ return response
+ }
+
+ const client = createClient({ baseUrl: options.baseUrl.replace(/\/$/, ''), fetch: authedFetch })
+ const headers: Middleware = {
+ onRequest({ request }) {
+ if (options.clientChannel) request.headers.set('X-QQQ-Client', options.clientChannel)
+ for (const [name, value] of Object.entries(options.headers ?? {})) request.headers.set(name, value)
+ if (!request.headers.has('Accept')) request.headers.set('Accept', 'application/json')
+ return request
+ },
+ }
+ client.use(headers)
+ return client
+}
+
+/**
+ * Returns the data of a call, or throws {@link UiApiError} for an error answer.
+ *
+ * @param result - What a client call returned.
+ */
+export async function unwrap(result: Promise<{ data?: T; error?: unknown; response: Response }> | { data?: T; error?: unknown; response: Response }): Promise {
+ const { data, error, response } = await result
+ if (!response.ok || error !== undefined) {
+ throw new UiApiError(response.status, error, response.headers.get('X-QQQ-Trace-Id'))
+ }
+ return data as T
+}
diff --git a/packages/ui-api-client/src/errors.ts b/packages/ui-api-client/src/errors.ts
new file mode 100644
index 0000000..120bb99
--- /dev/null
+++ b/packages/ui-api-client/src/errors.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/** One error about a request field (BasicErrorResponseV1.fieldErrors). */
+export interface UiApiFieldError {
+ field: string
+ message: string
+ code?: string
+}
+
+/**
+ * An error answer of the UI API. Every operation answers errors with BasicErrorResponseV1:
+ * `{ error, code, message, fieldErrors[], traceId }` (code, message, fieldErrors and traceId since
+ * UI API 1.6.0; older servers send only `error`).
+ */
+export class UiApiError extends Error {
+ readonly status: number
+ readonly code: string
+ readonly traceId?: string
+ readonly fieldErrors: UiApiFieldError[]
+ readonly body: unknown
+
+ constructor(status: number, body: unknown, traceIdHeader?: string | null) {
+ const b = (body && typeof body === 'object' ? body : {}) as Record
+ const message = typeof b.message === 'string' ? b.message : typeof b.error === 'string' ? b.error : `HTTP ${status}`
+ super(message)
+ this.name = 'UiApiError'
+ this.status = status
+ this.code = typeof b.code === 'string' ? b.code : codeForStatus(status)
+ this.traceId = typeof b.traceId === 'string' ? b.traceId : traceIdHeader ?? undefined
+ this.fieldErrors = Array.isArray(b.fieldErrors) ? (b.fieldErrors as UiApiFieldError[]) : []
+ this.body = body
+ }
+}
+
+/** The well-known code for an HTTP status (what a pre-1.6.0 server would have meant). */
+export function codeForStatus(status: number): string {
+ switch (status) {
+ case 400: return 'BAD_REQUEST'
+ case 401: return 'UNAUTHENTICATED'
+ case 403: return 'PERMISSION_DENIED'
+ case 404: return 'NOT_FOUND'
+ case 409: return 'CONFLICT'
+ case 429: return 'RATE_LIMITED'
+ case 500: return 'INTERNAL_ERROR'
+ default: return 'ERROR'
+ }
+}
diff --git a/packages/ui-api-client/src/index.ts b/packages/ui-api-client/src/index.ts
new file mode 100644
index 0000000..c4b0171
--- /dev/null
+++ b/packages/ui-api-client/src/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+export { createUiApiClient, unwrap } from './client.js'
+export type { UiApiClient, UiApiClientOptions } from './client.js'
+export { UiApiError, codeForStatus } from './errors.js'
+export type { UiApiFieldError } from './errors.js'
+export { getNativeSignInConfig, discoverProvider, deviceSignIn, refreshTokens, isExpiring, decodeJwtClaims } from './auth.js'
+export type { TokenSet, NativeSignInConfig, ProviderEndpoints, DevicePrompt } from './auth.js'
+export { openRealtimeStream, parseEventBlock } from './realtime.js'
+export type { RealtimeMessage, RealtimeStreamOptions } from './realtime.js'
+export type { paths, components, operations } from './schema.js'
+
+/** The UI API version this client was generated from (info.version of the merged document). */
+export const UI_API_VERSION = '1.6.0'
diff --git a/packages/ui-api-client/src/realtime.ts b/packages/ui-api-client/src/realtime.ts
new file mode 100644
index 0000000..c2c0877
--- /dev/null
+++ b/packages/ui-api-client/src/realtime.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/** One server-sent event of GET /qqq/v1/realtime/stream (RealtimeEventV1 in `data`). */
+export interface RealtimeMessage {
+ id?: string
+ event: string
+ data: unknown
+}
+
+/** Options for {@link openRealtimeStream}. */
+export interface RealtimeStreamOptions {
+ baseUrl: string
+ token?: () => string | undefined | Promise
+ clientChannel?: string
+ lastEventId?: string
+ signal?: AbortSignal
+ fetch?: typeof fetch
+}
+
+/**
+ * Opens the realtime event stream and yields its events. The first event is `hello`, whose data
+ * carries the connectionId to send to POST /qqq/v1/realtime/subscriptions (the subscriptions belong
+ * to this connection and its session). Comment pings are skipped. The generator ends when the
+ * server closes the stream (e.g. `session.ended`) or the signal aborts.
+ *
+ * Works with bearer tokens, unlike the browser EventSource (which cannot send headers).
+ *
+ * @param options - Server, token and optional Last-Event-ID.
+ */
+export async function* openRealtimeStream(options: RealtimeStreamOptions): AsyncGenerator {
+ const headers: Record = { Accept: 'text/event-stream' }
+ const token = await options.token?.()
+ if (token) headers.Authorization = `Bearer ${token}`
+ if (options.clientChannel) headers['X-QQQ-Client'] = options.clientChannel
+ if (options.lastEventId) headers['Last-Event-ID'] = options.lastEventId
+
+ const response = await (options.fetch ?? fetch)(new URL('/qqq/v1/realtime/stream', options.baseUrl), { headers, signal: options.signal })
+ if (!response.ok || !response.body) throw new Error(`GET /qqq/v1/realtime/stream answered ${response.status}`)
+
+ const decoder = new TextDecoder()
+ let buffer = ''
+ for await (const chunk of response.body as unknown as AsyncIterable) {
+ buffer += decoder.decode(chunk, { stream: true })
+ let boundary: number
+ while ((boundary = buffer.search(/\r?\n\r?\n/)) >= 0) {
+ const block = buffer.slice(0, boundary)
+ buffer = buffer.slice(boundary).replace(/^\r?\n\r?\n/, '')
+ const message = parseEventBlock(block)
+ if (message) yield message
+ }
+ }
+}
+
+/**
+ * Parses one SSE block (lines up to a blank line). Returns undefined for comments-only blocks.
+ *
+ * @param block - The raw lines.
+ */
+export function parseEventBlock(block: string): RealtimeMessage | undefined {
+ let id: string | undefined
+ let event = 'message'
+ const data: string[] = []
+ for (const line of block.split(/\r?\n/)) {
+ if (!line || line.startsWith(':')) continue
+ const colon = line.indexOf(':')
+ const field = colon < 0 ? line : line.slice(0, colon)
+ const value = colon < 0 ? '' : line.slice(colon + 1).replace(/^ /, '')
+ if (field === 'id') id = value
+ else if (field === 'event') event = value
+ else if (field === 'data') data.push(value)
+ }
+ if (data.length === 0 && event === 'message') return undefined
+ const text = data.join('\n')
+ let parsed: unknown = text
+ try {
+ parsed = text ? JSON.parse(text) : undefined
+ } catch {
+ parsed = text
+ }
+ return { id, event, data: parsed }
+}
diff --git a/packages/ui-api-client/src/schema.ts b/packages/ui-api-client/src/schema.ts
new file mode 100644
index 0000000..db07a10
--- /dev/null
+++ b/packages/ui-api-client/src/schema.ts
@@ -0,0 +1,25726 @@
+/**
+ * This file was auto-generated by openapi-typescript.
+ * Do not make direct changes to the file.
+ */
+
+export interface paths {
+ "/qqq/v1/version": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get the UI API version
+ * @description Describes the semantic version of this UI API (MAJOR.MINOR.PATCH, where MAJOR matches the URL
+ * version), the optional core features the server supports, and the extensions (modules and qbits)
+ * registered on it, each with its own semantic version.
+ *
+ * A client should call this first, before authentication, and stop with a clear message when
+ * apiVersion is outside the range it supports. Not secured.
+ */
+ get: operations["getVersion"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/realtime/stream": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Open the realtime event stream
+ * @description SSE invalidation hints. Each event has id :, an event name and JSON data. hello identifies the connection; comment pings maintain it. Last-Event-ID replays retained events on the same pod and session, otherwise resync asks clients to refetch. Core event payloads use the Realtime*EventV1 components. job.progress uses RealtimeJobProgressEventV1; an advancing logSeq tells clients to poll the job log. Qbits publish through RealtimeBus with their own event names, such as presence.changed and comment.added, described by RealtimeEventV1. Subscriptions require a separate POST; session-ended closes the stream and channel-revoked removes a subscription.
+ */
+ get: operations["openRealtimeStream"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/realtime/subscriptions": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Change realtime subscriptions
+ * @description Add or remove record:{table}:{pk}, table:{table}, user:me, or instance channels. Records require a permission-checked GetAction and tables require READ. Refusals give no reason. The connection must belong to the authenticated session; otherwise 404. Active user channels are returned as user:me. Channel limits apply.
+ */
+ post: operations["updateRealtimeSubscriptions"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/metaData/authentication": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get authentication metaData
+ * @description For a frontend to determine which authentication provider or mechanism to use, it should begin its lifecycle
+ * by requesting this metaData object, and inspecting the `type` property in the response.
+ *
+ * Note that this endpoint is not secured, as its purpose is to be called as part of the workflow that results
+ * in a user being authenticated.
+ */
+ get: operations["getAuthenticationMetaData"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/branding/{role}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a branding image
+ * @description The image the app declares for a branding role (`logo` or `icon`), from the application's
+ * static overlay, available before sign-in. 404 when the app declares none for the role, or
+ * declares a data: URI or an external URL (those are in `branding` of GET /metaData/authentication).
+ * Since 1.6.0.
+ */
+ get: operations["getBrandingAsset"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/manageSession": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Create a session
+ * @description After a frontend authenticates the user as per the requirements of the authentication provider specified by the
+ * `type` field in the `metaData/authentication` response, data from that authentication provider should be posted
+ * to this endpoint, to create a session within the QQQ application.
+ *
+ * The response object will include a session identifier (`uuid`) to authenticate the user in subsequent API calls.
+ *
+ * For the `TABLE_BASED` type, send the user's credentials in an `Authorization: Basic` header (base64 of
+ * `username:password`, UTF-8); the body may be empty. The password is verified against the user table and a
+ * session row is stored; a `401` response means the credentials were refused.
+ *
+ * To resume the session the browser already holds (for example after a page reload), post an empty object:
+ * a request with no credentials and no `sessionUUID` resumes the session named by the `sessionUUID` cookie,
+ * which may be `HttpOnly`. That response carries the session's `values` but not its `uuid`; a `401`
+ * response means there is no valid session to resume.
+ */
+ post: operations["manageSession"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/logout": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Logout and invalidate session
+ * @description Invalidates the current session server-side, deleting it from the session store
+ * and clearing any cached data. The session cookie is also removed.
+ *
+ * Frontends should call this endpoint before performing client-side logout
+ * (clearing localStorage, redirecting to IdP logout, etc.) to ensure the
+ * session cannot be resumed.
+ */
+ post: operations["logout"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/oidc/backchannel-logout": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * OIDC Back-Channel Logout
+ * @description Receives logout notifications from the Identity Provider (IdP) when a user
+ * logs out from the IdP or another application in the SSO ecosystem.
+ *
+ * The IdP sends a POST request with a 'logout_token' JWT parameter containing
+ * either a 'sub' (subject) or 'sid' (session ID) claim. QQQ validates the RS256
+ * signature against the configured OAuth2 provider's discovered JWKS, issuer,
+ * client audience, logout event and timestamps before deleting matching sessions
+ * from the configured session table. Both subject and session ID must match when
+ * both are present. Invalid tokens or unsupported configuration return HTTP 400.
+ *
+ * This endpoint should be registered with your IdP as the back-channel logout URI.
+ */
+ post: operations["oidcBackChannelLogout"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/metaData": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get instance metaData
+ * @description Load the overall metadata, as is relevant to a frontend, for the entire application, with permissions applied, as per the
+ * authenticated user.
+ *
+ * This includes:
+ * - Apps (both as a map of name to AppMetaData (`apps`), but also as a tree (`appTree`), for presenting
+ * hierarchical navigation),
+ * - Tables (but without all details, e.g., fields),
+ * - Processes (also without full details, e.g., screens),
+ * - Reports
+ * - Widgets
+ * - Branding
+ * - Help Contents
+ * - Environment values
+ */
+ get: operations["getMetaData"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/preferences": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List visible sections and the signed-in user's preferences
+ * @description Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.
+ */
+ get: operations["listPreferenceSections"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/delivery/destinations": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List authorized output destinations */
+ get: operations["listDeliveryDestinations"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/delivery/destinations/{name}/targets": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Describe the next delivery target */
+ post: operations["chooseDeliveryTargets"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/delivery/output/{logId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Download stored output as its owner or delivery administrator */
+ get: operations["getDeliveryOutput"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/preferences/{sectionName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read one visible section for the signed-in user
+ * @description Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.
+ */
+ get: operations["getPreferenceSection"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ /**
+ * Partially update the signed-in user's preferences
+ * @description Preferences always belong to the authenticated session user. No user identifier is accepted. Unknown or hidden sections return 404; unauthenticated requests return 401. PATCH changes only supplied fields and fixed rows; invalid changes return 400 with all messages before anything is stored. Writes are audited as the user and client channel.
+ */
+ patch: operations["updatePreferenceSection"];
+ trace?: never;
+ };
+ "/qqq/v1/preferences/{sectionName}/actions/{actionName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Run an action on the signed-in user's preferences
+ * @description Runs a registered action for the authenticated session user. ROW actions target only rows loaded for that user and allowed by actionNames. Unknown actions or hidden sections return 404; invalid inputs return 400; unauthenticated requests return 401. Clients must confirm confirmationText before running. Secrets are shown once and must not be stored, logged, cached, or sent to analytics by clients. Responses use Cache-Control: no-store.
+ */
+ post: operations["runPreferenceSectionAction"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/metaData/table/{tableName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get table metaData
+ * @description Load the full metadata for a single table, including all fields, which a frontend
+ * needs to display to users.
+ */
+ get: operations["getTableMetaData"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/query": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Query for records from a table
+ * @description Execute a query against a table, returning records that match a filter.
+ */
+ post: operations["queryTable"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/count": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Count records in a table
+ * @description Execute a query against a table, returning the number of records that match a filter.
+ */
+ post: operations["countTable"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/search": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Search records across tables
+ * @description Search for records whose search fields (declared per table in its meta-data, and listed as `searchFields` in the
+ * table meta-data) match a search term. String fields match when they contain the term, ignoring case; integer
+ * fields match when they equal a numeric term. Only tables that the user has permission to read are searched,
+ * record security locks apply, and each table returns at most `limitPerTable` records (default 5, maximum 25), after skipping `offset` matches in each table (for paging one table). An instance may have a record search
+ * provider (e.g., a search index) that searches some tables instead; if it fails, those tables are searched with
+ * the default search, and the response's `provider` and `tables` say so.
+ *
+ * Each result can carry plain-text `highlights` of the fields that match (with the matched spans as character
+ * offsets - never markup), `details` (other search field values), `updatedAt` and, from a provider, a `score`.
+ * Only fields the user may see are used. All of these, and `tables` and `provider`, are optional: clients must
+ * tolerate their absence.
+ */
+ post: operations["searchRecords"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/help/search": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Search visible application help
+ * @description Search help visible to the session. Label hits weigh 3, summary hits 2 and content hits 1. Stable ties sort by kind and key. Limit defaults to 20 and is capped at 50.
+ */
+ get: operations["searchHelp"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/help/coverage": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Inspect application help coverage
+ * @description Requires INSERT or EDIT permission on helpContent. Includes hidden targets. Totals reflect kind and parent scope before missingOnly is applied.
+ */
+ get: operations["getHelpCoverage"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/variants": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List a table's backend variants
+ * @description List the variants a table's backend can be scoped to (for example one data set per store). Requires read
+ * permission on the table and on the backend's variant options table.
+ */
+ get: operations["listTableVariants"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/apis": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List the APIs that expose a table
+ * @description The application APIs (served by the API middleware beside this one) that expose the table, with each API's versions and the root-relative path of the table's OpenAPI document in each version. Empty when the application serves no APIs. The caller must be allowed to read the table.
+ */
+ get: operations["listTableApis"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a record from a table by primary key
+ * @description Fetch a single record from a table, identified by its primary key value.
+ */
+ get: operations["getRecord"];
+ put?: never;
+ post?: never;
+ /**
+ * Delete a record from a table
+ * @description Delete a single record from a table, identified by its primary key value.
+ */
+ delete: operations["deleteRecord"];
+ options?: never;
+ head?: never;
+ /**
+ * Update a record in a table
+ * @description Update an existing record in a table, identified by its primary key. The request body should contain the field values to update.
+ */
+ patch: operations["updateRecord"];
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/features": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get record collaboration features
+ * @description Features and capabilities for a visible record, with optional summary provider contributions.
+ */
+ get: operations["getRecordFeatures"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/formAdjuster/{identifier}/{event}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Run a form adjuster
+ * @description Run one of a table form's adjusters and return the changes to apply to the form. The identifier is `table:{tableName}` for the table's on-load adjuster, or a field's `formAdjusterIdentifier` (from its `materialDashboard` supplemental metadata) for that field's adjusters. The caller must be allowed to insert or edit records in the table. Answers 404 when the application registers no form adjusters.
+ */
+ post: operations["runFormAdjuster"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/apis/{apiName}/{version}/openapi": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a table's OpenAPI document in an application API
+ * @description The OpenAPI 3 document of the table in one version of an application API that exposes it (as listed by `GET /table/{tableName}/apis`). The caller must be allowed to read the table. Answers 404 when no API by that name exposes the table in that version.
+ */
+ get: operations["getTableApiDocument"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Insert a record into a table
+ * @description Insert a new record into a table. The request body should contain the field values for the new record.
+ */
+ post: operations["insertRecord"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/query": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Query the records a related-record picker offers
+ * @description Lists one page of the picker's target records as the user may read them: the user's filter (the target table's own filter builder or a saved view), ANDed with the picker's filter (resolved from the parent record or form values) and the search term. Needs READ on the target table; table permissions, record security locks and field security locks apply as on the table query route. Reads limit + 1 rows for hasMore (no count). For MULTI_CHILD and LINK with a primaryKey, linkedIds says which returned records the parent already has rows for.
+ */
+ post: operations["queryRelatedRecordPicker"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/prepare": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Prepare child rows for picked records (MULTI_CHILD, LINK)
+ * @description Builds, without saving, one child row per picked target: the picker's child field defaults, values copied from the target, and the parent and target keys. The client shows the reviewFieldNames of each row for the user to fill, then calls add. Needs INSERT on the child table; every target must be available through the picker's query (else 400).
+ */
+ post: operations["prepareRelatedRecordPicker"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/add": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Add child or join rows for picked records (MULTI_CHILD, LINK)
+ * @description Inserts one row per picked target (targetIds) or per reviewed row (records), all or nothing, through the standard insert action: INSERT permission on the child table, record security locks, validation, customizers, automations and audit. Only the picker's review fields are taken from the client; the parent and target keys always come from the server. Every target must be available through the picker's query (else 400). Row errors are a 400 naming each row, and nothing is saved.
+ */
+ post: operations["addRelatedRecords"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/relatedRecordPicker/{pickerName}/remove": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Unlink picked records (LINK)
+ * @description Deletes the parent's join rows for the given targets through the standard delete action (DELETE permission on the join table, record security locks, audit). Only for LINK pickers (else 400); child rows of a MULTI_CHILD picker are deleted with the table delete route.
+ */
+ post: operations["removeRelatedRecords"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a record's associated scripts (developer mode)
+ * @description Fetch a single record (with display values), along with each of its table's associated scripts:
+ * the script type, the script that the record references (if any) with its revisions (newest first),
+ * and, for scripts that can be tested, the fields to test them with.
+ *
+ * Requires permission to read records from the table. If the record is not found, a 404 is returned.
+ */
+ get: operations["getRecordDeveloperMode"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/panels": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a record's developer panels
+ * @description Fetch the panels shown on a record's developer view: one per developer panel provider (built in, or
+ * registered by modules and qbits in the instance's developerPanels supplemental meta-data) that is available
+ * for this table and record for the current user - for example record security, ESB events, quick search
+ * indexing, or SQL workbench queries.
+ *
+ * Requires permission to read records from the table, and the record must be visible under its record
+ * security locks. If the record is not found, a 404 is returned. A provider that fails yields a panel
+ * with an error message rather than failing the request.
+ */
+ get: operations["listRecordDeveloperPanels"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/associatedScript/{fieldName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Store a new revision of a record's associated script (developer mode)
+ * @description Save new contents for the script that a record references in one of its table's associated script
+ * fields, as a new revision of that script. If the record does not yet reference a script, one is
+ * inserted (and the record is updated to reference it).
+ *
+ * Requires permission to edit records in the table.
+ */
+ post: operations["storeAssociatedScript"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/developer/associatedScript/{fieldName}/{scriptRevisionId}/logs": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get the logs of a record's associated script revision (developer mode)
+ * @description Fetch the logs (up to 100, newest first) of runs of a script revision, each with its log lines.
+ *
+ * Requires permission to read records from the table, and the record must exist (else a 404 is returned).
+ */
+ get: operations["getAssociatedScriptLogs"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/possibleValues/{fieldName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Search possible values for a table field
+ * @description Search for possible values associated with a field on a table.
+ * Returns a list of id/label pairs that match the given search criteria.
+ */
+ post: operations["searchTablePossibleValues"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/possibleValues/{fieldName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Search possible values for a process field
+ * @description Search for possible values associated with an input field on a process.
+ * Returns a list of id/label pairs that match the given search criteria.
+ */
+ post: operations["searchProcessPossibleValues"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/possibleValues/{possibleValueSourceName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Search a standalone possible value source
+ * @description Search for possible values from a standalone possible value source
+ * (not associated with a specific table or process field).
+ * Returns a list of id/label pairs that match the given search criteria.
+ */
+ post: operations["searchPossibleValues"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/widget/{widgetName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Render a widget
+ * @description Render a widget by name, passing in query parameters as a JSON object in the request body.
+ * The response shape varies by widget type.
+ */
+ post: operations["getWidgetData"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/metaData/process/{processName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get process metaData
+ * @description Load the full metadata for a single process, including all screens (aka, frontend steps), which a frontend
+ * needs to display to users.
+ */
+ get: operations["getProcessMetaData"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/init": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Initialize a process
+ * @description For a user to start running a process, this endpoint should be called, to start the process
+ * and run its first step(s) (any backend steps before the first frontend step).
+ *
+ * Additional process-specific values should posted in a form param named `values`, as JSON object
+ * with keys defined by the process in question.
+ *
+ * For a process which needs to operate on a set of records that a user selected, see
+ * `recordsParam`, and `recordIds` or `filterJSON`.
+ *
+ * The response will include a `processUUID`, to be included in all subsequent requests relevant
+ * to the process.
+ *
+ * Note that this request, if it takes longer than a given threshold* to complete, will return a
+ * a `jobUUID`, which should be sent to the `/processes/{processName}/{processUUID}/status/{jobUUID}`
+ * endpoint, to poll for a status update.
+ *
+ * *This threshold has a default value of 3,000 ms., but can be set per-request via the form
+ * parameter `stepTimeoutMillis`.
+ */
+ post: operations["initProcess"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/{processUUID}/step/{stepName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Run a step in a process
+ * @description To run the next step in a process, this endpoint should be called, with the `processName`
+ * and existing `processUUID`, as well as the step that was just completed in the frontend,
+ * given as `stepName`.
+ *
+ * Additional process-specific values should posted in a form param named `values`, as JSON object
+ * with keys defined by the process in question.
+ *
+ * Note that this request, if it takes longer than a given threshold* to complete, will return a
+ * a `jobUUID`, which should be sent to the `/processes/{processName}/{processUUID}/status/{jobUUID}`
+ * endpoint, to poll for a status update.
+ *
+ * *This threshold has a default value of 3,000 ms., but can be set per-request via the form
+ * parameter `stepTimeoutMillis`.
+ */
+ post: operations["stepProcess"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/{processUUID}/status/{jobUUID}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get job status
+ * @description Get the status of a running job for a process.
+ *
+ * Response is the same format as for an init or step call that completed synchronously.
+ */
+ get: operations["getProcessStatus"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/{processUUID}/records": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get records from a process
+ * @description Retrieve the records associated with a running or completed process, with support
+ * for pagination via skip and limit query parameters.
+ */
+ get: operations["getProcessRecords"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/{processUUID}/cancel": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Cancel a running process
+ * @description Cancel a running process. If the process defines a cancel step, it will be executed.
+ */
+ post: operations["cancelProcess"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/processes/{processName}/jobs": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Run a process as a durable background job
+ * @description Launch an eligible process as a durable job: it survives pod restarts, runs in checkpointed chunks under leases, and can be paused, resumed, cancelled, restarted and retried with the job control processes on the jobs_job table. Values for the process's frontend steps are given up front. The job runs with the caller's permissions (never more). A launch from the assistant client channel waits for confirmation (status AWAITING_CONFIRMATION). Progress arrives as job.progress and job.status events on the realtime channel record:jobs_job:{jobId}.
+ */
+ post: operations["launchProcessJob"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Jobs: list
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ get: operations["listJobs"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs/{jobId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Jobs: detail
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ get: operations["getJob"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs/{jobId}/progress": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Jobs: progress
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ get: operations["getJobProgress"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs/{jobId}/cancel": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Jobs: cancel
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ post: operations["cancelJob"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs/{jobId}/retry": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Jobs: retry
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ post: operations["retryJob"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/jobs/track": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Jobs: track
+ * @description Requires jobs_job.read and the job owner lock; jobs_admin can see all jobs. Hidden jobs return 404; invalid transitions return 409. Progress polls include a twenty-id overlap for concurrent commits; deduplicate log lines by id. Recent jobs finished in the last seven days.
+ */
+ post: operations["trackJob"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/uploads": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Upload a file for a job or a bulk load
+ * @description Streams a file into the application's uploads storage and returns an opaque, expiring ref bound to the caller. Pass the ref in uploadRefs when launching a job (POST /processes/{processName}/jobs). Send multipart form data with one file field, or the raw file as the request body with the fileName query parameter.
+ */
+ post: operations["upload"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/export": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Export records from a table
+ * @description Export records from a table as a downloadable file in the specified format (CSV, XLSX, JSON, TSV).
+ */
+ post: operations["exportTable"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/table/{tableName}/{primaryKey}/{fieldName}/{filename}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Download a field value from a record
+ * @description Download the binary content of a blob field from a specific record.
+ */
+ get: operations["downloadRecordFieldFile"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/download/{file}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Download a file
+ * @description Download a file from server-side storage by file path or storage table reference.
+ */
+ get: operations["download"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/reports/{reportName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Run a report and download the file
+ * @description Run a report and stream the generated file in the requested format. The report's input fields are given as
+ * query parameters named for the fields; a missing required input is a 400. Requires permission to run the report.
+ */
+ get: operations["runReport"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/bulkLoad/uploads/{uploadRef}/profile": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Profile an uploaded file for a bulk load
+ * @description Read an uploaded file (by its upload ref, which must be the session user's) and describe it for a bulk load into a table: whether row 1 is a header row, and each column's inferred type, percent blank, distinct count, maximum length and pattern class. Sample values are included only for columns mapped to an unclassified (or PUBLIC) field, or for every column when the request's `X-QQQ-AI-Route` header is `hipaa`; unmapped columns never get samples otherwise. Requires the table's bulk-insert process permission. Nothing is stored.
+ */
+ get: operations["getBulkLoadUploadProfile"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/bulkLoad/{tableName}/suggestMapping": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Suggest a bulk load mapping for an uploaded file
+ * @description Run the bulk load mapping suggester over an uploaded file's header row and return a v1 bulk load profile, the file columns it leaves unmapped, the required fields it does not fill, and the mapped fields with a possible value source (whose file values may need value mapping). The upload must be the session user's. Requires the table's bulk-insert process permission. Nothing is stored.
+ */
+ post: operations["suggestBulkLoadMapping"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/bulkLoad/{tableName}/validate": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Dry-run a bulk load profile over an uploaded file
+ * @description Run the table's bulk-insert process over an uploaded file with the given v1 bulk load profile - the same mapping, value mapping and validation a real load uses - and stop at its review step, so nothing is stored. SAMPLE validates the first 100 rows; FULL the whole file. Returns the standard process summary lines, counts, and error groups with row numbers. Values of classified fields are left out unless the request's `X-QQQ-AI-Route` header is `hipaa`. The upload must be the session user's. Requires the table's bulk-insert process permission.
+ */
+ post: operations["validateBulkLoad"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/esb/overview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * ESB overview
+ * @description Every broker connection and destination, with the tables and processes publishing to each and the triggers consuming it, and what the user may do. Needs the ESB app permission.
+ */
+ get: operations["getEsbOverview"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/esb/table/{table}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * ESB of a table
+ * @description The destinations a table publishes its events to, the triggers subscribed to them (on processes the user can access), and what the user may do. Needs READ on the table.
+ */
+ get: operations["getEsbTableByTable"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/esb/process/{process}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * ESB of a process
+ * @description The destinations a process publishes its lifecycle events to, the triggers that run it, and what the user may do. Needs access to the process.
+ */
+ get: operations["getEsbProcessByProcess"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/esb/deadLetters/{trigger}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Dead letters of a trigger
+ * @description A page of the messages on a trigger dead-letter destination, oldest first. Needs the operate permission.
+ */
+ get: operations["getEsbDeadLettersByTrigger"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/esb/messages/{destination}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Messages on a destination
+ * @description A page of the messages waiting on a destination (or, with trigger, on that trigger subscription of a topic), oldest first. Needs the operate permission.
+ */
+ get: operations["getEsbMessagesByDestination"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/health/summary": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Health summary
+ * @description Requires health.read permission. Returns redacted health state.
+ */
+ get: operations["getHealthSummary"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/health/components/{name}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Health component
+ * @description Requires health.read permission. Returns redacted health state.
+ */
+ get: operations["getHealthComponentsByName"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/health/checks/{name}/history": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Health history
+ * @description Requires health.read permission. Returns redacted health state.
+ */
+ get: operations["getHealthChecksByNameHistory"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/health/checks/{name}/run": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Health run
+ * @description Requires health.write permission. Returns redacted health state.
+ */
+ post: operations["postHealthChecksByNameRun"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/inbox/summary": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read the bell summary
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["alertsInboxSummary"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/inbox": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Page the notification inbox
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["alertsInbox"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/inbox/read": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Mark own notifications read
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["alertsInboxRead"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/inbox/unread": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Mark own notifications unread
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["alertsInboxUnread"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/inbox/dismiss": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Dismiss own notifications
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["alertsInboxDismiss"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/alerts/record-panel": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read visible alerts for a record
+ * @description Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["alertsRecordPanel"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/config": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Whether the assistant is available to this user, its persona and limits
+ * @description Whether the assistant is available to this user, its persona and limits
+ */
+ get: operations["getAssistantConfig"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/conversations": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * The user's own conversations
+ * @description The user's own conversations
+ */
+ get: operations["getAssistantConversations"];
+ put?: never;
+ /**
+ * Start a conversation
+ * @description Start a conversation
+ */
+ post: operations["postAssistantConversations"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/conversations/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * A conversation and a page of its messages
+ * @description A conversation and a page of its messages
+ */
+ get: operations["getAssistantConversationsById"];
+ put?: never;
+ post?: never;
+ /**
+ * Delete a conversation
+ * @description Delete a conversation
+ */
+ delete: operations["deleteAssistantConversationsById"];
+ options?: never;
+ head?: never;
+ /**
+ * Rename, pin or archive a conversation
+ * @description Rename, pin or archive a conversation
+ */
+ patch: operations["patchAssistantConversationsById"];
+ trace?: never;
+ };
+ "/qqq/v1/assistant/conversations/{id}/turns": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Ask: start a turn and stream the reply as server-sent events
+ * @description Ask: start a turn and stream the reply as server-sent events
+ */
+ post: operations["postAssistantConversationsByIdTurns"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/turns/{turnId}/events": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Resume a turn's events after a sequence number (replay, then the live tail)
+ * @description Resume a turn's events after a sequence number (replay, then the live tail)
+ */
+ get: operations["getAssistantTurnsByTurnIdEvents"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/turns/{turnId}/cancel": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Stop a running turn
+ * @description Stop a running turn
+ */
+ post: operations["postAssistantTurnsByTurnIdCancel"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/turns/active": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Find the user's active assistant runs
+ * @description Find the user's active assistant runs
+ */
+ get: operations["getAssistantTurnsActive"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/messages/{id}/feedback": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Thumbs up or down on an assistant message
+ * @description Thumbs up or down on an assistant message
+ */
+ post: operations["postAssistantMessagesByIdFeedback"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/actions/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * A write the assistant proposed, and its state
+ * @description A write the assistant proposed, and its state
+ */
+ get: operations["getAssistantActionsById"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/actions/{id}/confirm": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Confirm a proposed write: it runs once, through the UI API, with this request's session
+ * @description Confirm a proposed write: it runs once, through the UI API, with this request's session
+ */
+ post: operations["postAssistantActionsByIdConfirm"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/actions/{id}/reject": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Cancel a proposed write; nothing changes
+ * @description Cancel a proposed write; nothing changes
+ */
+ post: operations["postAssistantActionsByIdReject"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/assistant/access": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Explain access: which UI API operations the assistant could call for this user, and why not
+ * @description Explain access: which UI API operations the assistant could call for this user, and why not
+ */
+ get: operations["getAssistantAccess"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/presence": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get presence snapshot
+ * @description Get presence snapshot. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationPresence"];
+ put?: never;
+ /**
+ * Renew presence
+ * @description Renew presence. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationPresence"];
+ /**
+ * Leave presence
+ * @description Leave presence. Uses the signed-in caller's permissions and record visibility.
+ */
+ delete: operations["deleteQbitCollaborationPresence"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/favorites": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List personal favorites
+ * @description List personal favorites. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationFavorites"];
+ /**
+ * Star a target
+ * @description Star a target. Uses the signed-in caller's permissions and record visibility.
+ */
+ put: operations["putQbitCollaborationFavorites"];
+ post?: never;
+ /**
+ * Unstar a target
+ * @description Unstar a target. Uses the signed-in caller's permissions and record visibility.
+ */
+ delete: operations["deleteQbitCollaborationFavorites"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/recents": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List recent targets
+ * @description List recent targets. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecents"];
+ put?: never;
+ /**
+ * Record a recent view
+ * @description Record a recent view. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecents"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/favorites/order": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ /**
+ * Reorder personal favorites
+ * @description Reorder personal favorites. Uses the signed-in caller's permissions and record visibility.
+ */
+ patch: operations["patchQbitCollaborationFavoritesOrder"];
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/attachments": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List record attachments
+ * @description List record attachments. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkAttachments"];
+ put?: never;
+ /**
+ * Upload an attachment
+ * @description Upload an attachment. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecordsByTableByPkAttachments"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/attachments/{id}/download": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a temporary download URL; clients follow url
+ * @description Get a temporary download URL; clients follow url. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationAttachmentsByIdDownload"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/attachments/{id}/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a temporary preview URL; clients follow url
+ * @description Get a temporary preview URL; clients follow url. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationAttachmentsByIdPreview"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/attachments/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ /**
+ * Delete an attachment
+ * @description Delete an attachment. Uses the signed-in caller's permissions and record visibility.
+ */
+ delete: operations["deleteQbitCollaborationAttachmentsById"];
+ options?: never;
+ head?: never;
+ /**
+ * Rename or describe an attachment
+ * @description Rename or describe an attachment. Uses the signed-in caller's permissions and record visibility.
+ */
+ patch: operations["patchQbitCollaborationAttachmentsById"];
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/tags": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Search table tag vocabulary
+ * @description Search table tag vocabulary. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationTags"];
+ put?: never;
+ /**
+ * Create or suggest a tag
+ * @description Create or suggest a tag. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationTags"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/tags": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List applied record tags
+ * @description List applied record tags. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkTags"];
+ /**
+ * Add and remove record tags
+ * @description Add and remove record tags. Uses the signed-in caller's permissions and record visibility.
+ */
+ put: operations["putQbitCollaborationRecordsByTableByPkTags"];
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/comments": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Page record comment threads
+ * @description Page record comment threads. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkComments"];
+ put?: never;
+ /**
+ * Post a comment or reply
+ * @description Post a comment or reply. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecordsByTableByPkComments"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/comments/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ /**
+ * Delete a comment thread
+ * @description Delete a comment thread. Uses the signed-in caller's permissions and record visibility.
+ */
+ delete: operations["deleteQbitCollaborationCommentsById"];
+ options?: never;
+ head?: never;
+ /**
+ * Edit the caller's comment
+ * @description Edit the caller's comment. Uses the signed-in caller's permissions and record visibility.
+ */
+ patch: operations["patchQbitCollaborationCommentsById"];
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/comments/{id}/resolve": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Resolve a comment thread
+ * @description Resolve a comment thread. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationCommentsByIdResolve"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/comments/{id}/reopen": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Reopen a comment thread
+ * @description Reopen a comment thread. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationCommentsByIdReopen"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/comments/{id}/history": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read comment edit history
+ * @description Read comment edit history. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationCommentsByIdHistory"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/mentions/candidates": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Find people to mention on a record
+ * @description Find people to mention on a record. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationMentionsCandidates"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/follow": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get the caller's follow state
+ * @description Get the caller's follow state. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkFollow"];
+ /**
+ * Follow a record and configure notifications
+ * @description Follow a record and configure notifications. Uses the signed-in caller's permissions and record visibility.
+ */
+ put: operations["putQbitCollaborationRecordsByTableByPkFollow"];
+ post?: never;
+ /**
+ * Unfollow a record
+ * @description Unfollow a record. Uses the signed-in caller's permissions and record visibility.
+ */
+ delete: operations["deleteQbitCollaborationRecordsByTableByPkFollow"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/followers": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List record followers
+ * @description List record followers. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkFollowers"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/timeline": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Page the merged record timeline
+ * @description Page the merged record timeline. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkTimeline"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/people": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Search the active people directory
+ * @description Search the active people directory. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationPeople"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/people/{userId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get an active directory person
+ * @description Get an active directory person. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationPeopleByUserId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/link": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a record link
+ * @description Get a record link. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkLink"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/shares/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Preview share recipients
+ * @description Preview share recipients. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecordsByTableByPkSharesPreview"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/shares": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Share a record
+ * @description Share a record. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecordsByTableByPkShares"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/access-requests": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Request access to a record
+ * @description Request access to a record. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationAccessRequests"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/access-requests/mine": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List my access requests
+ * @description List my access requests. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationAccessRequestsMine"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/tasks": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List record tasks
+ * @description List record tasks. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationRecordsByTableByPkTasks"];
+ put?: never;
+ /**
+ * Create a task
+ * @description Create a task. Uses the signed-in caller's permissions and record visibility.
+ */
+ post: operations["postQbitCollaborationRecordsByTableByPkTasks"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/tasks/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ /**
+ * Update a task
+ * @description Update a task. Uses the signed-in caller's permissions and record visibility.
+ */
+ patch: operations["patchQbitCollaborationTasksById"];
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/tasks/mine": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List my tasks
+ * @description List my tasks. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationTasksMine"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/records/{table}/{pk}/assignment": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ /**
+ * Set record owner and assignee
+ * @description Set record owner and assignee. Uses the signed-in caller's permissions and record visibility.
+ */
+ put: operations["putQbitCollaborationRecordsByTableByPkAssignment"];
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/collaboration/my-work": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get my work summary
+ * @description Get my work summary. Uses the signed-in caller's permissions and record visibility.
+ */
+ get: operations["getQbitCollaborationMyWork"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/saved/{id}/run": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Run a saved analysis
+ * @description Re-run a visible saved analysis as the signed-in viewer. Requires saved READ and source READ/Analyze. Drops unavailable fields with a warning and returns the result typed by kind; inaccessible required axes or predicates produce no result.
+ */
+ post: operations["postQbitDataAnalysisSavedByIdRun"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/saved": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List visible saved analyses
+ * @description List core-visible saved analyses with name, kind, source table label, owner, shared state, this viewer's starred flag and last update.
+ */
+ get: operations["getQbitDataAnalysisSaved"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/saved/{id}/star": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ /**
+ * Star a saved analysis
+ * @description Star a visible saved analysis for the signed-in user. Idempotent; uses standard saved insert permission and the personal star record lock.
+ */
+ put: operations["putQbitDataAnalysisSavedByIdStar"];
+ post?: never;
+ /**
+ * Unstar a saved analysis
+ * @description Remove the signed-in user's star on a visible saved analysis. Idempotent; uses standard saved delete permission and owner locks.
+ */
+ delete: operations["deleteQbitDataAnalysisSavedByIdStar"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/sql": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Read an analysis aggregate SQL statement
+ * @description Execute a typed analysis as the viewer and capture the main RDBMS aggregate SQL from core QueryStat. Requires installed SQL Workbench and its access permission. Non-RDBMS backends report unavailable; SQL is for reading and record security remains enforced at runtime.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableSql"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/export": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Export an analysis result
+ * @description Execute a typed analysis as the signed-in viewer and download its result table as CSV or XLSX. Requires source READ/Analyze and FULL fields; uses core report formats.
+ */
+ post: operations["postQbitDataAnalysisExport"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/saved/{id}/export": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Export a saved analysis
+ * @description Re-run a visible saved analysis as the viewer, applying current source permissions and dropping unavailable fields, then download its result table as CSV or XLSX.
+ */
+ get: operations["getQbitDataAnalysisSavedByIdExport"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/capabilities": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Check analysis availability
+ * @description Discover whether the current user can analyze this table, readable fields, chart defaults, limits and backend capabilities.
+ */
+ get: operations["getQbitDataAnalysisTablesByTableCapabilities"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/column-profile": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Profile one column
+ * @description Profile one column of a table under a filter: counts, nulls, distinct values, top values, numeric statistics and histogram, date patterns; every number has a drill-through filter unless privacy suppresses it.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableColumnProfile"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/distinct-values": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * List distinct column values
+ * @description Page through distinct stored values with display labels, counts and drill-through filters; search narrows stored values.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableDistinctValues"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/compare": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Compare two populations
+ * @description Compare filtered A with filtered B (null means the whole permitted table). Return means, medians or category shares, B-minus-A deltas, valid significance tests and count-equivalent drills. Only FULL fields are accepted.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableCompare"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/shift": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Measure distribution shift over time
+ * @description Compare category shares or numeric quartiles across session-timezone calendar buckets. Compute descriptive PSI between the first and last complete nonempty buckets using fixed categories or baseline quartile bins.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableShift"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/correlation": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Find numeric relationships
+ * @description Compute a Pearson correlation matrix for 2 to 12 distinct FULL numeric fields, using paired non-null records. Every cell includes n and parameters for the scatter endpoint; core pushes down CORR or uses bounded streaming.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableCorrelation"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/scatter": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Inspect a numeric relationship
+ * @description Return at most 2000 paired numeric points as the user, ordered by primary key when core query sampling is unavailable, plus a least-squares line fitted to the sample. Privacy disables individual drills and suppresses small populations.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableScatter"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/crosstab": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Cross-tabulate two fields
+ * @description Count combinations of two FULL fields with row and column shares, up to 20 categories per axis plus Other. Test independence using chi-square and Cramer V after pooling low expected counts; privacy suppresses small cells and their drills.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableCrosstab"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/watches/{id}/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Preview an anomaly watch
+ * @description Compute complete time buckets and a detector verdict under the signed-in user's READ, Analyze and FULL-field permissions. Includes a baseline band annotation. Does not update the watch or raise alerts.
+ */
+ post: operations["postQbitDataAnalysisWatchesByIdPreview"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/pivot": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Explore a pivot table
+ * @description Group records by up to 3 row and 2 column fields (with date or numeric buckets) and compute counts, sums, averages, min/max, distinct counts or percentiles per cell; every cell has a drill-through filter.
+ */
+ post: operations["postQbitDataAnalysisTablesByTablePivot"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/table-profile": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Profile table completeness and keys
+ * @description Profile readable fields under a filter for completeness, uniqueness, constant or empty columns and candidate keys.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableTableProfile"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/tables/{table}/duplicates": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Find duplicate groups
+ * @description Group matching records by the selected readable fields and return repeated tuples with counts and drill-through filters.
+ */
+ post: operations["postQbitDataAnalysisTablesByTableDuplicates"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/runs": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Start an exact profile run
+ * @description Start an owner-scoped exact column or table profile. Poll the returned runId until COMPLETE or FAILED; results honor the current session permissions.
+ */
+ post: operations["postQbitDataAnalysisRuns"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/data-analysis/runs/{runId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get an exact profile run
+ * @description Read status, timestamps and the typed columnProfile or tableProfile result of an owner-scoped run. Completed results are rechecked against current permissions.
+ */
+ get: operations["getQbitDataAnalysisRunsByRunId"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/edi/guides/{guideId}/tree": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read the guide tree
+ * @description Read the guide tree. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.
+ */
+ get: operations["getQbitEdiGuidesByGuideIdTree"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/edi/maps/{mapId}/target": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Read target metadata and map rules
+ * @description Read target metadata and map rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.
+ */
+ get: operations["getQbitEdiMapsByMapIdTarget"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/edi/sandbox/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Preview an encrypted sample with optional unsaved rules
+ * @description Preview an encrypted sample with optional unsaved rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.
+ */
+ post: operations["postQbitEdiSandboxPreview"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/edi/maps/{mapId}/validate": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Validate unsaved map rules
+ * @description Validate unsaved map rules. Uses the caller session and table read permissions. Preview also requires edi.map.preview. Rule writes use core table CRUD.
+ */
+ post: operations["postQbitEdiMapsByMapIdValidate"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/quick-search/status": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get Quick Search status
+ * @description Requires Quick Search admin permission. Five-second instance cache; two-second refresh wait. Counts are saved diagnostics, not live source scans. Unknown values are null. Backlog counts are lower bounds when backlogTruncated is true.
+ */
+ get: operations["getQuickSearchStatus"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/quick-search/suggest": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get Quick Search suggestions
+ * @description Requires a signed-in session, not Quick Search admin permission. Results inherit table READ permissions, configured record security locks and protected-field exclusions. One bounded candidate batch per table; no extra scans. Unavailable search and normalized terms shorter than two characters return empty groups.
+ */
+ get: operations["getQuickSearchSuggestions"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/secured-data/reveal": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Reveal */
+ post: operations["postQbitSecuredDataReveal"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/secured-data/reveal/options": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** RevealOptions */
+ get: operations["getQbitSecuredDataRevealOptions"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/qbit/secured-data/status": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Status */
+ get: operations["getQbitSecuredDataStatus"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/capabilities": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get caller capabilities and configured limits
+ * @description Get caller capabilities and configured limits. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetCapabilities"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/schema/{backendName}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Inspect a target backend schema
+ * @description Inspect a target backend schema. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetSchema"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/execute": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Execute read-only SQL or preview and confirm a gated write
+ * @description Execute read-only SQL or preview and confirm a gated write. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchExecute"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/explain": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Explain SQL; ANALYZE remains subject to write gates
+ * @description Explain SQL; ANALYZE remains subject to write gates. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchExplain"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/executions/{uuid}/rows": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Page or sort the caller's cached result
+ * @description Page or sort the caller's cached result. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetRows"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/executions/{uuid}/cancel": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Cancel the caller's running execution
+ * @description Cancel the caller's running execution. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchCancelExecution"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/history": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List the caller's recent audited executions
+ * @description List the caller's recent audited executions. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetHistory"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List visible personal or shared notebooks
+ * @description List visible personal or shared notebooks. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchListNotebooks"];
+ put?: never;
+ /**
+ * Create a personal notebook
+ * @description Create a personal notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchCreateNotebook"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a visible notebook and its cells
+ * @description Get a visible notebook and its cells. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetNotebook"];
+ /**
+ * Update an owned notebook and record a version
+ * @description Update an owned notebook and record a version. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ put: operations["sqlWorkbenchUpdateNotebook"];
+ post?: never;
+ /**
+ * Delete an owned notebook
+ * @description Delete an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ delete: operations["sqlWorkbenchDeleteNotebook"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/publish": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Publish or withdraw an owned notebook with share permission
+ * @description Publish or withdraw an owned notebook with share permission. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchPublishNotebook"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/duplicate": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Make a personal copy of a visible notebook
+ * @description Make a personal copy of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchDuplicateNotebook"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List versions of a visible notebook
+ * @description List versions of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchListVersions"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions/{n}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Get a visible notebook version and saved content
+ * @description Get a visible notebook version and saved content. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchGetVersion"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/versions/{n}/restore": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /**
+ * Restore an owned notebook version as a new version
+ * @description Restore an owned notebook version as a new version. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchRestoreVersion"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/snapshots": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * List snapshots of a visible notebook
+ * @description List snapshots of a visible notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchListSnapshots"];
+ put?: never;
+ /**
+ * Pin the caller's cached result to an owned notebook
+ * @description Pin the caller's cached result to an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ post: operations["sqlWorkbenchCreateSnapshot"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/notebooks/{id}/snapshots/{snapshotId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ /**
+ * Delete a snapshot from an owned notebook
+ * @description Delete a snapshot from an owned notebook. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ delete: operations["sqlWorkbenchDeleteSnapshot"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/qqq/v1/sql-workbench/executions/{uuid}/export": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /**
+ * Export the caller's cached result as CSV, JSON or XLSX
+ * @description Export the caller's cached result as CSV, JSON or XLSX. Requires SQL Workbench access; services enforce caller permissions, ownership, execution limits and audit.
+ */
+ get: operations["sqlWorkbenchExportResult"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+}
+export type webhooks = Record;
+export interface components {
+ schemas: {
+ AppMetaData: {
+ /** @description Map of other apps, tables, process, and reports, which are contained within this app. Same contents as the children list, just structured as a map. */
+ childMap?: {
+ [key: string]: components["schemas"]["AppTreeNode"];
+ };
+ /** @description List of other apps, tables, process, and reports, which are contained within this app. */
+ children?: components["schemas"]["AppTreeNode"][];
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the app. */
+ icon?: components["schemas"]["Icon"];
+ /** @description User-facing name for this app */
+ label?: string;
+ /** @description Unique name for this app within the QQQ Instance */
+ name?: string;
+ /** @description List of sections - sub-divisions of the app, to further organize its children. */
+ sections?: components["schemas"]["AppSection"][];
+ /** @description Additional meta-data describing the app, which may not be known to the QQQ backend core module. */
+ supplementalAppMetaData?: Record;
+ /** @description List of widgets names that are part of this app. These strings should be keys to the widgets map in the QQQ Instance. */
+ widgets?: string[];
+ };
+ AppSection: {
+ /** @description Icon to display for the section. */
+ icon?: components["schemas"]["Icon"];
+ /** @description User-facing name of the section. */
+ label?: string;
+ /** @description Unique (within the app) name for this section. */
+ name?: string;
+ /** @description List of process names for the section */
+ processes?: string[];
+ /** @description List of report names for the section */
+ reports?: string[];
+ /** @description List of table names for the section */
+ tables?: string[];
+ };
+ AppTreeNode: {
+ /** @description Child elements. Only applies for type='app', which contains additional apps under it */
+ children?: components["schemas"]["AppTreeNode"][];
+ /** @description Icon to display for the item. */
+ icon?: components["schemas"]["Icon"];
+ /** @description User-facing name of the element. */
+ label?: string;
+ /** @description Unique (within its type) name for this element. e.g., for type = 'table', the table's name. */
+ name?: string;
+ /** @description The type of node (table, process, report, app) */
+ type?: string;
+ };
+ AssociatedScriptMetaData: {
+ /** @description Name of the field, in the record's table, that references the script. */
+ fieldName?: string;
+ /** @description Id of the script type (a scriptType record) of the scripts this field references. */
+ scriptTypeId?: Record;
+ };
+ Association: {
+ /** @description Name of the associated table; its permissions remain independent */
+ associatedTableName?: string;
+ /** @description The named join and field pairs defining this association */
+ join?: {
+ joinOns?: unknown[];
+ leftTable?: string;
+ name?: string;
+ orderBys?: unknown[];
+ rightTable?: string;
+ /** @enum {string} */
+ type?: "ONE_TO_ONE" | "ONE_TO_MANY" | "MANY_TO_ONE" | "MANY_TO_MANY";
+ };
+ /** @description Exact name used for this group in associatedRecords */
+ name?: string;
+ };
+ AuditsCapabilityV1: {
+ /** @description True when the table is audited and the user can read its audits one of the two ways. */
+ available?: boolean | null;
+ /** @description The audit detail table (field changes), joined to tableName. */
+ detailTableName?: string;
+ /** @description The table's audit level: NONE, RECORD or FIELD. */
+ level?: string;
+ /** @description The process that returns a record's audits (inputs tableName, recordId); absent when the user may not run it. */
+ processName?: string;
+ /** @description The audit table, when the user may query it directly. */
+ tableName?: string;
+ };
+ AuthenticationMetaDataResponseV1: {
+ /**
+ * @description The application's branding that is safe to show before sign-in (names, logo, icon and accent colors; never
+ * banners), so a login page can look like the application. Absent when the instance defines no branding.
+ */
+ branding?: {
+ /** @description Primary accent color, as a CSS color value. */
+ accentColor?: string;
+ /** @description Light variant of the accent color, as a CSS color value. */
+ accentColorLight?: string;
+ /** @description Name of this application, for display to users. */
+ appName?: string;
+ /** @description Name of the company that operates this application. */
+ companyName?: string;
+ /** @description Path or URL of the application's small icon image. */
+ icon?: string;
+ /** @description Path or URL of the application's logo image. */
+ logo?: string;
+ };
+ /** @description Optional public CSP source additions for standalone dashboards, derived from configured application features; never a full policy or inline script hashes. */
+ dashboardCspSources?: {
+ /** @description HTTP(S) connection sources required by configured features; no default policy sources. */
+ connectSrc?: string[];
+ /** @description Frame sources required by configured features. */
+ frameSrc?: string[];
+ /** @description Script sources required by configured features; no inline hashes, nonces or unsafe keywords. */
+ scriptSrc?: string[];
+ /** @description Style sources required by configured features. */
+ styleSrc?: string[];
+ };
+ /** @description Unique name for the authentication metaData object within the QInstance. */
+ name?: string;
+ /**
+ * @description Specifier for the type of authentication module being used.
+ *
+ * Frontends should use this value to determine how to prompt the user for authentication credentials.
+ * In addition, depending on this value, additional properties will be included in this object, as
+ * may be needed to complete the authorization workflow with the provider (e.g., a baseUrl, clientId,
+ * and audience for an OAuth type workflow).
+ */
+ type?: string;
+ /** @description Additional values, as determined by the type of authentication provider. */
+ values?: Record | {
+ /** @description Audience for auth0 */
+ audience?: string;
+ /** @description BaseUrl for auth0 */
+ baseUrl?: string;
+ /** @description ClientId for auth0 */
+ clientId?: string;
+ } | {
+ /** @description BaseUrl for OAuth2 provider */
+ baseUrl?: string;
+ /** @description True when the server accepts the provider's access tokens as Authorization: Bearer . Since 1.6.0. */
+ bearerTokensAccepted?: boolean | null;
+ /** @description ClientId for OAuth2 provider */
+ clientId?: string;
+ /** @description The issuer (OIDC discovery base URL) of nativeClientId, when it differs from baseUrl. Since 1.6.0. */
+ nativeClientBaseUrl?: string;
+ /** @description The public OAuth2 client for native clients (CLI, TUI, mobile): use it with auth-code + PKCE or the device-authorization grant, then send the access token as Authorization: Bearer. Absent when the app has no native client. Since 1.6.0. */
+ nativeClientId?: string;
+ /** @description OAuth2 scopes to request (space-separated) */
+ scopes?: string;
+ };
+ };
+ BackChannelLogoutResponseV1: Record;
+ /** @description The error body of every UI API operation (core and extensions). */
+ BasicErrorResponseV1: {
+ /** @description The error message (the same as message; kept for clients of UI API 1.0 to 1.5). */
+ error?: string;
+ /**
+ * @description A stable, machine-readable code. Well-known values: BAD_REQUEST (400), UNAUTHENTICATED (401),
+ * PERMISSION_DENIED (403), NOT_FOUND (404), CONFLICT (409), RATE_LIMITED (429), INTERNAL_ERROR (500),
+ * ERROR (other). Extensions may add codes; treat an unknown code by the HTTP status. Since 1.6.0.
+ */
+ code?: string;
+ /** @description A message to show the user. Since 1.6.0. */
+ message?: string;
+ /** @description Errors about particular request fields, when known. Since 1.6.0. */
+ fieldErrors?: {
+ /** @description The field (or parameter) name. */
+ field?: string;
+ /** @description The error about that field. */
+ message?: string;
+ /** @description An optional machine-readable code, e.g. REQUIRED, TOO_LONG, PATTERN. */
+ code?: string;
+ }[];
+ /** @description Identifies this request in the server logs (also the X-QQQ-Trace-Id response header); quote it when reporting a problem. Since 1.6.0. */
+ traceId?: string;
+ };
+ Branding: {
+ /** @description Primary accent color, as a CSS color value. */
+ accentColor?: string;
+ /** @description Light variant of the accent color, as a CSS color value. */
+ accentColorLight?: string;
+ /** @description Name of this application, for display to users. */
+ appName?: string;
+ /** @description Banners to display, keyed by the slot where each is shown. */
+ banners?: {
+ [key: string]: components["schemas"]["BrandingBanner"];
+ };
+ /** @description Name of the company that operates this application. */
+ companyName?: string;
+ /** @description URL for the company's web site. */
+ companyUrl?: string;
+ /** @description Path or URL of the application's small icon image. */
+ icon?: string;
+ /** @description Path or URL of the application's logo image. */
+ logo?: string;
+ };
+ BrandingBanner: {
+ /** @description Additional CSS style properties for the banner. */
+ additionalStyles?: Record;
+ /** @description Background color, as a CSS color value. */
+ backgroundColor?: string;
+ /** @description HTML message, used instead of the plain-text message when set. */
+ messageHTML?: string;
+ /** @description Plain-text message. */
+ messageText?: string;
+ /** @description Severity of the message: INFO, WARNING, ERROR or SUCCESS. */
+ severity?: string;
+ /** @description Text color, as a CSS color value. */
+ textColor?: string;
+ };
+ BuiltInViewV1: {
+ filter?: {
+ /** @enum {string} */
+ booleanOperator?: "OR";
+ criteria?: {
+ fieldName?: string;
+ /** @enum {string} */
+ operator?: "EQUALS";
+ values?: {
+ /** @enum {string} */
+ type?: "CurrentUser";
+ }[];
+ }[];
+ };
+ label?: string;
+ name?: string;
+ };
+ BulkLoadColumnProfile: {
+ /** @description Data classification of the mapped field (PUBLIC, CONFIDENTIAL, PII, PHI), or null. */
+ classification?: string;
+ /** @description Zero-based column index in the file. */
+ columnIndex?: number;
+ /** @description Spreadsheet-style column letter (A, B, ... AA). */
+ columnLetter?: string;
+ /** @description Distinct non-blank values counted (capped at 1000). */
+ distinctCount?: number;
+ /** @description Whether more distinct values exist than were counted. */
+ distinctCountCapped?: boolean | null;
+ /** @description Header text (or Column A, Column B ... when the file has no header row). */
+ header?: string;
+ /** @description INTEGER, DECIMAL, BOOLEAN, DATE, DATE_TIME or STRING, from the profiled values. */
+ inferredType?: string;
+ /** @description The table field the suggested mapping assigns this column to, or null. */
+ mappedFieldName?: string;
+ /** @description Longest value length. */
+ maxLength?: number;
+ /** @description DATE_LIKE, EMAIL_LIKE, NUMERIC, CODE_LIKE, TEXT or EMPTY. */
+ patternClass?: string;
+ /** @description Percent of profiled rows where the column is blank. */
+ percentBlank?: number;
+ /** @description Up to sampleCount distinct values, only when samplesAllowed; otherwise empty. */
+ sampleValues?: string[];
+ /** @description Whether sample values may be shown: an AI route of hipaa, or a mapped field that is unclassified or PUBLIC. Unmapped columns are treated as classified. */
+ samplesAllowed?: boolean | null;
+ };
+ BulkLoadColumnRef: {
+ /** @description Zero-based column index in the file. */
+ columnIndex?: number;
+ /** @description Header text. */
+ header?: string;
+ };
+ BulkLoadFieldRef: {
+ /** @description Field name. */
+ fieldName?: string;
+ /** @description Field label. */
+ label?: string;
+ /** @description Possible value source of the field, if any (its file values need mapping). */
+ possibleValueSourceName?: string;
+ };
+ BulkLoadRowError: {
+ /** @description VALUE_TYPE, POSSIBLE_VALUE, DUPLICATE, REQUIRED or OTHER. */
+ errorCode?: string;
+ /** @description The field the error is about, when known. */
+ fieldName?: string;
+ /** @description The error message (value-free). */
+ message?: string;
+ /** @description File rows with the error, e.g. Row 3; Rows 7-9 (no values). */
+ rowNumbers?: string;
+ };
+ BulkLoadSuggestMappingResponseV1: {
+ /** @description The suggested bulk load profile (v1: version, layout, hasHeaderRow, isBulkEdit, and fieldList entries of fieldName, columnIndex, headerName, defaultValue, doValueMapping, valueMappings, clearIfEmpty). */
+ profile?: Record;
+ /** @description File columns the suggestion does not map. */
+ unmappedColumns?: components["schemas"]["BulkLoadColumnRef"][];
+ /** @description Required table fields the suggestion does not fill. */
+ unmappedRequiredFields?: components["schemas"]["BulkLoadFieldRef"][];
+ /** @description Mapped fields with a possible value source, whose file values may need mapping. */
+ valueMappingFields?: components["schemas"]["BulkLoadFieldRef"][];
+ };
+ BulkLoadSummaryLine: {
+ /** @description Example rows (and their values, unless masked for a classified field). */
+ bulletsOfText?: string[];
+ /** @description Number of records the line describes. */
+ count?: number;
+ /** @description The standard process summary message. */
+ message?: string;
+ /** @description OK, INFO, WARNING or ERROR. */
+ status?: string;
+ };
+ BulkLoadUploadProfileResponseV1: {
+ /** @description The columns. */
+ columns?: components["schemas"]["BulkLoadColumnProfile"][];
+ /** @description The uploaded file name. */
+ fileName?: string;
+ /** @description Whether row 1 looks like a header row (the suggester maps at least one of its values). */
+ hasHeaderRow?: boolean | null;
+ /** @description Data rows profiled (up to 1000). */
+ rowsProfiled?: number;
+ /** @description The upload ref. */
+ uploadRef?: string;
+ };
+ BulkLoadValidateResponseV1: {
+ /** @description Records with errors. */
+ errorCount?: number;
+ /** @description Error groups with row numbers (up to 100). */
+ errors?: components["schemas"]["BulkLoadRowError"][];
+ /** @description Reserved: a FULL run over the durable threshold will run as a VALIDATE job and return its id. Always null in this version. */
+ jobId?: number;
+ /** @description SAMPLE (the first 100 rows) or FULL (the whole file). */
+ mode?: string;
+ /** @description Records that would be inserted. */
+ okCount?: number;
+ /** @description For SAMPLE, the rows validated. */
+ previewRecordCount?: number;
+ /** @description The table's bulk-insert process the dry run used. */
+ processName?: string;
+ /** @description Records read from the file. */
+ recordCount?: number;
+ /** @description The standard process summary lines. */
+ summaryLines?: components["schemas"]["BulkLoadSummaryLine"][];
+ };
+ DeliveryDestinationsResponseV1: {
+ destinations?: {
+ name?: string;
+ label?: string;
+ icon?: string;
+ maxClassification?: string;
+ aboveMaxClassification?: string;
+ order?: number;
+ /** Format: int64 */
+ maxAttachmentBytes?: number;
+ allowBearerLinks?: boolean;
+ }[];
+ };
+ /** Format: binary */
+ DeliveryOutputResponseV1: string;
+ DeliveryTargetStepResponseV1: {
+ name?: string;
+ label?: string;
+ options?: {
+ value?: string;
+ label?: string;
+ description?: string;
+ }[];
+ freeText?: boolean;
+ complete?: boolean;
+ summary?: string;
+ };
+ DeliveryTargetsRequestV1: {
+ /** @description Selections by delivery target step name; values are provider-defined target identifiers. */
+ chosen?: {
+ [key: string]: unknown;
+ };
+ };
+ ExposedJoin: {
+ /** @description Whether or not this join is 'to many' in nature */
+ isMany?: boolean | null;
+ /** @description A list of joins that travel from the base table to the exposed join table */
+ joinPath?: {
+ joinOns?: unknown[];
+ leftTable?: string;
+ name?: string;
+ orderBys?: unknown[];
+ rightTable?: string;
+ /** @enum {string} */
+ type?: "ONE_TO_ONE" | "ONE_TO_MANY" | "MANY_TO_ONE" | "MANY_TO_MANY";
+ }[];
+ /** @description The meta-data for the joined table */
+ joinTable?: components["schemas"]["TableMetaData"];
+ /** @description User-facing label to display for this join */
+ label?: string;
+ };
+ FieldAdornment: {
+ /**
+ * @description Type of this adornment
+ * @enum {string}
+ */
+ type?: "LINK" | "CHIP" | "SIZE" | "CODE_EDITOR" | "RENDER_HTML" | "REVEAL" | "FILE_DOWNLOAD" | "FILE_UPLOAD" | "TOOLTIP" | "WIDGET" | "ERROR" | "FILE_PREVIEW";
+ /**
+ * @description Values associated with this adornment. Keys and the meanings of their values differ by type; the known
+ * keys are listed (each names the type(s) it applies to). CHIP also uses pattern keys: `color.{fieldValue}`
+ * (one of default, info, primary, secondary, success, warning, error) and `icon.{fieldValue}` (an icon name),
+ * giving the chip colour and icon for a field value. Clients ignore keys they do not know.
+ */
+ values?: {
+ /** @description LINK: where to open the link: _blank for a new window/tab; otherwise the same view. */
+ target?: string;
+ /** @description LINK: the field value is a primary key of this table; link to that record (a client navigates to the record view). */
+ toRecordFromTable?: string;
+ /** @description LINK: the target table is per record - read it from the record displayValue `{fieldName}:toRecordFromTableDynamic`. */
+ toRecordFromTableDynamic?: boolean;
+ /** @description FILE_DOWNLOAD, FILE_PREVIEW: the field holding the file name to save or show. */
+ fileNameField?: string;
+ /** @description FILE_DOWNLOAD: extension for the saved file when the name has none. */
+ defaultExtension?: string;
+ /** @description FILE_DOWNLOAD, FILE_PREVIEW: MIME type to assume when none is known. */
+ defaultMimeType?: string;
+ /** @description FILE_DOWNLOAD: process the server runs to produce the file (the client just downloads). */
+ supplementalProcessName?: string;
+ /** @description FILE_DOWNLOAD: code the server runs to produce the file (the client just downloads). */
+ supplementalCodeReference?: {
+ [key: string]: unknown;
+ };
+ /** @description FILE_DOWNLOAD: the download URL is per record - read it from the record displayValue `{fieldName}:downloadUrlDynamic`. */
+ downloadUrlDynamic?: boolean;
+ /** @description FILE_DOWNLOAD: format (with %s placeholders) for the saved file name. */
+ fileNameFormat?: string;
+ /** @description FILE_DOWNLOAD: fields whose values fill fileNameFormat, in order. */
+ fileNameFormatFields?: string[];
+ /**
+ * @description SIZE: display width of the field - one of xsmall, small, medium, medlarge, large, xlarge (semantic widths; each client maps them to its own columns or characters). FILE_UPLOAD: width of the upload control.
+ * @enum {string}
+ */
+ width?: "xsmall" | "small" | "medium" | "medlarge" | "large" | "xlarge" | "full" | "half";
+ /** @description FILE_UPLOAD: control style (dragAndDrop or button). */
+ format?: string;
+ /** @description CODE_EDITOR: language of the code (e.g. javascript, sql, json, velocity) - for highlighting; a client without an editor shows it monospaced. */
+ languageMode?: string;
+ /** @description TOOLTIP: the tooltip text. */
+ staticText?: string;
+ /** @description TOOLTIP: the text is per record - read it from the record displayValue `{fieldName}:tooltipDynamic`. */
+ tooltipDynamic?: boolean;
+ /** @description FILE_PREVIEW: field holding a thumbnail image URL. */
+ thumbnailUrlField?: string;
+ /** @description FILE_PREVIEW: field holding the full-size file URL. */
+ fullSizeUrlField?: string;
+ /** @description FILE_PREVIEW: field holding the MIME type (decides image, video, PDF or download-only). */
+ mimeTypeField?: string;
+ /** @description FILE_PREVIEW: field holding alternative text. */
+ altTextField?: string;
+ /** @description FILE_PREVIEW: field holding a caption. */
+ captionField?: string;
+ /** @description FILE_PREVIEW: field holding the pixel width. */
+ widthField?: string;
+ /** @description FILE_PREVIEW: field holding the pixel height. */
+ heightField?: string;
+ /** @description FILE_PREVIEW: field holding the size in bytes. */
+ sizeBytesField?: string;
+ /** @description FILE_PREVIEW: largest thumbnail edge in pixels. */
+ thumbnailMaxSize?: number;
+ /** @description FILE_PREVIEW: whether the file may be previewed (false: download only). */
+ previewable?: boolean;
+ /** @description WIDGET: the widget that renders this field. */
+ widgetName?: string;
+ } & {
+ [key: string]: unknown;
+ };
+ };
+ FieldMetaData: {
+ /**
+ * @description Effective field access: FULL, REVEALABLE, MASKED, or HIDDEN. Omitted means FULL. Restricted values are strings, regardless of field type.
+ * @enum {string}
+ */
+ accessTier?: "FULL" | "REVEALABLE" | "MASKED" | "HIDDEN";
+ /** @description Special UI dressings to add to the field. */
+ adornments?: components["schemas"]["FieldAdornment"][];
+ /** @description Allowed filter operators when restricted: EQUALS and IN for REVEALABLE when exact match is enabled, otherwise empty. Omitted means unrestricted. */
+ allowedFilterOperators?: string[];
+ /** @description Names of the field's behaviors that a frontend applies while editing, e.g., TO_UPPER_CASE, TO_LOWER_CASE or TRIM. Absent when the field has none. */
+ behaviors?: string[];
+ /** @description Default value to use in this field. */
+ defaultValue?: string;
+ /** @description C-style format specifier for displaying values in this field. */
+ displayFormat?: string;
+ /** @description Width of this field in a 12-column record form or view grid (e.g., 12 for the full width, 6 for half). Absent when the frontend's default applies. */
+ gridColumns?: number;
+ /** @description Help Contents for this field. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description Inline possible-value source for this field; enumValues supply choices without a separate lookup. */
+ inlinePossibleValueSource?: {
+ customCodeReference?: {
+ /** @enum {string} */
+ codeType?: "JAVA" | "JAVA_SCRIPT";
+ inlineCode?: string;
+ name?: string;
+ };
+ enumValues?: unknown[];
+ helpContent?: Record;
+ /** @enum {string} */
+ idType?: "STRING" | "INTEGER" | "LONG" | "DECIMAL" | "BOOLEAN" | "DATE" | "TIME" | "DATE_TIME" | "TEXT" | "HTML" | "PASSWORD" | "BLOB";
+ label?: string;
+ name?: string;
+ orderByFields?: unknown[];
+ overrideIdField?: string;
+ picker?: {
+ detailFields?: unknown[];
+ filterFields?: unknown[];
+ pageSize?: number;
+ previewField?: string;
+ searchFields?: unknown[];
+ sorts?: unknown[];
+ subtitleFields?: unknown[];
+ thumbnailField?: string;
+ uploadProcessName?: string;
+ uploadResultIdField?: string;
+ };
+ searchFields?: unknown[];
+ tableName?: string;
+ /** @enum {string} */
+ type?: "ENUM" | "TABLE" | "CUSTOM";
+ valueFields?: unknown[];
+ valueFieldsIfNotFound?: unknown[];
+ valueFormat?: string;
+ valueFormatIfNotFound?: string;
+ };
+ /** @description Indicate if user may edit the value in this field. */
+ isEditable?: boolean | null;
+ /** @description Indicator of 'heavy' fields, which are not loaded by default. e.g., some blobs or long-texts */
+ isHeavy?: boolean | null;
+ /** @description Indicate if this field should be hidden from users */
+ isHidden?: boolean | null;
+ /** @description Indicate if a value in this field is required. */
+ isRequired?: boolean | null;
+ /** @description False for restricted fields; omitted means sortable. */
+ isSortable?: boolean | null;
+ /** @description User-facing name for this field */
+ label?: string;
+ /** @description For String fields, the max length the field supports. */
+ maxLength?: number;
+ /** @description For number fields, the largest value the field accepts (inclusive). Absent when there is no such limit. */
+ maxValue?: string;
+ /** @description For number fields, the smallest value the field accepts (inclusive). Absent when there is no such limit. */
+ minValue?: string;
+ /** @description Unique name for this field within its container (table or process) */
+ name?: string;
+ /** @description When this field's possible value source declares a record picker (for sources over large tables), its configuration: thumbnail, preview, subtitle and detail fields, filter fields, search fields, sorts and page size. Frontends offer a searchable, paged picker dialog. */
+ picker?: {
+ detailFields?: unknown[];
+ filterFields?: unknown[];
+ pageSize?: number;
+ previewField?: string;
+ searchFields?: unknown[];
+ sorts?: unknown[];
+ subtitleFields?: unknown[];
+ thumbnailField?: string;
+ uploadProcessName?: string;
+ uploadResultIdField?: string;
+ };
+ /** @description When this field has a picker, the table its possible value source reads, whose metadata describes the picker's fields. */
+ pickerTableName?: string;
+ /**
+ * @description DISABLE_UNTIL_SET disables a contingent field until its dependencies are set (default). SHOW_ALL_UNTIL_SET keeps it enabled and omits criteria with missing inputs in form searches. Absent for non-contingent fields.
+ * @enum {string}
+ */
+ possibleValueSourceDependencyBehavior?: "DISABLE_UNTIL_SET" | "SHOW_ALL_UNTIL_SET";
+ /** @description Names of fields controlling this field's choices, including explicit and filter dependencies. Absent for non-contingent fields. */
+ possibleValueSourceDependsOn?: string[];
+ /** @description If this field's values should come from a possible value source, then that PVS is named here. */
+ possibleValueSourceName?: string;
+ /** @description Additional frontend-visible metadata for this field, keyed by supplemental type. */
+ supplementalMetaData?: Record;
+ /** @description Data-type for this field */
+ type?: string;
+ /** @description The field's validation rules, as the server enforces them on insert and update (required, maxLength and tooLongBehavior, min/max value, pattern). Absent when the field has none. Since 1.6.0. */
+ validation?: components["schemas"]["FieldValidationV1"];
+ };
+ FieldValidationV1: {
+ /** @description Whether maxValue itself is accepted (false: the value must be less). */
+ maxInclusive?: boolean | null;
+ /** @description For string fields, the most characters the field stores. What happens to a longer value is tooLongBehavior. */
+ maxLength?: number;
+ /** @description For number fields, the largest value accepted (plain digits, exact). See maxInclusive. */
+ maxValue?: string;
+ /** @description Whether minValue itself is accepted (false: the value must be greater). */
+ minInclusive?: boolean | null;
+ /** @description For number fields, the smallest value accepted (plain digits, exact). See minInclusive. */
+ minValue?: string;
+ /** @description A regular expression a non-empty value must match as a whole (written to mean the same in Java and ECMAScript). */
+ pattern?: string;
+ /** @description The message the server gives for a value that does not match pattern. */
+ patternMessage?: string;
+ /** @description True when a value is required. */
+ required?: boolean | null;
+ /** @description With maxLength: ERROR (a longer value is refused), TRUNCATE or TRUNCATE_ELLIPSIS (it is trimmed on save), PASS_THROUGH (neither). */
+ tooLongBehavior?: string;
+ };
+ FilterCriteria: {
+ /** @description Field name that this criteria applies to */
+ fieldName?: string;
+ /**
+ * @description Logical operator that applies to this criteria
+ * @enum {string}
+ */
+ operator?: "EQUALS" | "NOT_EQUALS" | "NOT_EQUALS_OR_IS_NULL" | "IN" | "NOT_IN" | "IS_NULL_OR_IN" | "LIKE" | "NOT_LIKE" | "STARTS_WITH" | "ENDS_WITH" | "CONTAINS" | "CONTAINS_ALL" | "NOT_STARTS_WITH" | "NOT_ENDS_WITH" | "NOT_CONTAINS" | "LESS_THAN" | "LESS_THAN_OR_EQUALS" | "GREATER_THAN" | "GREATER_THAN_OR_EQUALS" | "IS_BLANK" | "IS_NOT_BLANK" | "BETWEEN" | "NOT_BETWEEN" | "TRUE" | "FALSE";
+ /** @description Values to apply via the operator to the field */
+ values?: string[];
+ };
+ /** @description Changes a form adjuster asks the form to apply. Absent or null properties mean no change. */
+ FormAdjusterOutputV1: {
+ /** @description Replacement definitions for fields, by field name. */
+ updatedFieldMetaData?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description New values for fields, by field name. */
+ updatedFieldValues?: {
+ [key: string]: unknown;
+ };
+ /** @description Display values for possible-value fields whose values changed, by field name. */
+ updatedFieldDisplayValues?: {
+ [key: string]: string;
+ };
+ /** @description Fields whose values should be cleared. */
+ fieldsToClear?: string[];
+ /** @description Replacement definitions for form sections, by section name. */
+ updatedSectionMetaData?: {
+ [key: string]: components["schemas"]["TableSection"];
+ };
+ /** @description Whether the form should be disabled. */
+ isFormDisabled?: boolean;
+ /** @description Why the form is disabled. */
+ formDisabledMessage?: string;
+ };
+ FrontendComponent: {
+ /**
+ * @description The type of this component. e.g., what kind of UI element(s) should be presented to the user.
+ * @enum {string}
+ */
+ type?: "HELP_TEXT" | "BULK_EDIT_FORM" | "BULK_LOAD_FILE_MAPPING_FORM" | "BULK_LOAD_VALUE_MAPPING_FORM" | "BULK_LOAD_PROFILE_FORM" | "VALIDATION_REVIEW_SCREEN" | "EDIT_FORM" | "VIEW_FORM" | "DOWNLOAD_FORM" | "RECORD_LIST" | "PROCESS_SUMMARY_RESULTS" | "GOOGLE_DRIVE_SELECT_FOLDER" | "WIDGET" | "HTML";
+ /** @description Name-value pairs specific to the type of component. */
+ values?: components["schemas"]["FrontendComponentValues"];
+ };
+ /**
+ * @description These are the known values that can appear in the values map under a FrontendComponent, to control
+ * how that component should be presented to the user.
+ *
+ * Additional application-defined properties may appear as well. BULK_EDIT_FORM, BULK_LOAD_FILE_MAPPING_FORM,
+ * BULK_LOAD_VALUE_MAPPING_FORM, BULK_LOAD_PROFILE_FORM, VALIDATION_REVIEW_SCREEN, VIEW_FORM, DOWNLOAD_FORM,
+ * RECORD_LIST, PROCESS_SUMMARY_RESULTS and GOOGLE_DRIVE_SELECT_FOLDER have no fixed component-local keys
+ * supplied by the core producers; they consume process values and frontend-step metadata.
+ *
+ * In addition, components are expected to use values from an active process's `values` map (e.g., as included in
+ * a `ProcessStepComplete` object), with the following contract between component-types and expected values:
+ *
+ * - For component type=`HTML`, there will be a process value with key=`${stepName}.html` (e.g., `resultScreen.html`),
+ * whose value is the HTML to display on that screen.
+ * - For component type=`HELP_TEXT`: There will be a process value with key=`text`, whose value is the text to display on that screen.
+ * There may also be a process value with key=`previewText`, which, if present, can be shown before the full text is shown,
+ * e.g., with a toggle control to hide/show the `text` value.
+ */
+ FrontendComponentValues: {
+ /** @description Components of type=`WIDGET`, which are set as `isAdHocWidget=true`, should include a list of WidgetBlocks in this value. */
+ blocks?: components["schemas"]["WidgetBlock"][];
+ /**
+ * @description Components of type=`EDIT_FORM` can specify a subset of field names to include. This can be used to break a form up into
+ * sections, by including multiple EDIT_FORM components, with different lists of `includeFieldNames`.
+ */
+ includeFieldNames?: string[];
+ /**
+ * @description Components of type=`WIDGET`, which do not reference a widget defined in the QQQ Instance, but instead,
+ * are defined as a list of blocks within a frontend step component, will have a this value set to true.
+ */
+ isAdHocWidget?: boolean | null;
+ /** @description HELP_TEXT: short text shown before expanding the full text. */
+ previewText?: string;
+ /** @description Components of type=`EDIT_FORM` can specify a user-facing text label to show on screen. */
+ sectionLabel?: string;
+ /** @description HELP_TEXT: text shown by the component. */
+ text?: string;
+ /**
+ * @description Components of type=`WIDGET`, which should render a widget defined in the QQQ instance, this value specifies
+ * the name of that widget. Contrast with ad-hoc widgets.
+ */
+ widgetName?: string;
+ };
+ FrontendStep: {
+ /** @description Name of the step a user can go back to from this step (step with isStepBack=true), when there is one. */
+ backStepName?: string;
+ /** @description The components that make up this screen */
+ components?: components["schemas"]["FrontendComponent"][];
+ /** @description Fields used as form fields (inputs) on this step/screen */
+ formFields?: components["schemas"]["FieldMetaData"][];
+ /** @description An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently. */
+ format?: string;
+ /** @description Help content shown on the step/screen. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description The user-facing name for this step */
+ label?: string;
+ /** @description The unique name for this step within its process */
+ name?: string;
+ /** @description Fields used in record-lists shown on the step/screen. */
+ recordListFields?: components["schemas"]["FieldMetaData"][];
+ /** @description Fields used as view-only fields on this step/screen */
+ viewFields?: components["schemas"]["FieldMetaData"][];
+ };
+ HelpContentV1: {
+ /** @description Long help in the declared format. */
+ content?: string;
+ /** @description Rendered Markdown (raw HTML escaped, unsafe links removed). Explicit HTML is unchanged and clients must sanitize it. */
+ contentAsHtml?: string;
+ /** @description Plain-text help, preserving link text and line breaks. */
+ contentAsText?: string;
+ /**
+ * @description Format of the long help.
+ * @enum {string}
+ */
+ format?: "TEXT" | "HTML" | "MARKDOWN";
+ /** @description Screen roles covered by this entry. */
+ roles?: string[];
+ /** @description Optional short plain-text tooltip. */
+ summary?: string;
+ };
+ HelpCoverageEntryV1: {
+ /** @description Whether visible help has long content. */
+ hasContent?: boolean | null;
+ /** @description Whether visible help has an explicit summary. */
+ hasSummary?: boolean | null;
+ /** @description Whether the target is hidden in metadata. */
+ hidden?: boolean | null;
+ /** @description Canonical helpContent address. */
+ key?: string;
+ /** @description Help target kind. */
+ kind?: string;
+ /** @description User-facing target label. */
+ label?: string;
+ /** @description Canonical parent address. */
+ parentKey?: string;
+ /** @description Screen roles covered by this entry. */
+ roles?: string[];
+ };
+ HelpCoverageResponseV1: {
+ entries?: components["schemas"]["HelpCoverageEntryV1"][];
+ totals?: components["schemas"]["HelpCoverageTotalV1"][];
+ };
+ HelpCoverageTotalV1: {
+ /** @description Help target kind. */
+ kind?: string;
+ /** @description Number of targets in the selected kind and parent scope. */
+ total?: number;
+ /** @description Targets with a visible summary or long content. */
+ withHelp?: number;
+ };
+ HelpSearchResponseV1: {
+ results?: components["schemas"]["HelpSearchResultV1"][];
+ };
+ HelpSearchResultV1: {
+ /** @description Rendered Markdown (raw HTML escaped, unsafe links removed). Explicit HTML is unchanged and clients must sanitize it. */
+ contentAsHtml?: string;
+ /** @description Plain-text help, preserving link text and line breaks. */
+ contentAsText?: string;
+ /** @description Application-relative navigation link, when available. */
+ href?: string;
+ /** @description Canonical helpContent address. */
+ key?: string;
+ /** @description Help target kind. */
+ kind?: string;
+ /** @description User-facing target label. */
+ label?: string;
+ /** @description Target metadata name. */
+ name?: string;
+ /** @description Related process name, when applicable. */
+ process?: string;
+ /** @description Optional short plain-text tooltip. */
+ summary?: string;
+ /** @description Related table name, when applicable. */
+ table?: string;
+ /** @description Plain-text help excerpt, at most 600 characters. */
+ text?: string;
+ };
+ Icon: {
+ /** @description A color code to use for displaying the icon */
+ color?: string;
+ /** @description Material UI icon name (web); prefer semanticName */
+ name?: string;
+ /** @description A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon. */
+ path?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ semanticName?: string;
+ };
+ JobActionResponseV1: {
+ jobId?: number;
+ };
+ JobDetailV1: {
+ actions?: string[];
+ bytesDone?: number;
+ bytesTotal?: number;
+ chunksDone?: number;
+ chunksTotal?: number;
+ currentPhase?: string;
+ etaSeconds?: number;
+ finishedAt?: string;
+ jobId?: number;
+ label?: string;
+ logSeq?: number;
+ message?: string;
+ percent?: number;
+ processName?: string;
+ progress?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ currentPhase?: string;
+ done?: number;
+ etaSeconds?: number;
+ message?: string;
+ percent?: number;
+ phases?: components["schemas"]["JobPhaseV1"][];
+ total?: number;
+ unitLabel?: string;
+ updatedAt?: string;
+ };
+ queuedAt?: string;
+ rowsDone?: number;
+ rowsFailed?: number;
+ rowsTotal?: number;
+ sourceType?: string;
+ startedAt?: string;
+ status?: string;
+ summary?: Record;
+ userId?: string;
+ };
+ JobListResponseV1: {
+ activeCount?: number;
+ generatedAt?: string;
+ jobs?: components["schemas"]["JobSummaryV1"][];
+ };
+ JobLogLineV1: {
+ attempt?: number;
+ chunkId?: number;
+ id?: number;
+ jobId?: number;
+ level?: string;
+ loggedAt?: string;
+ message?: string;
+ phase?: string;
+ };
+ JobPhaseV1: {
+ label?: string;
+ name?: string;
+ status?: string;
+ weight?: number;
+ };
+ JobProgressPollV1: {
+ job?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ chunksDone?: number;
+ chunksTotal?: number;
+ currentPhase?: string;
+ etaSeconds?: number;
+ finishedAt?: string;
+ jobId?: number;
+ label?: string;
+ logSeq?: number;
+ message?: string;
+ percent?: number;
+ processName?: string;
+ queuedAt?: string;
+ rowsDone?: number;
+ rowsFailed?: number;
+ rowsTotal?: number;
+ sourceType?: string;
+ startedAt?: string;
+ status?: string;
+ userId?: string;
+ };
+ log?: components["schemas"]["JobLogLineV1"][];
+ logDropped?: number;
+ nextAfterLogId?: number;
+ progress?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ currentPhase?: string;
+ done?: number;
+ etaSeconds?: number;
+ message?: string;
+ percent?: number;
+ phases?: components["schemas"]["JobPhaseV1"][];
+ total?: number;
+ unitLabel?: string;
+ updatedAt?: string;
+ };
+ terminal?: boolean | null;
+ };
+ JobProgressV1: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ currentPhase?: string;
+ done?: number;
+ etaSeconds?: number;
+ message?: string;
+ percent?: number;
+ phases?: components["schemas"]["JobPhaseV1"][];
+ total?: number;
+ unitLabel?: string;
+ updatedAt?: string;
+ };
+ JobSummaryV1: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ chunksDone?: number;
+ chunksTotal?: number;
+ currentPhase?: string;
+ etaSeconds?: number;
+ finishedAt?: string;
+ jobId?: number;
+ label?: string;
+ logSeq?: number;
+ message?: string;
+ percent?: number;
+ processName?: string;
+ queuedAt?: string;
+ rowsDone?: number;
+ rowsFailed?: number;
+ rowsTotal?: number;
+ sourceType?: string;
+ startedAt?: string;
+ status?: string;
+ userId?: string;
+ };
+ JobTrackRequestV1: {
+ jobUUID?: string;
+ processName?: string;
+ processUUID?: string;
+ };
+ LogoutResponseV1: Record;
+ ManageSessionResponseV1: {
+ /** @description Unique identifier of the session. Required to be returned on subsequent requests in the sessionUUID Cookie, to prove authentication. Not included when the cookie is HttpOnly or the session was resumed from that cookie. */
+ uuid?: string;
+ /** @description Optional object with application-defined values. */
+ values?: {
+ [key: string]: unknown;
+ };
+ };
+ MaterialDashboardInstanceSettings: {
+ /** @description Names of processes to offer on the query and record-view screens of every table, in their configured order. Only processes that the user may see (i.e., that are in the meta-data's `processes` map) are listed, so the list may be empty. */
+ processNamesToAddToAllQueryAndViewScreens?: string[];
+ /** @description Where the record view puts its actions: IN_IDENTITY_SECTION or INLINE_WITH_PAGE_TITLE. When set, this overrides each table's placement. */
+ recordViewActionsPlacement?: string;
+ /** @description Weekday criteria settings for the query screens (day is any of, day is none of). Omitted when the material dashboard meta-data does not define them. */
+ weekdayCriteriaSettings?: components["schemas"]["MaterialDashboardWeekdayCriteriaSettings"];
+ };
+ MaterialDashboardWeekdayCriteriaSettings: {
+ /** @description Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId). */
+ dateTimeFieldFunctionArguments?: components["schemas"]["WeekdayCriteriaArguments"];
+ /** @description Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields. */
+ enabled?: boolean | null;
+ };
+ MetaDataResponseV1: {
+ /** @description Tree of apps within the QQQ Instance, sorted and organized hierarchically, for presentation to a user. */
+ appTree?: components["schemas"]["AppTreeNode"][];
+ /** @description Map of all apps within the QQQ Instance (that the user has permission to see that they exist). */
+ apps?: {
+ [key: string]: components["schemas"]["AppMetaData"];
+ };
+ /** @description Application identity (names, logo, icon, accent colors and banners), when the instance defines it. */
+ branding?: {
+ /** @description Primary accent color, as a CSS color value. */
+ accentColor?: string;
+ /** @description Light variant of the accent color, as a CSS color value. */
+ accentColorLight?: string;
+ /** @description Name of this application, for display to users. */
+ appName?: string;
+ /** @description Banners to display, keyed by the slot where each is shown. */
+ banners?: {
+ [key: string]: components["schemas"]["BrandingBanner"];
+ };
+ /** @description Name of the company that operates this application. */
+ companyName?: string;
+ /** @description URL for the company's web site. */
+ companyUrl?: string;
+ /** @description Path or URL of the application's small icon image. */
+ icon?: string;
+ /** @description Path or URL of the application's logo image. */
+ logo?: string;
+ };
+ /** @description Environment values a frontend may use: Google Picker public browser settings GOOGLE_APP_CLIENT_ID and GOOGLE_APP_API_KEY, and the analytics settings (ANALYTICS_PROVIDERS, ANALYTICS_PLUGIN_SCRIPTS, ANALYTICS_PLUGIN_SCRIPT_URLS, GOOGLE_ANALYTICS_ENABLED, GOOGLE_ANALYTICS_TRACKING_ID, POSTHOG_ENABLED, POSTHOG_API_KEY, POSTHOG_PROJECT_API_KEY, POSTHOG_HOST, and any other ANALYTICS_* value), from the instance's QQQ_ENV_* environment. An explicit allow-list - never the whole environment. Omitted when none are set. */
+ environmentValues?: {
+ [key: string]: string;
+ };
+ /** @description Instance-level help content, by slot name (for example the query screen's bulkAddFilterValues and bulkAddFilterValuesPossibleValueSource slots). Omitted when the instance defines none. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Name of the app whose dashboard a frontend shows as the instance's home page (for example at /app/), when the instance designates one and the user may access that app. Omitted otherwise, in which case the frontend uses its own default home page. */
+ homeAppName?: string;
+ metaDataGeneration?: number;
+ /** @description Map of all processes within the QQQ Instance (that the user has permission to see that they exist). */
+ processes?: {
+ [key: string]: components["schemas"]["ProcessMetaDataLight"];
+ };
+ /** @description Map of all reports within the QQQ Instance (that the user has permission to see that they exist). */
+ reports?: {
+ [key: string]: {
+ /** @description Whether the user may run the report. */
+ hasPermission?: boolean;
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Material UI icon name (web); prefer iconSemanticName */
+ iconName?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ iconSemanticName?: string;
+ /** @description User-facing name for this report. */
+ label?: string;
+ /** @description Unique name for this report within the QQQ Instance. */
+ name?: string;
+ /** @description Process that runs this report, when it has one; otherwise it runs from GET /reports/{reportName}. */
+ processName?: string;
+ };
+ };
+ /** @description Settings from supplemental modules that a frontend may use (an explicit allow-list - not the supplemental meta-data objects themselves). Omitted when the instance defines none of them. */
+ supplementalInstanceMetaData?: {
+ /** @description Present (an object) when the instance has the assistant QBit's `assistant` supplemental meta-data - that is, when the assistant is installed and enabled, so a frontend may probe its routes. Always has `available: true`, plus the strings, numbers and booleans the QBit publishes for frontends. */
+ assistant?: {
+ [key: string]: unknown;
+ };
+ /**
+ * @deprecated
+ * @description Use uiSettings; kept for Next UI until it migrates
+ */
+ materialDashboard?: {
+ /** @description Names of processes to offer on the query and record-view screens of every table, in their configured order. Only processes that the user may see (i.e., that are in the meta-data's `processes` map) are listed, so the list may be empty. */
+ processNamesToAddToAllQueryAndViewScreens?: string[];
+ /** @description Where the record view puts its actions: IN_IDENTITY_SECTION or INLINE_WITH_PAGE_TITLE. When set, this overrides each table's placement. */
+ recordViewActionsPlacement?: string;
+ /** @description Weekday criteria settings for the query screens (day is any of, day is none of). Omitted when the material dashboard meta-data does not define them. */
+ weekdayCriteriaSettings?: {
+ /** @description Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId). */
+ dateTimeFieldFunctionArguments?: components["schemas"]["WeekdayCriteriaArguments"];
+ /** @description Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields. */
+ enabled?: boolean | null;
+ };
+ };
+ /**
+ * @deprecated
+ * @description Use uiSettings; kept for Next UI until it migrates. The application theme from the instance's MaterialDashboardThemeMetaData supplemental meta-data, when the instance defines it. Keys are MaterialDashboardThemeMetaData property names (for example primaryColor, fontFamily, typographyH1FontSize, borderRadiusGlobal, density, customCss, brandedHeaderEnabled, sidebarBackgroundColor, tableHeaderBackgroundColor); values are strings, numbers or booleans. An explicit allow-list of the theme's visual properties; properties without a value are omitted.
+ */
+ materialDashboardTheme?: {
+ [key: string]: unknown;
+ };
+ /** @description Client-neutral process, query, record-view and theme settings. */
+ uiSettings?: {
+ /** @description Visible processes offered on every query and record-view screen. */
+ processNamesToAddToAllQueryAndViewScreens?: string[];
+ /** @description Placement of record-view actions. */
+ recordViewActionsPlacement?: string;
+ /** @description Configured colors and font families; no web layout or CSS settings. */
+ theme?: {
+ [key: string]: string;
+ };
+ /** @description Weekday query criteria configuration. */
+ weekdayCriteriaSettings?: {
+ /** @description Arguments for the WeekdayOfDateTime field function that a frontend sends with weekday criteria on date-time fields (for example timeZoneId or useSessionZoneId). */
+ dateTimeFieldFunctionArguments?: components["schemas"]["WeekdayCriteriaArguments"];
+ /** @description Whether query screens offer the weekday criteria (day is any of, day is none of) on date and date-time fields. */
+ enabled?: boolean | null;
+ };
+ };
+ };
+ /** @description Map of all tables within the QQQ Instance (that the user has permission to see that they exist). */
+ tables?: {
+ [key: string]: components["schemas"]["TableMetaDataLight"];
+ };
+ /** @description Map of all widgets within the QQQ Instance (that the user has permission to see that they exist). */
+ widgets?: {
+ [key: string]: {
+ /** @description Frontend widget defaults, including explicit association bindings */
+ defaultValues?: {
+ [key: string]: unknown;
+ };
+ /** @description Dropdowns the widget offers to filter its data. */
+ dropdowns?: unknown[];
+ /** @description HTML shown below the widget. */
+ footerHTML?: string;
+ /** @description Plain-text footer, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description Number of grid columns (of 12) the widget spans. */
+ gridColumns?: number;
+ /** @description Whether the user may render the widget. */
+ hasPermission?: boolean;
+ /** @description Help content by slot. */
+ helpContent?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Name of the widget's icon. */
+ icon?: string;
+ /** @description Icons by role (for example the widget header icon). */
+ icons?: {
+ [key: string]: unknown;
+ };
+ /** @description Whether the widget is drawn as a card. */
+ isCard?: boolean;
+ /** @description User-facing name for this widget */
+ label?: string;
+ /** @description Minimum height of the widget (a CSS length). */
+ minHeight?: string;
+ /** @description Unique name for this widget within the QQQ Instance */
+ name?: string;
+ /** @description Whether the widget offers an export button. */
+ showExportButton?: boolean;
+ /** @description Whether the widget offers a reload button. */
+ showReloadButton?: boolean;
+ /** @description Whether dropdown selections are remembered for the user. */
+ storeDropdownSelections?: boolean;
+ /** @description Tooltip text for the widget. */
+ tooltip?: string;
+ /** @description The type of this widget. */
+ type?: string;
+ };
+ };
+ };
+ OrderBy: {
+ /** @description Field name that this order-by applies to */
+ fieldName?: string;
+ /** @description Whether this order-by is ascending or descending */
+ isAscending?: boolean | null;
+ };
+ OutputRecord: {
+ /** @description Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written. */
+ associatedRecords?: {
+ [key: string]: unknown[];
+ };
+ /** @description Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings. */
+ displayValues?: Record;
+ /** @description Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none. */
+ errors?: string[];
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them. */
+ values?: Record;
+ /** @description Messages for warnings on this record. Omitted when there are none. */
+ warnings?: string[];
+ };
+ PossibleValueOption: {
+ /** @description For a picker request: formatted or translated display values, where they differ from the raw values */
+ displayValues?: Record;
+ /** @description Unique identifier for this possible value option */
+ id?: Record;
+ /** @description Human-readable label for this possible value option */
+ label?: string;
+ /** @description For a picker request: the option's picker display values (thumbnail, preview, subtitle and detail fields), raw */
+ values?: Record;
+ };
+ PossibleValuesResponseV1: {
+ /** @description For a picker request: whether another page of options follows (the picker never counts) */
+ hasMore?: boolean | null;
+ /** @description List of possible value options matching the search request */
+ options?: components["schemas"]["PossibleValueOption"][];
+ };
+ /** @description Only rowKey and values are accepted. Identity always comes from the authenticated session. */
+ PreferenceActionRequestV1: {
+ /** @description Required for ROW actions: a key loaded for this user with the action allowed. Forbidden for SECTION and LIST actions. */
+ rowKey?: string;
+ /** @description Action input fields. Validated and coerced like PATCH fields; unknown fields are rejected. */
+ values?: {
+ [key: string]: unknown;
+ };
+ };
+ /** @description Action result and reloaded section. Secrets are shown once and must not be stored by clients. Response uses Cache-Control: no-store. */
+ PreferenceActionResponseV1: {
+ section?: components["schemas"]["PreferenceSectionV1"];
+ /** @description User-facing outcome message. */
+ message?: string;
+ /** @description One-time secrets for immediate display; clients must not store them. */
+ secrets?: components["schemas"]["PreferenceSecretV1"][];
+ /** @description Optional row key to focus after reloading the section. */
+ focusRowKey?: string;
+ };
+ PreferenceActionV1: {
+ /** @description Stable action name used in URLs. */
+ name?: string;
+ /** @description Human-readable action label. */
+ label?: string;
+ icon?: components["schemas"]["Icon"];
+ /** @description Explanation for clients to display. */
+ description?: string;
+ /**
+ * @description Where to display this action. ROW actions require a loaded row key.
+ * @enum {string}
+ */
+ scope?: "SECTION" | "LIST" | "ROW";
+ /** @description List targeted by LIST or ROW actions; null for SECTION. */
+ listName?: string | null;
+ /** @description When set, clients must confirm with this text before running the action. */
+ confirmationText?: string | null;
+ /** @description Whether clients should present this as a destructive action. */
+ isDestructive?: boolean;
+ /** @description Action inputs, using preference field validation and coercion. */
+ inputFields?: components["schemas"]["FieldMetaData"][];
+ /** @description Display order, ascending then label; defaults to 100. */
+ order?: number;
+ };
+ /** @description A list of fixed preference rows, rendered with the same typed field editors as scalar preferences. */
+ PreferenceListV1: {
+ /** @description List name used in PATCH lists. */
+ name?: string;
+ /** @description Human-readable list title. */
+ label?: string;
+ /** @description Explanation of this list. */
+ description?: string;
+ /** @description Label for one row, such as Category. */
+ rowLabel?: string;
+ /** @description Editable columns and their validation rules. */
+ fields?: components["schemas"]["FieldMetaData"][];
+ /** @description Fixed rows available to this user. */
+ rows?: components["schemas"]["PreferenceRowV1"][];
+ };
+ /** @description A provider-owned row. Clients change row membership only through registered actions. */
+ PreferenceRowV1: {
+ /** @description Null allows every ROW action of this list; empty allows none; otherwise only the named actions are allowed. */
+ actionNames?: string[] | null;
+ /** @description Stable provider row key to send when patching. */
+ key?: string;
+ /** @description Human-readable row label. */
+ label?: string;
+ /** @description Explanation of this row. */
+ description?: string;
+ /** @description Field name to typed value. Omitted fields retain their existing values; explicit null clears an optional field. */
+ values?: {
+ [key: string]: unknown;
+ };
+ /** @description Field names that cannot be changed for this row. */
+ readOnlyFields?: string[];
+ /** @description Explain why the indicated fields are read-only. */
+ readOnlyReason?: string;
+ };
+ PreferenceSecretV1: {
+ /** @description Human-readable secret label. */
+ label?: string;
+ /** @description Shown once. Clients must not store, log, cache, or send this secret to analytics. */
+ value?: string;
+ /** @description Masked representation, for example qqq_…7f3a. */
+ masked?: string;
+ /** @description Usage guidance such as a curl example; may contain newlines. */
+ usageText?: string;
+ };
+ /** @description Partial update for the signed-in user only. Unknown properties, fields, lists and rows, including userId, are rejected with 400. All validation errors are returned together; omitted fields and rows are unchanged. */
+ PreferenceSectionPatchRequestV1: {
+ /** @description Changed scalar fields only. Explicit null clears an optional field. Types, required, maxLength, ENUM membership and editability are validated. */
+ values?: {
+ [key: string]: unknown;
+ };
+ /** @description List name to changed fixed rows. No add or remove operation is supported. */
+ lists?: {
+ [key: string]: {
+ /** @description Required fixed row key from the section response. No new rows can be created. */
+ key?: string;
+ /** @description Changed row fields only. Read-only fields are rejected. */
+ values?: {
+ [key: string]: unknown;
+ };
+ }[];
+ };
+ };
+ /** @description One visible section with the signed-in user's current preferences. */
+ PreferenceSectionV1: {
+ /** @description Add a user-menu entry using the section label and icon to open this section; defaults to false. */
+ showInUserMenu?: boolean;
+ /** @description Stable section name used in URLs. */
+ name?: string;
+ /** @description Human-readable section title. */
+ label?: string;
+ /** @description Explanation for clients to display. */
+ description?: string;
+ /** @description Optional owning application name. */
+ appName?: string;
+ icon?: components["schemas"]["Icon"];
+ /** @description Display order, ascending then label; defaults to 100. */
+ order?: number;
+ /** @description Scalar field definitions with editability, type, defaults and validation. */
+ fields?: components["schemas"]["FieldMetaData"][];
+ /** @description Field name to typed value. Omitted fields retain their existing values; explicit null clears an optional field. */
+ values?: {
+ [key: string]: unknown;
+ };
+ /** @description Registered section, list and row actions, ordered by order then label. */
+ actions?: components["schemas"]["PreferenceActionV1"][];
+ /** @description Optional fixed-row preference lists. */
+ lists?: components["schemas"]["PreferenceListV1"][];
+ /** @description Every ENUM possible-value source referenced by scalar, list or action input fields, keyed by source name. */
+ possibleValues?: {
+ [key: string]: components["schemas"]["PossibleValueOption"][];
+ };
+ };
+ /** @description Visible sections in display order, with only the signed-in user's values. */
+ PreferencesResponseV1: {
+ /** @description Installed sections the session may access; an empty list is valid. */
+ sections?: components["schemas"]["PreferenceSectionV1"][];
+ };
+ ProcessCancelResponseV1: Record;
+ ProcessCapabilityV1: {
+ /** @description True when the process exists and the user may run it. */
+ available?: boolean | null;
+ /** @description The process to run (present only when available). */
+ processName?: string;
+ };
+ ProcessJobLaunchResponseV1: {
+ /** @description Id of the new durable job (a jobs_job record; read it with GET /table/jobs_job/{jobId}). */
+ jobId?: number;
+ /** @description Status of the new job: QUEUED, or AWAITING_CONFIRMATION for a launch from the assistant channel. */
+ status?: string;
+ };
+ ProcessMetaData: {
+ /** @description True when the process always runs as a durable background job (too large to run while the user waits). */
+ durableJobAlways?: boolean | null;
+ /** @description True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer "Run in background". */
+ durableJobEligible?: boolean | null;
+ /** @description Frontend steps (aka, Screens) for this process. */
+ frontendSteps?: components["schemas"]["FrontendStep"][];
+ /** @description Boolean to indicate if the user has permission for the process. */
+ hasPermission?: boolean | null;
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the process. */
+ icon?: components["schemas"]["Icon"];
+ /** @description Material UI icon name (web); prefer iconSemanticName */
+ iconName?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ iconSemanticName?: string;
+ /** @description Boolean indicator of whether the process should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this process */
+ label?: string;
+ /** @description Most input records the process runs with, when it has a maximum. */
+ maxInputRecords?: number;
+ /** @description Fewest input records the process runs with (for processes on a table's records). */
+ minInputRecords?: number;
+ /** @description Unique name for this process within the QQQ Instance */
+ name?: string;
+ /** @description Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE. */
+ stepFlow?: string;
+ /** @description If this process is associated with a table, the table name is given here */
+ tableName?: string;
+ };
+ ProcessMetaDataAdjustment: {
+ /** @description Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values. */
+ updatedFields?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description In case the backend has changed the list of frontend steps, it will be set in this field. */
+ updatedFrontendStepList?: components["schemas"]["FrontendStep"][];
+ };
+ ProcessMetaDataLight: {
+ /** @description True when the process always runs as a durable background job (too large to run while the user waits). */
+ durableJobAlways?: boolean | null;
+ /** @description True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer "Run in background". */
+ durableJobEligible?: boolean | null;
+ /** @description Boolean to indicate if the user has permission for the process. */
+ hasPermission?: boolean | null;
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the process. */
+ icon?: components["schemas"]["Icon"];
+ /** @description Material UI icon name (web); prefer iconSemanticName */
+ iconName?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ iconSemanticName?: string;
+ /** @description Boolean indicator of whether the process should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this process */
+ label?: string;
+ /** @description Most input records the process runs with, when it has a maximum. */
+ maxInputRecords?: number;
+ /** @description Fewest input records the process runs with (for processes on a table's records). */
+ minInputRecords?: number;
+ /** @description Unique name for this process within the QQQ Instance */
+ name?: string;
+ /** @description Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE. */
+ stepFlow?: string;
+ /** @description If this process is associated with a table, the table name is given here */
+ tableName?: string;
+ };
+ ProcessMetaDataResponseV1: {
+ /** @description True when the process always runs as a durable background job (too large to run while the user waits). */
+ durableJobAlways?: boolean | null;
+ /** @description True when the process can run as a durable background job (POST /processes/{processName}/jobs): clients may offer "Run in background". */
+ durableJobEligible?: boolean | null;
+ /** @description Frontend steps (aka, Screens) for this process. */
+ frontendSteps?: components["schemas"]["FrontendStep"][];
+ /** @description Boolean to indicate if the user has permission for the process. */
+ hasPermission?: boolean | null;
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the process. */
+ icon?: {
+ /** @description A color code to use for displaying the icon */
+ color?: string;
+ /** @description Material UI icon name (web); prefer semanticName */
+ name?: string;
+ /** @description A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon. */
+ path?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ semanticName?: string;
+ };
+ /** @description Material UI icon name (web); prefer iconSemanticName */
+ iconName?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ iconSemanticName?: string;
+ /** @description Boolean indicator of whether the process should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this process */
+ label?: string;
+ /** @description Most input records the process runs with, when it has a maximum. */
+ maxInputRecords?: number;
+ /** @description Fewest input records the process runs with (for processes on a table's records). */
+ minInputRecords?: number;
+ /** @description Unique name for this process within the QQQ Instance */
+ name?: string;
+ /** @description Indicator of the Step Flow used by the process. Possible values are: LINEAR, STATE_MACHINE. */
+ stepFlow?: string;
+ /** @description If this process is associated with a table, the table name is given here */
+ tableName?: string;
+ };
+ ProcessRecordsResponseV1: {
+ /** @description List of records from the process state */
+ records?: components["schemas"]["OutputRecord"][];
+ /** @description Total number of records in the process state (before pagination) */
+ totalRecords?: number;
+ };
+ /** @description Data returned after the job is complete (whether it was synchronous, or asynchronous) */
+ ProcessStepComplete: {
+ /** @description Name of the step the process can go back to (restart at, by stepping with isStepBack=true), when the process declares one. Omitted otherwise. */
+ backStep?: string;
+ /** @description Name of the next process step that needs to run (a frontend step). If there are no more steps in the process, this field will not be included. */
+ nextStep?: string;
+ /** @description Secrets shown once in synchronous init/step responses only. Never returned by status. Clients must not cache; response uses Cache-Control: no-store. */
+ oneTimeSecrets?: components["schemas"]["PreferenceSecretV1"][];
+ /** @description Changes to be made to the process's metaData. */
+ processMetaDataAdjustment?: {
+ /** @description Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values. */
+ updatedFields?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description In case the backend has changed the list of frontend steps, it will be set in this field. */
+ updatedFrontendStepList?: {
+ /** @description Name of the step a user can go back to from this step (step with isStepBack=true), when there is one. */
+ backStepName?: string;
+ /** @description The components that make up this screen */
+ components?: components["schemas"]["FrontendComponent"][];
+ /** @description Fields used as form fields (inputs) on this step/screen */
+ formFields?: components["schemas"]["FieldMetaData"][];
+ /** @description An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently. */
+ format?: string;
+ /** @description Help content shown on the step/screen. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description The user-facing name for this step */
+ label?: string;
+ /** @description The unique name for this step within its process */
+ name?: string;
+ /** @description Fields used in record-lists shown on the step/screen. */
+ recordListFields?: components["schemas"]["FieldMetaData"][];
+ /** @description Fields used as view-only fields on this step/screen */
+ viewFields?: components["schemas"]["FieldMetaData"][];
+ }[];
+ };
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ /** @description Current values for fields used by the process.Keys are Strings, values can be any type, as determined by the application & process. */
+ values?: Record;
+ };
+ /** @description In case an error is thrown in the backend job. */
+ ProcessStepError: {
+ /** @description Exception message, in case the process step threw an error. */
+ error?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ /** @description Optional user-facing exception message, in case the process step threw a user-facing error. */
+ userFacingError?: string;
+ };
+ /** @description In case the backend needs more time, this is a UUID of the background job that has been started. */
+ ProcessStepJobStarted: {
+ /** @description Unique identifier for a running step of the process. Must be passed into `status` check calls. */
+ jobUUID?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ };
+ ProcessStepResponseV1: {
+ /** @description Name of the step the process can go back to (restart at, by stepping with isStepBack=true), when the process declares one. Omitted otherwise. */
+ backStep?: string;
+ /** @description Name of the next process step that needs to run (a frontend step). If there are no more steps in the process, this field will not be included. */
+ nextStep?: string;
+ /** @description Secrets shown once in synchronous init/step responses only. Never returned by status. Clients must not cache; response uses Cache-Control: no-store. */
+ oneTimeSecrets?: components["schemas"]["PreferenceSecretV1"][];
+ /** @description Changes to be made to the process's metaData. */
+ processMetaDataAdjustment?: {
+ /** @description Fields whose meta-data has changed. e.g., changing a label, or required status, or inline-possible-values. */
+ updatedFields?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description In case the backend has changed the list of frontend steps, it will be set in this field. */
+ updatedFrontendStepList?: {
+ /** @description Name of the step a user can go back to from this step (step with isStepBack=true), when there is one. */
+ backStepName?: string;
+ /** @description The components that make up this screen */
+ components?: components["schemas"]["FrontendComponent"][];
+ /** @description Fields used as form fields (inputs) on this step/screen */
+ formFields?: components["schemas"]["FieldMetaData"][];
+ /** @description An optional indicator of the screen format preferred by the application to be used for this screen. Different frontends may support different formats, and implement them differently. */
+ format?: string;
+ /** @description Help content shown on the step/screen. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description The user-facing name for this step */
+ label?: string;
+ /** @description The unique name for this step within its process */
+ name?: string;
+ /** @description Fields used in record-lists shown on the step/screen. */
+ recordListFields?: components["schemas"]["FieldMetaData"][];
+ /** @description Fields used as view-only fields on this step/screen */
+ viewFields?: components["schemas"]["FieldMetaData"][];
+ }[];
+ };
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ /** @description Current values for fields used by the process.Keys are Strings, values can be any type, as determined by the application & process. */
+ values?: Record;
+ } | {
+ /** @description Unique identifier for a running step of the process. Must be passed into `status` check calls. */
+ jobUUID?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ } | {
+ /** @description Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`). */
+ current?: number;
+ logTail?: components["schemas"]["JobLogLineV1"][];
+ /** @description Status message regarding the running process step. */
+ message?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ progress?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ currentPhase?: string;
+ done?: number;
+ etaSeconds?: number;
+ message?: string;
+ percent?: number;
+ phases?: components["schemas"]["JobPhaseV1"][];
+ total?: number;
+ unitLabel?: string;
+ updatedAt?: string;
+ };
+ /** @description Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`). */
+ total?: number;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ } | {
+ /** @description Exception message, in case the process step threw an error. */
+ error?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ /** @description Optional user-facing exception message, in case the process step threw a user-facing error. */
+ userFacingError?: string;
+ };
+ /** @description Response to a status check for a backgrounded job. */
+ ProcessStepRunning: {
+ /** @description Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`). */
+ current?: number;
+ logTail?: components["schemas"]["JobLogLineV1"][];
+ /** @description Status message regarding the running process step. */
+ message?: string;
+ /** @description Unique identifier for a running instance the process. */
+ processUUID?: string;
+ progress?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ currentPhase?: string;
+ done?: number;
+ etaSeconds?: number;
+ message?: string;
+ percent?: number;
+ phases?: components["schemas"]["JobPhaseV1"][];
+ total?: number;
+ unitLabel?: string;
+ updatedAt?: string;
+ };
+ /** @description Optional indicator of progress (e.g., `current` of `total`, as in (`1 of 10`). */
+ total?: number;
+ /** @description What kind of response has been received. Determines what additional fields will be set. */
+ type?: string;
+ };
+ PublicBranding: {
+ /** @description Primary accent color, as a CSS color value. */
+ accentColor?: string;
+ /** @description Light variant of the accent color, as a CSS color value. */
+ accentColorLight?: string;
+ /** @description Name of this application, for display to users. */
+ appName?: string;
+ /** @description Name of the company that operates this application. */
+ companyName?: string;
+ /** @description Path or URL of the application's small icon image. */
+ icon?: string;
+ /** @description Path or URL of the application's logo image. */
+ logo?: string;
+ };
+ QueryFilter: {
+ /**
+ * @description Boolean operator to apply between criteria
+ * @enum {string}
+ */
+ booleanOperator?: "AND" | "OR";
+ /** @description Field level criteria that make up the query filter */
+ criteria?: components["schemas"]["FilterCriteria"][];
+ /** @description Maximum number of results to return. */
+ limit?: number;
+ /** @description How the query's results should be ordered (sorted). */
+ orderBys?: components["schemas"]["OrderBy"][];
+ /** @description Records to skip (e.g., to implement pagination) */
+ skip?: number;
+ };
+ QueryJoin: {
+ /** @description Alias to apply to this table in the join query */
+ alias?: string;
+ /** @description Base table (or an alias) that this QueryJoin is joined against */
+ baseTableOrAlias?: string;
+ /** @description Name of a join to use in case the baseTable and joinTable have more than one */
+ joinName?: string;
+ /** @description Table being joined into the query by this QueryJoin */
+ joinTable?: string;
+ /** @description Whether or not to select values from the join table */
+ select?: boolean | null;
+ /**
+ * @description Type of join being performed (SQL semantics)
+ * @enum {string}
+ */
+ type?: "INNER" | "LEFT" | "RIGHT" | "FULL";
+ };
+ RealtimeChannelRevokedEventV1: {
+ channel?: string;
+ };
+ RealtimeEventV1: {
+ channel?: string;
+ /** @description dataByType: hello -> RealtimeHelloEventV1; job.progress -> RealtimeJobProgressEventV1; record.changed -> RealtimeRecordChangedEventV1; record.deleted -> RealtimeRecordDeletedEventV1; table.changed -> RealtimeTableChangedEventV1; metadata.changed -> RealtimeMetaDataChangedEventV1; session-ended -> RealtimeSessionEndedEventV1; resync -> RealtimeResyncEventV1; channel-revoked -> RealtimeChannelRevokedEventV1. Selected by the envelope's event; data has no discriminator. All properties are optional; QBits may publish additional event-specific data. */
+ data?: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ changedBy?: string;
+ channel?: string;
+ chunksDone?: number;
+ chunksTotal?: number;
+ connectionId?: string;
+ currentPhase?: string;
+ etaSeconds?: number;
+ fields?: string[];
+ generation?: number;
+ heartbeatSeconds?: number;
+ jobId?: number;
+ logSeq?: number;
+ message?: string;
+ metaDataGeneration?: number;
+ percent?: number;
+ pk?: (string | number | boolean) | null;
+ rowsDone?: number;
+ rowsFailed?: number;
+ rowsPerSecond?: number;
+ rowsTotal?: number;
+ status?: string;
+ table?: string;
+ version?: (string | number | boolean) | null;
+ };
+ event?: string;
+ };
+ RealtimeHelloEventV1: {
+ connectionId?: string;
+ heartbeatSeconds?: number;
+ metaDataGeneration?: number;
+ };
+ RealtimeJobProgressEventV1: {
+ bytesDone?: number;
+ bytesTotal?: number;
+ chunksDone?: number;
+ chunksTotal?: number;
+ currentPhase?: string;
+ etaSeconds?: number;
+ jobId?: number;
+ logSeq?: number;
+ message?: string;
+ percent?: number;
+ rowsDone?: number;
+ rowsFailed?: number;
+ rowsPerSecond?: number;
+ rowsTotal?: number;
+ status?: string;
+ };
+ RealtimeMetaDataChangedEventV1: {
+ generation?: number;
+ };
+ RealtimeRecordChangedEventV1: {
+ changedBy?: string;
+ fields?: string[];
+ pk?: (string | number | boolean) | null;
+ table?: string;
+ version?: (string | number | boolean) | null;
+ };
+ RealtimeRecordDeletedEventV1: {
+ pk?: (string | number | boolean) | null;
+ table?: string;
+ };
+ RealtimeResyncEventV1: Record;
+ RealtimeSessionEndedEventV1: Record;
+ RealtimeSubscriptionRequestV1: {
+ add?: string[];
+ connectionId?: string;
+ remove?: string[];
+ };
+ RealtimeSubscriptionResponseV1: {
+ active?: string[];
+ refused?: string[];
+ };
+ RealtimeTableChangedEventV1: {
+ table?: string;
+ };
+ RecordAssociatedScriptLogsResponseV1: {
+ /** @description The script revision's logs (scriptLog records, up to 100), newest (highest id) first. Each record's values include `scriptLogLine`: the log's lines, as a list of records (each with its own `values`, e.g., `text`). */
+ scriptLogRecords?: components["schemas"]["OutputRecord"][];
+ };
+ RecordAssociatedScriptStoreResponseV1: {
+ /** @description Id of the script (which is inserted, and referenced from the record, if the record did not yet reference one). */
+ scriptId?: number;
+ /** @description Name of the script. */
+ scriptName?: string;
+ /** @description Id of the new script revision. */
+ scriptRevisionId?: number;
+ /** @description Sequence number of the new revision within the script (1 for its first revision). */
+ scriptRevisionSequenceNo?: number;
+ };
+ RecordConflictV1: {
+ changedFields?: string[];
+ currentVersion?: (string | number | boolean) | null;
+ modifiedAt?: (string | number | boolean) | null;
+ modifiedByUserId?: (string | number | boolean) | null;
+ };
+ RecordDeveloperModeAssociatedScript: {
+ /** @description Definition of the associated script, from the table's meta-data. */
+ associatedScript?: components["schemas"]["AssociatedScriptMetaData"];
+ /** @description The script record that the record references. Omitted if the record does not reference an existing script. */
+ script?: components["schemas"]["OutputRecord"];
+ /** @description The script's revisions (scriptRevision records), newest (highest id) first. Present (possibly empty) when script is. */
+ scriptRevisions?: components["schemas"]["OutputRecord"][];
+ /** @description The scriptType record of the associated script. Omitted if there is no such record. */
+ scriptType?: components["schemas"]["OutputRecord"];
+ /** @description Input fields for testing the script. Present (possibly empty) when the associated script has a script tester. */
+ testInputFields?: components["schemas"]["FieldMetaData"][];
+ /** @description Output fields from testing the script. Present (possibly empty) when the associated script has a script tester. */
+ testOutputFields?: components["schemas"]["FieldMetaData"][];
+ };
+ RecordDeveloperModeResponseV1: {
+ /** @description Each of the table's associated scripts, with the script the record references (if any). Empty when the table has no associated scripts (or the instance has no script tables). */
+ associatedScripts?: components["schemas"]["RecordDeveloperModeAssociatedScript"][];
+ /** @description The record, with display values (and possible values translated). */
+ record?: {
+ /** @description Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written. */
+ associatedRecords?: {
+ [key: string]: unknown[];
+ };
+ /** @description Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings. */
+ displayValues?: Record;
+ /** @description Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none. */
+ errors?: string[];
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them. */
+ values?: Record;
+ /** @description Messages for warnings on this record. Omitted when there are none. */
+ warnings?: string[];
+ };
+ };
+ RecordDeveloperPanelsResponseV1: {
+ /** @description The panels that the instance's developer panel providers contribute for this record, sorted by order then title. Each panel has an id, title, order, optional icon, description and status badge (statusLabel, statusTone: INFO, SUCCESS, WARNING or ERROR), and either an error message (when its provider failed) or a list of blocks. Each block has a type and a label; KEY_VALUES blocks use items (label, value, monospace, href), TEXT blocks use text and tone, CODE blocks use language and code, TABLE blocks use columns and rows (lists of display strings), LINKS blocks use links (label, href, description, external) and ACTIONS blocks use actions (label, processName, tableName, includeRecordId, description). Hrefs are app-relative (e.g., /app/table/1) or absolute. */
+ panels?: {
+ blocks?: unknown[];
+ description?: string;
+ error?: string;
+ icon?: string;
+ id?: string;
+ order?: number;
+ statusLabel?: string;
+ /** @enum {string} */
+ statusTone?: "INFO" | "SUCCESS" | "WARNING" | "ERROR";
+ title?: string;
+ }[];
+ };
+ RecordFeatureSummaryV1: {
+ tableName?: string;
+ primaryKey?: string;
+ features?: ("ATTACHMENTS" | "TAGS" | "CUSTOM_FIELDS" | "COMMENTS" | "PRESENCE" | "SHARING" | "FAVORITES" | "FOLLOW" | "TIMELINE" | "RECENTS" | "TASKS" | "ASSIGNMENT")[];
+ capabilities?: {
+ [key: string]: boolean;
+ };
+ isFavorite?: boolean | null;
+ isFollowing?: boolean | null;
+ counts?: {
+ [key: string]: number;
+ };
+ owner?: string | null;
+ assignee?: string | null;
+ presence?: {
+ [key: string]: unknown;
+ }[] | null;
+ extensions?: {
+ [key: string]: {
+ [key: string]: unknown;
+ };
+ };
+ };
+ RecordFeaturesV1: {
+ capabilities?: {
+ [key: string]: boolean;
+ };
+ features?: ("ATTACHMENTS" | "TAGS" | "CUSTOM_FIELDS" | "COMMENTS" | "PRESENCE" | "SHARING" | "FAVORITES" | "FOLLOW" | "TIMELINE" | "RECENTS" | "TASKS" | "ASSIGNMENT")[];
+ ownership?: {
+ assigneeFieldName?: string;
+ ownerFieldName?: string;
+ };
+ settings?: {
+ [key: string]: {
+ [key: string]: unknown;
+ };
+ };
+ };
+ RecordSearchDetailV1: {
+ /** @description Display value of the field. */
+ displayValue?: string;
+ /** @description User-facing label of the field. */
+ fieldLabel?: string;
+ /** @description Name of the field. */
+ fieldName?: string;
+ };
+ RecordSearchHighlightMatchV1: {
+ /** @description Offset just after the last matched character (exclusive). */
+ end?: number;
+ /** @description Offset of the first matched character in the highlight text. */
+ start?: number;
+ };
+ RecordSearchHighlightV1: {
+ /** @description User-facing label of the field. */
+ fieldLabel?: string;
+ /** @description Name of the field the snippet is from. */
+ fieldName?: string;
+ /** @description Matched spans in the text: sorted, non-overlapping character offsets (start inclusive, end exclusive). */
+ matches?: components["schemas"]["RecordSearchHighlightMatchV1"][];
+ /** @description Plain-text snippet of the field value (never markup; an ellipsis marks trimmed ends). */
+ text?: string;
+ };
+ RecordSearchProviderStatusV1: {
+ /** @description When the provider failed: the simple class name of the root cause (e.g., ConnectException). */
+ failureClass?: string;
+ /** @description When the provider failed with a user-facing error: its message (one line). */
+ message?: string;
+ /**
+ * @description OK: the provider searched the tables it claimed. FAILED: it failed, and those tables were searched with the default search. NONE: there is no provider, or it claimed none of the searched tables.
+ * @enum {string}
+ */
+ status?: "OK" | "FAILED" | "NONE";
+ };
+ RecordSearchResponseV1: {
+ /** @description How the instance's record search provider fared: when its status is FAILED, the tables it claimed were searched with the default search instead (their source is FALLBACK). */
+ provider?: {
+ /** @description When the provider failed: the simple class name of the root cause (e.g., ConnectException). */
+ failureClass?: string;
+ /** @description When the provider failed with a user-facing error: its message (one line). */
+ message?: string;
+ /**
+ * @description OK: the provider searched the tables it claimed. FAILED: it failed, and those tables were searched with the default search. NONE: there is no provider, or it claimed none of the searched tables.
+ * @enum {string}
+ */
+ status?: "OK" | "FAILED" | "NONE";
+ };
+ /** @description Records whose search fields match the search term, grouped by table (in instance order) and, within each table, in the requested order (RELEVANCE: the search provider's order, or by primary key for the default search; RECENT: most recently modified first). */
+ results?: components["schemas"]["RecordSearchResultV1"][];
+ /** @description A summary of each searched table, in the order of the results: how many results it returned, whether it has more, and what searched it. */
+ tables?: components["schemas"]["RecordSearchTableSummaryV1"][];
+ };
+ RecordSearchResultV1: {
+ /** @description Other search field values (not in the record label, and not highlighted) to show under the record label. */
+ details?: components["schemas"]["RecordSearchDetailV1"][];
+ /** @description Plain-text snippets of the fields (other than those in the record label) that match the search term, with the matched spans. */
+ highlights?: components["schemas"]["RecordSearchHighlightV1"][];
+ /** @description Primary key of the record, as a string. */
+ recordId?: string;
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Relevance from the record search provider (higher is better); absent for the default search. */
+ score?: number;
+ /** @description User-facing label of the table that the record is from. */
+ tableLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description When the record was last modified (ISO-8601 instant), when its table has a last-modified field the user may see. */
+ updatedAt?: string;
+ };
+ RecordSearchTableSummaryV1: {
+ /** @description Whether the table has more matches past these results (request them with offset). */
+ hasMore?: boolean | null;
+ /** @description Number of results returned from the table. */
+ resultCount?: number;
+ /**
+ * @description What searched the table: the record search PROVIDER, the DEFAULT search, or the default search as a FALLBACK because the provider failed.
+ * @enum {string}
+ */
+ source?: "PROVIDER" | "DEFAULT" | "FALLBACK";
+ /** @description User-facing label of the table. */
+ tableLabel?: string;
+ /** @description Name of the table. */
+ tableName?: string;
+ /** @description Approximate total number of matches in the table, when the search knows it (records the user may not read can make it high). */
+ totalCount?: number;
+ };
+ RelatedRecordPicker: {
+ /** @description The association whose rows the picker adds (MULTI_CHILD, LINK) */
+ associationName?: string;
+ /** @description Whether the user may add child or join rows (prepare and add routes) */
+ canAddChildren?: boolean | null;
+ /** @description Whether to offer quick-create of a target record (insert route of targetTableName) */
+ canCreateTarget?: boolean | null;
+ /** @description Whether the user may unlink (remove route; LINK only) */
+ canRemoveChildren?: boolean | null;
+ /** @description The child or join table new rows go into (MULTI_CHILD, LINK) */
+ childTableName?: string;
+ /** @description The child table's field that holds the picked record's key (MULTI_CHILD, LINK) */
+ childTargetFieldName?: string;
+ /** @description Target fields to show as result columns */
+ columns?: string[];
+ /** @description Initial, user-editable filter; the query route returns it resolved as resolvedDefaultFilter */
+ defaultFilter?: components["schemas"]["QueryFilter"];
+ /** @description The foreign-key field the picker sets (SINGLE) */
+ fieldName?: string;
+ /** @description Filter the server always applies to the picker's queries (may contain ${input.fieldName} variables, read from the parent record) */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Dialog title, and the label of the button that opens it */
+ label?: string;
+ /** @description Most records one add or link may pick (MULTI_CHILD, LINK) */
+ maxSelections?: number;
+ /** @description SINGLE: choose one record for fieldName. MULTI_CHILD: add child rows through associationName, after a review of reviewFieldNames. LINK: link and unlink through associationName (a join table). */
+ mode?: string;
+ /** @description Picker name; the {pickerName} path segment of the relatedRecordPicker routes */
+ name?: string;
+ /** @description Target fields to show for the highlighted record */
+ previewFields?: string[];
+ /** @description Child fields the user fills per picked record before saving (MULTI_CHILD); empty means no review step */
+ reviewFieldNames?: string[];
+ /** @description The table records are picked from (read its metadata for fields, sections and quickCreateSectionName) */
+ targetTableName?: string;
+ /** @description Target field holding an image URL, for thumbnails */
+ thumbnailField?: string;
+ };
+ RelatedRecordPickerAddResponseV1: {
+ /** @description The inserted child or join rows */
+ records?: components["schemas"]["OutputRecord"][];
+ /** @description Warnings from the inserts, if any */
+ warnings?: string[];
+ };
+ RelatedRecordPickerPrepareResponseV1: {
+ /** @description One unsaved child row per target id, in request order, with defaults, values copied from the target, and the parent and target keys (whose display value is the target's label) */
+ records?: components["schemas"]["OutputRecord"][];
+ /** @description Child fields for the user to review per row before the add route; empty means add without a review */
+ reviewFieldNames?: string[];
+ };
+ RelatedRecordPickerQueryResponseV1: {
+ /** @description Whether more records follow (request the next page with skip); there is no count */
+ hasMore?: boolean | null;
+ /** @description Ids (as strings) of the returned records the parent already has a child or join row for (MULTI_CHILD, LINK with primaryKey) */
+ linkedIds?: string[];
+ /** @description One page of target records (values and display values), in order */
+ records?: components["schemas"]["OutputRecord"][];
+ /** @description The picker's defaultFilter with its variables resolved, to start the dialog's filter from (first page only) */
+ resolvedDefaultFilter?: {
+ /**
+ * @description Boolean operator to apply between criteria
+ * @enum {string}
+ */
+ booleanOperator?: "AND" | "OR";
+ /** @description Field level criteria that make up the query filter */
+ criteria?: components["schemas"]["FilterCriteria"][];
+ /** @description Maximum number of results to return. */
+ limit?: number;
+ /** @description How the query's results should be ordered (sorted). */
+ orderBys?: components["schemas"]["OrderBy"][];
+ /** @description Records to skip (e.g., to implement pagination) */
+ skip?: number;
+ };
+ };
+ RelatedRecordPickerRemoveResponseV1: {
+ /** @description How many join rows were deleted */
+ deletedCount?: number;
+ };
+ ReportMetaData: {
+ /** @description Whether the user may run the report. */
+ hasPermission?: boolean;
+ /** @description Help entries by slot, filtered for the current session. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Material UI icon name (web); prefer iconSemanticName */
+ iconName?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ iconSemanticName?: string;
+ /** @description User-facing name for this report. */
+ label?: string;
+ /** @description Unique name for this report within the QQQ Instance. */
+ name?: string;
+ /** @description Process that runs this report, when it has one; otherwise it runs from GET /reports/{reportName}. */
+ processName?: string;
+ };
+ SavedViewsCapabilityV1: {
+ /** @description True when the user may list saved views (queryProcessName can run). */
+ available?: boolean | null;
+ /** @description Deletes a view; absent when the user may not delete views. */
+ deleteProcessName?: string;
+ /** @description Lists the views (input tableName; output savedViewList). */
+ queryProcessName?: string;
+ /** @description Stores (inserts or updates) a view; absent when the user may not store views. */
+ storeProcessName?: string;
+ };
+ SharingCapabilityV1: {
+ /** @description True when the table is shareable and the user may list shares. */
+ available?: boolean | null;
+ /** @description Removes a share. */
+ deleteProcessName?: string;
+ /** @description Changes a share's scope. */
+ editProcessName?: string;
+ /** @description Adds a share (the record owner only; the server checks). */
+ insertProcessName?: string;
+ /** @description Lists a record's shares. */
+ listProcessName?: string;
+ };
+ SupplementalInstanceMetaData: {
+ /** @description Present (an object) when the instance has the assistant QBit's `assistant` supplemental meta-data - that is, when the assistant is installed and enabled, so a frontend may probe its routes. Always has `available: true`, plus the strings, numbers and booleans the QBit publishes for frontends. */
+ assistant?: {
+ [key: string]: unknown;
+ };
+ /**
+ * @deprecated
+ * @description Use uiSettings; kept for Next UI until it migrates
+ */
+ materialDashboard?: components["schemas"]["MaterialDashboardInstanceSettings"];
+ /**
+ * @deprecated
+ * @description Use uiSettings; kept for Next UI until it migrates. The application theme from the instance's MaterialDashboardThemeMetaData supplemental meta-data, when the instance defines it. Keys are MaterialDashboardThemeMetaData property names (for example primaryColor, fontFamily, typographyH1FontSize, borderRadiusGlobal, density, customCss, brandedHeaderEnabled, sidebarBackgroundColor, tableHeaderBackgroundColor); values are strings, numbers or booleans. An explicit allow-list of the theme's visual properties; properties without a value are omitted.
+ */
+ materialDashboardTheme?: {
+ [key: string]: unknown;
+ };
+ /** @description Client-neutral process, query, record-view and theme settings. */
+ uiSettings?: components["schemas"]["UiSettings"];
+ };
+ /** @description An OpenAPI 3 document (the application API's own format, not part of this API's schema). */
+ TableApiDocumentV1: {
+ [key: string]: unknown;
+ };
+ /** @description An application API that exposes the table. */
+ TableApiV1: {
+ /** @description The API's name (a stable key). */
+ name?: string;
+ /** @description Label to show users. */
+ label?: string;
+ /** @description Root-relative base path of the API, e.g. `/api/`. */
+ path?: string;
+ /** @description The version the API calls current. */
+ currentVersion?: string | null;
+ /** @description Every version the API serves. */
+ versions?: components["schemas"]["TableApiVersionV1"][];
+ };
+ /** @description One version of an API. */
+ TableApiVersionV1: {
+ /** @description The version, as it appears in the API's URLs. */
+ version?: string;
+ /** @description Its semantic version, when the API declares one. */
+ semanticVersion?: string | null;
+ /** @description Root-relative path of the table's OpenAPI document (JSON) in this version. */
+ tableSpecPath?: string;
+ };
+ /** @description The APIs that expose a table. */
+ TableApisResponseV1: {
+ /** @description The APIs, by name. */
+ apis?: components["schemas"]["TableApiV1"][];
+ };
+ TableCapabilitiesV1: {
+ SAVED_VIEW_DELETE_PROCESS?: string;
+ SAVED_VIEW_QUERY_PROCESS?: string;
+ SAVED_VIEW_STORE_PROCESS?: string;
+ /** @description Audit history of this table's records. */
+ audits?: components["schemas"]["AuditsCapabilityV1"];
+ /** @description Bulk delete of selected records. */
+ bulkDelete?: components["schemas"]["ProcessCapabilityV1"];
+ /** @description Bulk edit of selected records. */
+ bulkEdit?: components["schemas"]["ProcessCapabilityV1"];
+ /** @description Bulk edit from a file. */
+ bulkEditWithFile?: components["schemas"]["ProcessCapabilityV1"];
+ /** @description Bulk insert (load a file into the table). */
+ bulkInsert?: components["schemas"]["ProcessCapabilityV1"];
+ /** @description Saved views of this table. */
+ savedViews?: components["schemas"]["SavedViewsCapabilityV1"];
+ /** @description Record sharing, for a shareable table. */
+ sharing?: components["schemas"]["SharingCapabilityV1"];
+ };
+ TableCountResponseV1: {
+ /** @description Number (count) of records that satisfy the query request */
+ count?: number;
+ /** @description Number (count) of distinct records that satisfy the query request. Only included if requested. */
+ distinctCount?: number;
+ };
+ TableDeleteResponseV1: {
+ /** @description Number of records that were deleted */
+ deletedRecordCount?: number;
+ /** @description Why records were not deleted (for example, a record that was not found). Omitted when every record was deleted. */
+ errors?: string[];
+ };
+ TableGetResponseV1: {
+ /** @description The record that was fetched */
+ record?: {
+ /** @description Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written. */
+ associatedRecords?: {
+ [key: string]: unknown[];
+ };
+ /** @description Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings. */
+ displayValues?: Record;
+ /** @description Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none. */
+ errors?: string[];
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them. */
+ values?: Record;
+ /** @description Messages for warnings on this record. Omitted when there are none. */
+ warnings?: string[];
+ };
+ };
+ TableInsertResponseV1: {
+ /** @description The record that was inserted */
+ record?: {
+ /** @description Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written. */
+ associatedRecords?: {
+ [key: string]: unknown[];
+ };
+ /** @description Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings. */
+ displayValues?: Record;
+ /** @description Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none. */
+ errors?: string[];
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them. */
+ values?: Record;
+ /** @description Messages for warnings on this record. Omitted when there are none. */
+ warnings?: string[];
+ };
+ /** @description Any warnings that occurred during the insert */
+ warnings?: string[];
+ };
+ TableMenu: {
+ /** @description Icon of the menu's button. */
+ icon?: components["schemas"]["Icon"];
+ /** @description The menu's items, in order. */
+ items?: components["schemas"]["TableMenuItem"][];
+ /** @description User-facing label of the menu's button. */
+ label?: string;
+ /** @description Where the menu goes: VIEW_SCREEN_ACTIONS, VIEW_SCREEN_ADDITIONAL, QUERY_SCREEN_ACTIONS or QUERY_SCREEN_ADDITIONAL (or a slot the application defines). */
+ slot?: string;
+ };
+ TableMenuItem: {
+ /** @description Icon of the item, when it overrides the frontend's default. */
+ icon?: components["schemas"]["Icon"];
+ /** @description What the item is and how a frontend handles it: BUILT_IN (a standard action named by values.option, such as NEW, COPY, EDIT, DELETE, DEVELOPER_MODE, AUDIT, THIS_TABLE_PROCESS_LIST or ALL_TABLES_PROCESS_LIST), RUN_PROCESS (values.processName), DOWNLOAD_FILE (values.fieldName), SUB_MENU and SUB_LIST (values.items), or DIVIDER. */
+ itemType?: string;
+ /** @description User-facing label of the item, when it overrides the frontend's default. */
+ label?: string;
+ /** @description Item-type specific values: option for BUILT_IN, processName for RUN_PROCESS, fieldName for DOWNLOAD_FILE, and items (a list of menu items of this same shape) for SUB_MENU and SUB_LIST. */
+ values?: {
+ fieldName?: string;
+ items?: components["schemas"]["TableMenuItem"][];
+ option?: string;
+ processName?: string;
+ };
+ };
+ TableMetaData: {
+ /** @description Named record associations and their joins, without child record access */
+ associations?: components["schemas"]["Association"][];
+ /** @description Built-in views; evaluate their filters in the current session without persisting the resolved user id. */
+ builtInViews?: components["schemas"]["BuiltInViewV1"][];
+ /** @description List of strings describing actions that are supported by the backend application for the table. */
+ capabilities?: string[];
+ /** @description What a client may offer on this table beyond plain CRUD - saved views, audits, sharing and the bulk processes - with the process or table to use for each, for the current user. Clients use these instead of hard-coded process names. Since 1.6.0. */
+ clientCapabilities?: components["schemas"]["TableCapabilitiesV1"];
+ /** @description Boolean to indicate if the user has delete permission for the table. */
+ deletePermission?: boolean | null;
+ /** @description Boolean to indicate if the user has edit permission for the table. */
+ editPermission?: boolean | null;
+ /** @description Sections to organize fields on screens for this record */
+ exposedJoins?: components["schemas"]["ExposedJoin"][];
+ /** @description Fields in this table */
+ fields?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description True when any field has REVEALABLE, MASKED, or HIDDEN access for the current session. */
+ hasRestrictedFields?: boolean | null;
+ /** @description Help Contents for this table. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the table */
+ icon?: components["schemas"]["Icon"];
+ /** @description Boolean to indicate if the user has insert permission for the table. */
+ insertPermission?: boolean | null;
+ /** @description Boolean indicator of whether the table should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this table */
+ label?: string;
+ /** @description Menus the table defines for screen slots (for example the record view's VIEW_SCREEN_ACTIONS menu, which replaces the default actions menu, and VIEW_SCREEN_ADDITIONAL menus). Omitted when the table defines none. */
+ menus?: components["schemas"]["TableMenu"][];
+ /** @description Runtime metadata generation; refetch metadata when this changes. */
+ metaDataGeneration?: number;
+ /** @description Unique name for this table within the QQQ Instance */
+ name?: string;
+ /** @description Name of the primary key field in this table */
+ primaryKeyField?: string;
+ /** @description Name of the section whose editable fields a quick-create form shows (else the required, editable fields) */
+ quickCreateSectionName?: string;
+ /** @description Boolean to indicate if the user has read permission for the table. */
+ readPermission?: boolean | null;
+ /** @description Enabled record collaboration features, public settings, and this session's table capabilities. */
+ recordFeatures?: components["schemas"]["RecordFeaturesV1"];
+ /** @description Related-record pickers of this table whose target the user may read (docs/RELATED-RECORD-PICKER.md) */
+ relatedRecordPickers?: components["schemas"]["RelatedRecordPicker"][];
+ /** @description Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it. */
+ searchFields?: string[];
+ /** @description Sections to organize fields on screens for this record */
+ sections?: components["schemas"]["TableSection"][];
+ /** @description For tables that support the sharing feature, meta-data about the sharing setup. */
+ shareableTableMetaData?: {
+ assetIdFieldName?: string;
+ audiencePossibleValueSourceName?: string;
+ audienceTypes?: Record;
+ audienceTypesPossibleValueSourceName?: string;
+ scopeFieldName?: string;
+ sharedRecordTableName?: string;
+ thisTableOwnerIdFieldName?: string;
+ };
+ /** @description Additional meta data about the table, not necessarily known to QQQ. */
+ supplementalMetaData?: Record;
+ /** @description Whether or not this table's backend uses variants. */
+ usesVariants?: boolean | null;
+ /** @description If the table uses variants, this is the user-facing label for the table that supplies variants for this table. */
+ variantTableLabel?: string;
+ /** @description Virtual fields in this table */
+ virtualFields?: {
+ [key: string]: components["schemas"]["VirtualFieldMetaData"];
+ };
+ };
+ TableMetaDataLight: {
+ /** @description List of strings describing actions that are supported by the backend application for the table. */
+ capabilities?: string[];
+ /** @description Boolean to indicate if the user has delete permission for the table. */
+ deletePermission?: boolean | null;
+ /** @description Boolean to indicate if the user has edit permission for the table. */
+ editPermission?: boolean | null;
+ /** @description Help Contents for this table. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the table */
+ icon?: components["schemas"]["Icon"];
+ /** @description Boolean to indicate if the user has insert permission for the table. */
+ insertPermission?: boolean | null;
+ /** @description Boolean indicator of whether the table should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this table */
+ label?: string;
+ /** @description Runtime metadata generation; refetch metadata when this changes. */
+ metaDataGeneration?: number;
+ /** @description Unique name for this table within the QQQ Instance */
+ name?: string;
+ /** @description Boolean to indicate if the user has read permission for the table. */
+ readPermission?: boolean | null;
+ /** @description Enabled record collaboration features, public settings, and this session's table capabilities. */
+ recordFeatures?: components["schemas"]["RecordFeaturesV1"];
+ /** @description Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it. */
+ searchFields?: string[];
+ /** @description If the table uses variants, this is the user-facing label for the table that supplies variants for this table. */
+ variantTableLabel?: string;
+ };
+ TableMetaDataResponseV1: {
+ /** @description Named record associations and their joins, without child record access */
+ associations?: components["schemas"]["Association"][];
+ /** @description Built-in views; evaluate their filters in the current session without persisting the resolved user id. */
+ builtInViews?: components["schemas"]["BuiltInViewV1"][];
+ /** @description List of strings describing actions that are supported by the backend application for the table. */
+ capabilities?: string[];
+ /** @description What a client may offer on this table beyond plain CRUD - saved views, audits, sharing and the bulk processes - with the process or table to use for each, for the current user. Clients use these instead of hard-coded process names. Since 1.6.0. */
+ clientCapabilities?: {
+ SAVED_VIEW_DELETE_PROCESS?: string;
+ SAVED_VIEW_QUERY_PROCESS?: string;
+ SAVED_VIEW_STORE_PROCESS?: string;
+ /** @description Audit history of this table's records. */
+ audits?: {
+ /** @description True when the table is audited and the user can read its audits one of the two ways. */
+ available?: boolean | null;
+ /** @description The audit detail table (field changes), joined to tableName. */
+ detailTableName?: string;
+ /** @description The table's audit level: NONE, RECORD or FIELD. */
+ level?: string;
+ /** @description The process that returns a record's audits (inputs tableName, recordId); absent when the user may not run it. */
+ processName?: string;
+ /** @description The audit table, when the user may query it directly. */
+ tableName?: string;
+ };
+ /** @description Bulk delete of selected records. */
+ bulkDelete?: {
+ /** @description True when the process exists and the user may run it. */
+ available?: boolean | null;
+ /** @description The process to run (present only when available). */
+ processName?: string;
+ };
+ /** @description Bulk edit of selected records. */
+ bulkEdit?: {
+ /** @description True when the process exists and the user may run it. */
+ available?: boolean | null;
+ /** @description The process to run (present only when available). */
+ processName?: string;
+ };
+ /** @description Bulk edit from a file. */
+ bulkEditWithFile?: {
+ /** @description True when the process exists and the user may run it. */
+ available?: boolean | null;
+ /** @description The process to run (present only when available). */
+ processName?: string;
+ };
+ /** @description Bulk insert (load a file into the table). */
+ bulkInsert?: {
+ /** @description True when the process exists and the user may run it. */
+ available?: boolean | null;
+ /** @description The process to run (present only when available). */
+ processName?: string;
+ };
+ /** @description Saved views of this table. */
+ savedViews?: {
+ /** @description True when the user may list saved views (queryProcessName can run). */
+ available?: boolean | null;
+ /** @description Deletes a view; absent when the user may not delete views. */
+ deleteProcessName?: string;
+ /** @description Lists the views (input tableName; output savedViewList). */
+ queryProcessName?: string;
+ /** @description Stores (inserts or updates) a view; absent when the user may not store views. */
+ storeProcessName?: string;
+ };
+ /** @description Record sharing, for a shareable table. */
+ sharing?: {
+ /** @description True when the table is shareable and the user may list shares. */
+ available?: boolean | null;
+ /** @description Removes a share. */
+ deleteProcessName?: string;
+ /** @description Changes a share's scope. */
+ editProcessName?: string;
+ /** @description Adds a share (the record owner only; the server checks). */
+ insertProcessName?: string;
+ /** @description Lists a record's shares. */
+ listProcessName?: string;
+ };
+ };
+ /** @description Boolean to indicate if the user has delete permission for the table. */
+ deletePermission?: boolean | null;
+ /** @description Boolean to indicate if the user has edit permission for the table. */
+ editPermission?: boolean | null;
+ /** @description Sections to organize fields on screens for this record */
+ exposedJoins?: components["schemas"]["ExposedJoin"][];
+ /** @description Fields in this table */
+ fields?: {
+ [key: string]: components["schemas"]["FieldMetaData"];
+ };
+ /** @description True when any field has REVEALABLE, MASKED, or HIDDEN access for the current session. */
+ hasRestrictedFields?: boolean | null;
+ /** @description Help Contents for this table. */
+ helpContents?: {
+ [key: string]: components["schemas"]["HelpContentV1"][];
+ };
+ /** @description Icon to display for the table */
+ icon?: {
+ /** @description A color code to use for displaying the icon */
+ color?: string;
+ /** @description Material UI icon name (web); prefer semanticName */
+ name?: string;
+ /** @description A path to an image file that can be requested from the server, to serve as the icon image instead of a material UI icon. */
+ path?: string;
+ /** @description Client-neutral kebab-case icon token; null when unmapped. */
+ semanticName?: string;
+ };
+ /** @description Boolean to indicate if the user has insert permission for the table. */
+ insertPermission?: boolean | null;
+ /** @description Boolean indicator of whether the table should be shown to users or not */
+ isHidden?: boolean | null;
+ /** @description User-facing name for this table */
+ label?: string;
+ /** @description Menus the table defines for screen slots (for example the record view's VIEW_SCREEN_ACTIONS menu, which replaces the default actions menu, and VIEW_SCREEN_ADDITIONAL menus). Omitted when the table defines none. */
+ menus?: components["schemas"]["TableMenu"][];
+ /** @description Runtime metadata generation; refetch metadata when this changes. */
+ metaDataGeneration?: number;
+ /** @description Unique name for this table within the QQQ Instance */
+ name?: string;
+ /** @description Name of the primary key field in this table */
+ primaryKeyField?: string;
+ /** @description Name of the section whose editable fields a quick-create form shows (else the required, editable fields) */
+ quickCreateSectionName?: string;
+ /** @description Boolean to indicate if the user has read permission for the table. */
+ readPermission?: boolean | null;
+ recordFeatures?: components["schemas"]["RecordFeaturesV1"];
+ /** @description Related-record pickers of this table whose target the user may read (docs/RELATED-RECORD-PICKER.md) */
+ relatedRecordPickers?: components["schemas"]["RelatedRecordPicker"][];
+ /** @description Names of the fields that record search (POST /search) matches for this table. Only present when the table is searchable and the user has read permission for it. */
+ searchFields?: string[];
+ /** @description Sections to organize fields on screens for this record */
+ sections?: components["schemas"]["TableSection"][];
+ /** @description For tables that support the sharing feature, meta-data about the sharing setup. */
+ shareableTableMetaData?: {
+ assetIdFieldName?: string;
+ audiencePossibleValueSourceName?: string;
+ audienceTypes?: Record;
+ audienceTypesPossibleValueSourceName?: string;
+ scopeFieldName?: string;
+ sharedRecordTableName?: string;
+ thisTableOwnerIdFieldName?: string;
+ };
+ /** @description Additional meta data about the table, not necessarily known to QQQ. */
+ supplementalMetaData?: Record;
+ /** @description Whether or not this table's backend uses variants. */
+ usesVariants?: boolean | null;
+ /** @description If the table uses variants, this is the user-facing label for the table that supplies variants for this table. */
+ variantTableLabel?: string;
+ /** @description Virtual fields in this table */
+ virtualFields?: {
+ [key: string]: components["schemas"]["VirtualFieldMetaData"];
+ };
+ };
+ TableQueryResponseV1: {
+ /** @description List of records that satisfy the query request */
+ records?: components["schemas"]["OutputRecord"][];
+ };
+ TableSection: {
+ /** @description Alternative versions of this section for specific screens, keyed by alternative type (for example RECORD_VIEW or RECORD_EDIT). A screen of that type uses the alternative in place of this definition. Omitted when there are none. */
+ alternatives?: {
+ [key: string]: components["schemas"]["TableSection"];
+ };
+ /** @description Whether screens that can collapse sections may collapse this one, and whether it starts open. Omitted when the section defines no collapsible behavior. */
+ collapsible?: components["schemas"]["TableSectionCollapsible"];
+ /** @description List of field names to include in this section. */
+ fieldNames?: unknown[];
+ /** @description Layout suggestion, for how many columns of a 12-grid this section should use. */
+ gridColumns?: number;
+ /** @description Help Contents for this section table. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description Icon to display for the table */
+ icon?: components["schemas"]["Icon"];
+ /** @description User-facing label to display for this section */
+ label?: string;
+ /** @description Unique identifier for this section within this table */
+ name?: string;
+ /** @description Importance of this section (T1, T2, or T3) */
+ tier?: string;
+ /** @description Name of a widget in this QQQ instance to include in this section (instead of fields). */
+ widgetName?: string;
+ };
+ TableSectionCollapsible: {
+ /** @description Whether a collapsible section starts open, before the user has opened or closed it. */
+ initiallyOpen?: boolean | null;
+ /** @description Whether screens that can collapse sections let the user collapse and expand this one. */
+ isCollapsible?: boolean | null;
+ };
+ TableUpdateResponseV1: {
+ /** @description The record that was updated */
+ record?: {
+ /** @description Records associated with this record, keyed by association name. Each value is a list of records with the same shape as this one. Only present when associations were requested or written. */
+ associatedRecords?: {
+ [key: string]: unknown[];
+ };
+ /** @description Formatted string versions of the values that make up the record. Keys are Strings, which match the table's field names. Values are all Strings. */
+ displayValues?: Record;
+ /** @description Messages for errors on this record (for example on an associated record that could not be written). Omitted when there are none. */
+ errors?: string[];
+ /** @description Label to identify the record to a user. */
+ recordLabel?: string;
+ /** @description Name of the table that the record is from. */
+ tableName?: string;
+ /** @description Raw values that make up the record. Keys are Strings, which match the table's field names. Values can be any type, as per the table's fields. Single-record responses (get, insert, update) include fields whose value is null; query results omit them. */
+ values?: Record;
+ /** @description Messages for warnings on this record. Omitted when there are none. */
+ warnings?: string[];
+ };
+ /** @description Any warnings that occurred during the update */
+ warnings?: string[];
+ };
+ TableVariant: {
+ /** @description Identifier for the variant option (record) being used. */
+ id?: string;
+ /** @description A user-facing name (or label) for the variant option being used. */
+ name?: string;
+ /** @description Specification for the variant type (variantTypeKey from QQQ BackendVariantsConfig) */
+ type?: string;
+ };
+ TableVariantsResponseV1: {
+ /** @description The variants the table's backend can be scoped to - send one back as tableVariant in query, count, get and export requests. Empty (always present) when the backend does not use variants. */
+ variants?: components["schemas"]["TableVariant"][];
+ };
+ UiApiExtensionInfo: {
+ /** @description A short description of the extension. */
+ description?: string;
+ /** @description The extension namespace, e.g. alerts or sql-workbench. */
+ name?: string;
+ /** @description The path prefix of the extension operations under the API base path, e.g. /qbit/backups or /esb. */
+ pathPrefix?: string;
+ /** @description The extension semantic version (MAJOR.MINOR.PATCH). */
+ version?: string;
+ };
+ UiSettings: {
+ /** @description Visible processes offered on every query and record-view screen. */
+ processNamesToAddToAllQueryAndViewScreens?: string[];
+ /** @description Placement of record-view actions. */
+ recordViewActionsPlacement?: string;
+ /** @description Configured colors and font families; no web layout or CSS settings. */
+ theme?: {
+ [key: string]: string;
+ };
+ /** @description Weekday query criteria configuration. */
+ weekdayCriteriaSettings?: components["schemas"]["MaterialDashboardWeekdayCriteriaSettings"];
+ };
+ UploadRefResponseV1: {
+ /** @description The file's content type, as uploaded. */
+ contentType?: string;
+ /** @description When the ref stops working (ISO-8601). A job that uses it extends it. */
+ expiresAt?: string;
+ /** @description The file's name. */
+ fileName?: string;
+ /** @description Opaque ref to the uploaded file, bound to the uploading user. Pass it in uploadRefs. */
+ ref?: string;
+ /** @description The file's size in bytes. */
+ sizeBytes?: number;
+ };
+ VersionResponseV1: {
+ /** @description Semantic version (MAJOR.MINOR.PATCH) of the UI API this server implements. MAJOR matches the URL version (v1). A client built against 1.x works with any server 1.y where y >= x. */
+ apiVersion?: string;
+ /** @description Base path of this API version, e.g. /qqq/v1. */
+ basePath?: string;
+ /** @description Client channel names the server accepts in the X-QQQ-Client request header (`channel[/detail]`, e.g. next-ui, assistant/). A client names itself on every request; it is recorded in audits and some objects are denied to some channels. The actor is always the signed-in user; a channel never grants anything. */
+ clientChannels?: string[];
+ /** @description Extensions (modules and qbits) registered on this server, each with its own path prefix and semantic version. */
+ extensions?: components["schemas"]["UiApiExtensionInfo"][];
+ /** @description Names of the optional core features this server supports, so a client can show or hide an area without probing. */
+ features?: string[];
+ /** @description The major versions of the UI API this server serves. */
+ supportedMajorVersions?: number[];
+ };
+ VirtualFieldMetaData: {
+ /**
+ * @description Effective field access: FULL, REVEALABLE, MASKED, or HIDDEN. Omitted means FULL. Restricted values are strings, regardless of field type.
+ * @enum {string}
+ */
+ accessTier?: "FULL" | "REVEALABLE" | "MASKED" | "HIDDEN";
+ /** @description Special UI dressings to add to the field. */
+ adornments?: components["schemas"]["FieldAdornment"][];
+ /** @description Allowed filter operators when restricted: EQUALS and IN for REVEALABLE when exact match is enabled, otherwise empty. Omitted means unrestricted. */
+ allowedFilterOperators?: string[];
+ /** @description Names of the field's behaviors that a frontend applies while editing, e.g., TO_UPPER_CASE, TO_LOWER_CASE or TRIM. Absent when the field has none. */
+ behaviors?: string[];
+ /** @description Default value to use in this field. */
+ defaultValue?: string;
+ /** @description C-style format specifier for displaying values in this field. */
+ displayFormat?: string;
+ /** @description Width of this field in a 12-column record form or view grid (e.g., 12 for the full width, 6 for half). Absent when the frontend's default applies. */
+ gridColumns?: number;
+ /** @description Help Contents for this field. */
+ helpContents?: components["schemas"]["HelpContentV1"][];
+ /** @description Inline possible-value source for this field; enumValues supply choices without a separate lookup. */
+ inlinePossibleValueSource?: {
+ customCodeReference?: {
+ /** @enum {string} */
+ codeType?: "JAVA" | "JAVA_SCRIPT";
+ inlineCode?: string;
+ name?: string;
+ };
+ enumValues?: unknown[];
+ helpContent?: Record;
+ /** @enum {string} */
+ idType?: "STRING" | "INTEGER" | "LONG" | "DECIMAL" | "BOOLEAN" | "DATE" | "TIME" | "DATE_TIME" | "TEXT" | "HTML" | "PASSWORD" | "BLOB";
+ label?: string;
+ name?: string;
+ orderByFields?: unknown[];
+ overrideIdField?: string;
+ picker?: {
+ detailFields?: unknown[];
+ filterFields?: unknown[];
+ pageSize?: number;
+ previewField?: string;
+ searchFields?: unknown[];
+ sorts?: unknown[];
+ subtitleFields?: unknown[];
+ thumbnailField?: string;
+ uploadProcessName?: string;
+ uploadResultIdField?: string;
+ };
+ searchFields?: unknown[];
+ tableName?: string;
+ /** @enum {string} */
+ type?: "ENUM" | "TABLE" | "CUSTOM";
+ valueFields?: unknown[];
+ valueFieldsIfNotFound?: unknown[];
+ valueFormat?: string;
+ valueFormatIfNotFound?: string;
+ };
+ /** @description Indicate if user may edit the value in this field. */
+ isEditable?: boolean | null;
+ /** @description Indicator of 'heavy' fields, which are not loaded by default. e.g., some blobs or long-texts */
+ isHeavy?: boolean | null;
+ /** @description Indicate if this field should be hidden from users */
+ isHidden?: boolean | null;
+ /** @description Indicator of whether or not this virtual field can be included as a query filter criteria */
+ isQueryCriteria?: boolean | null;
+ /** @description Indicator of whether or not this virtual field can be included in query outputs (e.g., if it can be selected, in the SQL sense) */
+ isQuerySelectable?: boolean | null;
+ /** @description Indicate if a value in this field is required. */
+ isRequired?: boolean | null;
+ /** @description False for restricted fields; omitted means sortable. */
+ isSortable?: boolean | null;
+ /** @description User-facing name for this field */
+ label?: string;
+ /** @description For String fields, the max length the field supports. */
+ maxLength?: number;
+ /** @description For number fields, the largest value the field accepts (inclusive). Absent when there is no such limit. */
+ maxValue?: string;
+ /** @description For number fields, the smallest value the field accepts (inclusive). Absent when there is no such limit. */
+ minValue?: string;
+ /** @description Unique name for this field within its container (table or process) */
+ name?: string;
+ /** @description When this field's possible value source declares a record picker (for sources over large tables), its configuration: thumbnail, preview, subtitle and detail fields, filter fields, search fields, sorts and page size. Frontends offer a searchable, paged picker dialog. */
+ picker?: {
+ detailFields?: unknown[];
+ filterFields?: unknown[];
+ pageSize?: number;
+ previewField?: string;
+ searchFields?: unknown[];
+ sorts?: unknown[];
+ subtitleFields?: unknown[];
+ thumbnailField?: string;
+ uploadProcessName?: string;
+ uploadResultIdField?: string;
+ };
+ /** @description When this field has a picker, the table its possible value source reads, whose metadata describes the picker's fields. */
+ pickerTableName?: string;
+ /**
+ * @description DISABLE_UNTIL_SET disables a contingent field until its dependencies are set (default). SHOW_ALL_UNTIL_SET keeps it enabled and omits criteria with missing inputs in form searches. Absent for non-contingent fields.
+ * @enum {string}
+ */
+ possibleValueSourceDependencyBehavior?: "DISABLE_UNTIL_SET" | "SHOW_ALL_UNTIL_SET";
+ /** @description Names of fields controlling this field's choices, including explicit and filter dependencies. Absent for non-contingent fields. */
+ possibleValueSourceDependsOn?: string[];
+ /** @description If this field's values should come from a possible value source, then that PVS is named here. */
+ possibleValueSourceName?: string;
+ /** @description Additional frontend-visible metadata for this field, keyed by supplemental type. */
+ supplementalMetaData?: Record;
+ /** @description Data-type for this field */
+ type?: string;
+ /** @description The field's validation rules, as the server enforces them on insert and update (required, maxLength and tooLongBehavior, min/max value, pattern). Absent when the field has none. Since 1.6.0. */
+ validation?: components["schemas"]["FieldValidationV1"];
+ };
+ WeekdayCriteriaArguments: {
+ timeZoneId?: string;
+ useSessionZoneId?: boolean;
+ } & {
+ [key: string]: string | number | boolean;
+ };
+ WidgetBlock: {
+ /** @description Unique identifier for this block within it widget. Used as a key for helpContents. */
+ blockId?: string;
+ /**
+ * @description What type of block to render.
+ * @enum {string}
+ */
+ blockType?: "BUTTON" | "AUDIO" | "BIG_NUMBER" | "COMPOSITE" | "DIVIDER" | "IMAGE" | "INPUT_FIELD" | "NUMBER_ICON_BADGE" | "PROGRESS_BAR" | "TABLE_SUB_ROW_DETAIL_ROW" | "TEXT" | "UP_OR_DOWN_NUMBER";
+ /** @description Name of the block's type, as the backend declares it (including types this API version does not enumerate in blockType). */
+ blockTypeName?: string;
+ /** @description Optional field name (e.g,. from a process's set of fields) to act as a 'guard' for the block - e.g., only include it in the UI if the value for this field is true */
+ conditional?: string;
+ /** @description Footer as plain text. */
+ footerText?: string;
+ /**
+ * @description For COMPOSITE type blocks, an indicator of how the sub-blocks should be laid out
+ * @enum {string}
+ */
+ layout?: "FLEX_COLUMN" | "FLEX_ROW_WRAPPED" | "FLEX_ROW_SPACE_BETWEEN" | "FLEX_ROW_CENTER" | "TABLE_SUB_ROW_DETAILS" | "BADGES_WRAPPER";
+ /**
+ * @description For COMPOSITE type blocks, optional control to make the widget appear modally
+ * @enum {string}
+ */
+ modalMode?: "MODAL";
+ /** @description Composite overlay as HTML. */
+ overlayHtml?: string;
+ /** @description Composite overlay as plain text. */
+ overlayText?: string;
+ /** @description Styles to apply to the block. Different fields based on blockType. */
+ styles?: components["schemas"]["WidgetBlockStyles"];
+ /** @description For COMPOSITE type blocks, a list of sub-blocks. */
+ subBlocks?: components["schemas"]["WidgetBlock"][];
+ /** @description Values to show in the block, or otherwise control its behavior. Different fields based on blockType. */
+ values?: components["schemas"]["WidgetBlockValues"];
+ };
+ /** @description Values used for an AUDIO type widget block */
+ WidgetBlockAudioValues: {
+ /** @description Control if the file should automatically play when the block is rendered */
+ autoPlay?: boolean | null;
+ /** @description The path to the audio file on the server */
+ path?: string;
+ /** @description Control if on-screen controls should be shown to allow the user to control playback */
+ showControls?: boolean | null;
+ };
+ WidgetBlockBaseStyles: {
+ /** @description A background color to use for the block */
+ backgroundColor?: string;
+ /** @description Optional padding to apply to the block */
+ padding?: {
+ bottom?: Record;
+ left?: Record;
+ right?: Record;
+ top?: Record;
+ };
+ };
+ WidgetBlockButtonStyles: {
+ /** @description A Color to use for the button. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code. */
+ color?: string;
+ /** @description An optional indicator of the screen format preferred by the application to be used for this block, such as OUTLINED, FILLED, or TEXT. Different frontends may support different formats, and implement them differently. */
+ format?: string;
+ };
+ /** @description Values used for a BUTTON type widget block */
+ WidgetBlockButtonValues: {
+ /** @description Code used within the app as the value submitted when the button is clicked */
+ actionCode?: string;
+ /**
+ * @description Instructions for what should happen in the frontend (e.g., within a screen), when the button is clicked.
+ *
+ * To show a modal composite block, use format: `showModal:${blockId}` (e.g., `showModal:myBlock`)
+ *
+ * To hide a modal composite block, use format: `hideModal:${blockId}` (e.g., `hideModal:myBlock`)
+ *
+ * To toggle visibility of a modal composite block, use format: `toggleModal:${blockId}` (e.g., `toggleModal:myBlock`)
+ */
+ controlCode?: string;
+ /** @description An optional icon to display after the text in the button */
+ endIcon?: components["schemas"]["Icon"];
+ /** @description User-facing label to display in the button */
+ label?: string;
+ /** @description An optional icon to display before the text in the button */
+ startIcon?: components["schemas"]["Icon"];
+ };
+ WidgetBlockImageStyles: {
+ /** @description A request to render the image at a specified height. */
+ height?: string;
+ /** @description Optional padding to apply to the image */
+ padding?: {
+ bottom?: Record;
+ left?: Record;
+ right?: Record;
+ top?: Record;
+ };
+ /** @description A request to render the image at a specified width. */
+ width?: string;
+ };
+ /** @description Values used for an IMAGE type widget block */
+ WidgetBlockImageValues: {
+ /** @description The path to the image on the server */
+ path?: string;
+ };
+ /** @description Values used for an INPUT_FIELD type widget block */
+ WidgetBlockInputFieldValues: {
+ /** @description Indicate whether this field should auto-focus when it is rendered */
+ autoFocus?: boolean | null;
+ /** @description Metadata to define the field that this block controls */
+ fieldMetaData?: components["schemas"]["FieldMetaData"];
+ /** @description Indicate if the frontend uses a software/on-screen keyboard, if the application should try to hide it (e.g., upon auto-focus). */
+ hideSoftKeyboard?: boolean | null;
+ /** @description Optional placeholder text to display in the input box. */
+ placeholder?: string;
+ /** @description Indicate whether the form that this field is on should be submitted when Enter is pressed */
+ submitOnEnter?: boolean | null;
+ };
+ WidgetBlockStyles: Record;
+ WidgetBlockTextStyles: {
+ /** @description A Color to display the text in. May be specified as a StandardColor (one of: SUCCESS, WARNING, ERROR, INFO, MUTED) or an RGB code. */
+ color?: string;
+ /** @description An optional indicator of the screen format preferred by the application to be used for this block. Different frontends may support different formats, and implement them differently. */
+ format?: string;
+ /** @description An optional indicator of the size at which the text should be rendered. May be a named value (one oflargest, headline, title, body, smallest) or a numeric size - both are up to the frontend to interpret. */
+ size?: string;
+ /** @description An optional indicator of the weight at which the text should be rendered. May be a named value (one ofextralight, thin, medium, black, semibold, bold, extrabold) or a numeric, e.g., 100, 200, ..., 900 */
+ weight?: string;
+ };
+ /** @description Values used for a TEXT type widget block */
+ WidgetBlockTextValues: {
+ /** @description An optional icon to display after the text */
+ endIcon?: components["schemas"]["Icon"];
+ /** @description An optional icon to display before the text */
+ startIcon?: components["schemas"]["Icon"];
+ /** @description The text to display in the block */
+ text?: string;
+ };
+ WidgetBlockValues: Record;
+ /** @description The data of a widget: one of the per-type shapes, chosen by `type` (the widget type). Clients render by type and ignore unknown properties; an unknown type is rendered as the widget label with its footerHTML/label only. */
+ WidgetData: components["schemas"]["WidgetDataAlert"] | components["schemas"]["WidgetDataChart"] | components["schemas"]["WidgetDataLineChart"] | components["schemas"]["WidgetDataPieChart"] | components["schemas"]["WidgetDataChildRecordList"] | components["schemas"]["WidgetDataComposite"] | components["schemas"]["WidgetDataCronUI"] | components["schemas"]["WidgetDataDivider"] | components["schemas"]["WidgetDataDynamicForm"] | components["schemas"]["WidgetDataFieldValueList"] | components["schemas"]["WidgetDataFilterAndColumnsSetup"] | components["schemas"]["WidgetDataLocation"] | components["schemas"]["WidgetDataMultiStatistics"] | components["schemas"]["WidgetDataMultiTable"] | components["schemas"]["WidgetDataParent"] | components["schemas"]["WidgetDataProcess"] | components["schemas"]["WidgetDataQuickSightChart"] | components["schemas"]["WidgetDataRawHTML"] | components["schemas"]["WidgetDataRowBuilder"] | components["schemas"]["WidgetDataStatistics"] | components["schemas"]["WidgetDataStepper"] | components["schemas"]["WidgetDataTable"] | components["schemas"]["WidgetDataUSMap"] | components["schemas"]["WidgetDataGeneric"];
+ /** @description Data of alert widgets. */
+ WidgetDataAlert: {
+ /** @enum {string|null} */
+ alertType?: "ERROR" | "SUCCESS" | "WARNING" | null;
+ bulletList?: unknown[];
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ hideWidget?: boolean | null;
+ html?: string | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /** @description Plain text equivalent of html, preserving link text and line breaks. */
+ text?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "alert";
+ };
+ /** @description Data of chart, barChart, horizontalBarChart, and stackedBarChart widgets. */
+ WidgetDataChart: {
+ chartData?: {
+ datasets?: {
+ backgroundColor?: string;
+ /** @description Colors per data point. */
+ backgroundColors?: string[];
+ color?: string;
+ data?: (number | null)[];
+ label?: string;
+ /** @description Links per data point. */
+ urls?: string[];
+ }[];
+ /** @description Labels per data point. */
+ labels?: string[];
+ /** @description Labels of the lines. */
+ lineLabels?: string[];
+ /** @description Links per data point. */
+ urls?: string[];
+ };
+ chartSubheaderData?: {
+ isGoodVsPrevious?: boolean | null;
+ isUpVsPrevious?: boolean | null;
+ mainNumber?: number;
+ mainNumberUrl?: string;
+ previousNumberUrl?: string;
+ vsDescription?: string;
+ vsPreviousNumber?: number;
+ vsPreviousPercent?: number;
+ };
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ description?: string | null;
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ height?: number;
+ isCurrency?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "barChart" | "chart" | "horizontalBarChart" | "stackedBarChart";
+ };
+ /** @description Data of childRecordList widgets. */
+ WidgetDataChildRecordList: {
+ allowRecordDelete?: boolean | null;
+ allowRecordEdit?: boolean | null;
+ canAddChildRecord?: boolean;
+ childFrontendTableMetaData?: components["schemas"]["TableMetaData"];
+ childTableMetaData?: components["schemas"]["TableMetaData"];
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ defaultValuesForNewChildRecords?: Record;
+ defaultValuesForNewChildRecordsFromParentFields?: Record;
+ disableRowClick?: boolean | null;
+ /** @description Fields disabled when adding a child record. */
+ disabledFieldsForNewChildRecords?: string[];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ includeExposedJoinTables?: unknown[];
+ isInProcess?: boolean | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ omitFieldNames?: unknown[];
+ onlyIncludeFieldNames?: unknown[];
+ queryOutput?: {
+ records?: components["schemas"]["OutputRecord"][];
+ };
+ /** @description Secondary title. */
+ sublabel?: string;
+ tableName?: string | null;
+ tablePath?: string | null;
+ title?: string | null;
+ totalRows?: number | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "childRecordList";
+ viewAllLink?: string | null;
+ };
+ /** @description Data of composite widgets. */
+ WidgetDataComposite: {
+ blockId?: string | null;
+ blocks?: unknown[];
+ conditional?: string | null;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @enum {string|null} */
+ layout?: "FLEX_COLUMN" | "FLEX_ROW" | "FLEX_ROW_WRAPPED" | "FLEX_ROW_SPACE_BETWEEN" | "FLEX_ROW_CENTER" | "TABLE_SUB_ROW_DETAILS" | "BADGES_WRAPPER" | null;
+ link?: {
+ href?: string;
+ };
+ linkMap?: Record;
+ /** @enum {string|null} */
+ modalMode?: "MODAL" | null;
+ overlayHtml?: string | null;
+ overlayStyleOverrides?: Record;
+ /** @description Plain text equivalent of overlayHtml, preserving link text and line breaks. */
+ overlayText?: string;
+ styleOverrides?: Record;
+ styles?: {
+ backgroundColor?: string | null;
+ padding?: {
+ bottom?: string | null;
+ left?: string | null;
+ right?: string | null;
+ top?: string | null;
+ };
+ };
+ /** @description Secondary title. */
+ sublabel?: string;
+ tooltip?: {
+ blockData?: {
+ blocks?: unknown[];
+ /** @enum {string} */
+ layout?: "FLEX_COLUMN" | "FLEX_ROW" | "FLEX_ROW_WRAPPED" | "FLEX_ROW_SPACE_BETWEEN" | "FLEX_ROW_CENTER" | "TABLE_SUB_ROW_DETAILS" | "BADGES_WRAPPER";
+ /** @enum {string} */
+ modalMode?: "MODAL";
+ overlayHtml?: string;
+ overlayStyleOverrides?: Record;
+ styleOverrides?: Record;
+ };
+ /** @enum {string} */
+ placement?: "BOTTOM" | "LEFT" | "RIGHT" | "TOP";
+ title?: string;
+ };
+ tooltipMap?: Record;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "composite";
+ /** @description Composite BaseValues has no predefined members. */
+ values?: Record;
+ };
+ /** @description Data of cronUI widgets. */
+ WidgetDataCronUI: {
+ cronDescription?: string | null;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ error?: string | null;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "cronUI";
+ };
+ /** @description Data of divider widgets. */
+ WidgetDataDivider: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "divider";
+ };
+ /** @description Data of dynamicForm widgets. */
+ WidgetDataDynamicForm: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ fieldList?: unknown[];
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ mergedDynamicFormValuesIntoFieldName?: string | null;
+ noFieldsMessage?: string | null;
+ recordOfFieldValues?: components["schemas"]["OutputRecord"];
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "dynamicForm";
+ };
+ /** @description Data of fieldValueList widgets. */
+ WidgetDataFieldValueList: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ fieldIndentLevels?: Record;
+ fieldLabelPrefixIconColors?: Record;
+ fieldLabelPrefixIconNames?: Record;
+ fields?: unknown[];
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ record?: components["schemas"]["OutputRecord"];
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "fieldValueList";
+ };
+ /** @description Data of filterAndColumnsSetup widgets. */
+ WidgetDataFilterAndColumnsSetup: {
+ allowVariables?: boolean | null;
+ apiName?: string | null;
+ apiPath?: string | null;
+ apiVersion?: string | null;
+ columnFieldName?: string | null;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ editButtonLabel?: string | null;
+ filterDefaultFieldNameSourceFieldNames?: Record;
+ filterDefaultFieldNames?: unknown[];
+ filterFieldName?: string | null;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ hideColumns?: boolean | null;
+ hidePreview?: boolean | null;
+ hideSortBy?: boolean | null;
+ isApiVersioned?: boolean | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ modalHeader?: string | null;
+ omitExposedJoins?: unknown[];
+ overrideIsEditable?: boolean | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ tableName?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "filterAndColumnsSetup";
+ };
+ /** @description Data of widget types without a fixed shape (generic, customComponent, dataBagViewer, pivotTableSetup, and scriptViewer): the common properties plus widget-specific ones. */
+ WidgetDataGeneric: {
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Plain-text footer, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "customComponent" | "dataBagViewer" | "generic" | "pivotTableSetup" | "scriptViewer";
+ } & {
+ [key: string]: unknown;
+ };
+ /** @description Data of lineChart and smallLineChart widgets. */
+ WidgetDataLineChart: {
+ chartData?: {
+ datasets?: {
+ backgroundColor?: string;
+ /** @description Colors per data point. */
+ backgroundColors?: string[];
+ color?: string;
+ data?: (number | null)[];
+ label?: string;
+ /** @description Links per data point. */
+ urls?: string[];
+ }[];
+ /** @description Labels per data point. */
+ labels?: string[];
+ /** @description Labels of the lines. */
+ lineLabels?: string[];
+ /** @description Links per data point. */
+ urls?: string[];
+ };
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ isYAxisCurrency?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "lineChart" | "smallLineChart";
+ };
+ /** @description Data of location widgets. */
+ WidgetDataLocation: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ description?: string | null;
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ imageUrl?: string | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ location?: string | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "location";
+ };
+ /** @description Data of multiStatistics widgets. */
+ WidgetDataMultiStatistics: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ statisticsGroupData?: unknown[];
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "multiStatistics";
+ };
+ /** @description Data of multiTable widgets. */
+ WidgetDataMultiTable: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ tableDataList?: unknown[];
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "multiTable";
+ };
+ /** @description Data of parentWidget widgets. */
+ WidgetDataParent: {
+ childWidgetNameList?: unknown[];
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ isLabelPageTitle?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @enum {string|null} */
+ layoutType?: "GRID" | "TABS" | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "parentWidget";
+ };
+ /** @description Data of pieChart widgets. */
+ WidgetDataPieChart: {
+ chartData?: {
+ datasets?: {
+ backgroundColor?: string;
+ /** @description Colors per data point. */
+ backgroundColors?: string[];
+ color?: string;
+ data?: (number | null)[];
+ label?: string;
+ /** @description Links per data point. */
+ urls?: string[];
+ }[];
+ /** @description Labels per data point. */
+ labels?: string[];
+ /** @description Labels of the lines. */
+ lineLabels?: string[];
+ /** @description Links per data point. */
+ urls?: string[];
+ };
+ chartSubheaderData?: {
+ isGoodVsPrevious?: boolean | null;
+ isUpVsPrevious?: boolean | null;
+ mainNumber?: number;
+ mainNumberUrl?: string;
+ previousNumberUrl?: string;
+ vsDescription?: string;
+ vsPreviousNumber?: number;
+ vsPreviousPercent?: number;
+ };
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ description?: string | null;
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ height?: number;
+ isCurrency?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "pieChart";
+ };
+ /** @description Data of process widgets. */
+ WidgetDataProcess: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ defaultValues?: Record;
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ processMetaData?: components["schemas"]["ProcessMetaData"];
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "process";
+ };
+ /** @description Data of quickSightChart widgets. */
+ WidgetDataQuickSightChart: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ name?: string | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "quickSightChart";
+ url?: string | null;
+ };
+ /** @description Data of html widgets. */
+ WidgetDataRawHTML: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ html?: string | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /** @description Plain text equivalent of html, preserving link text and line breaks. */
+ text?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "html";
+ };
+ /** @description Data of rowBuilder widgets. */
+ WidgetDataRowBuilder: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ defaultValuesForNewRecords?: Record;
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ hiddenValues?: Record;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ records?: unknown[];
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "rowBuilder";
+ };
+ /** @description Data of statistics widgets. */
+ WidgetDataStatistics: {
+ /** @description Numeric statistic displayed by this widget. */
+ count?: number | null;
+ countContext?: string | null;
+ countFontSize?: string | null;
+ countURL?: string | null;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ increaseIsGood?: boolean;
+ isCurrency?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ percentageAmount?: number | null;
+ percentageLabel?: string | null;
+ percentageURL?: string | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "statistics";
+ };
+ /** @description Data of stepper widgets. */
+ WidgetDataStepper: {
+ activeStep?: number;
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ steps?: unknown[];
+ /** @description Secondary title. */
+ sublabel?: string;
+ title?: string | null;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "stepper";
+ };
+ /** @description Data of table widgets. */
+ WidgetDataTable: {
+ columns?: unknown[];
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ fixedHeight?: number | null;
+ fixedStickyLastRow?: boolean | null;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ hidePaginationDropdown?: boolean | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ linkText?: string | null;
+ linkURL?: string | null;
+ noRowsFoundHTML?: string | null;
+ rows?: unknown[];
+ rowsPerPage?: number | null;
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "table";
+ };
+ /** @description Data of usaMap widgets. */
+ WidgetDataUSMap: {
+ /** @description Rows (each a list of cells) for exporting the widget as CSV. */
+ csvData?: unknown[][];
+ /** @description Options of each dropdown filter: a list per dropdown of {id, label} objects. */
+ dropdownDataList?: {
+ [key: string]: string;
+ }[][];
+ /** @description Default value of each dropdown filter. */
+ dropdownDefaultValueList?: string[];
+ /** @description Labels of the dropdown filters. */
+ dropdownLabelList?: string[];
+ /** @description Names of the dropdown filters the widget offers (parallel to the other dropdown lists). */
+ dropdownNameList?: string[];
+ /** @description Message to show until every dropdown has a value. */
+ dropdownNeedsSelectedText?: string;
+ /** @description Footer, as HTML. Non-web clients render it as plain text. */
+ footerHTML?: string;
+ /** @description Plain text equivalent of footerHTML, preserving link text and line breaks. */
+ footerText?: string;
+ /** @description False when the user may not see this widget's data; show the label and a permission message only. */
+ hasPermission?: boolean;
+ height?: string | null;
+ /** @description Title of the widget (overrides the metadata label when present). */
+ label?: string;
+ mapMarkerList?: unknown[];
+ /** @description Secondary title. */
+ sublabel?: string;
+ /**
+ * @description The widget type this data is for. (enum property replaced by openapi-typescript)
+ * @enum {string}
+ */
+ type: "usaMap";
+ };
+ WidgetResponseV1: {
+ /** @description Widget data object, whose shape varies by widget type. */
+ widgetData?: Record;
+ };
+ /** @description What the provider supports for this destination - show only the actions that are true. */
+ EsbCapabilities: {
+ /** @description Messages can be browsed. */
+ browse?: boolean;
+ /** @description The queue can be paused and resumed. */
+ pauseQueue?: boolean;
+ /** @description All messages can be deleted. */
+ purge?: boolean;
+ /** @description Selected messages can be deleted. */
+ deleteSelected?: boolean;
+ /** @description Messages older than a time can be deleted. */
+ deleteOlderThan?: boolean;
+ /** @description Messages can be moved to another destination. */
+ move?: boolean;
+ };
+ /** @description Activity counters since the server started. */
+ EsbCounter: {
+ /** @description Messages published. */
+ published?: number;
+ /** @description Publish attempts that failed. */
+ publishFailures?: number;
+ /** @description Messages consumed. */
+ consumed?: number;
+ /** @description Consumed messages processed successfully. */
+ succeeded?: number;
+ /** @description Consumed messages that failed. */
+ failed?: number;
+ /** @description Redeliveries. */
+ retried?: number;
+ /** @description Messages moved to the dead-letter destination. */
+ deadLettered?: number;
+ /** @description Messages being processed now. */
+ inFlight?: number;
+ /**
+ * Format: date-time
+ * @description Time of the last activity (ISO-8601), or null.
+ */
+ lastActivity?: string | null;
+ /** @description Average processing time in milliseconds. */
+ avgMs?: number;
+ /** @description Longest processing time in milliseconds. */
+ maxMs?: number;
+ /** @description The last error message, or null. */
+ lastError?: string | null;
+ };
+ /** @description A dead-letter (or subscription) destination of a trigger. */
+ EsbDeadLetter: {
+ /** @description Name on the broker. */
+ brokerName?: string;
+ /** @description Messages waiting, or null when unknown. */
+ messageCount?: number | null;
+ /** @description Whether it is paused, or null when unknown. */
+ paused?: boolean | null;
+ };
+ /** @description A queue or topic. */
+ EsbDestination: {
+ /** @description Destination name. */
+ name?: string;
+ /**
+ * @description Destination type.
+ * @enum {string}
+ */
+ type?: "QUEUE" | "TOPIC";
+ /** @description Name of the provider (broker connection). */
+ provider?: string;
+ /** @description Name of the destination on the broker. */
+ brokerName?: string;
+ counters?: components["schemas"]["EsbCounter"];
+ queueInfo?: components["schemas"]["EsbQueueInfo"];
+ capabilities?: components["schemas"]["EsbCapabilities"];
+ };
+ /** @description A message on a destination. */
+ EsbMessage: {
+ /** @description Broker message id. */
+ messageId?: string;
+ /**
+ * Format: date-time
+ * @description When it was sent (ISO-8601).
+ */
+ timestamp?: string;
+ /** @description Delivery attempts so far. */
+ deliveryCount?: number;
+ /** @description The CloudEvents envelope (specversion, id, source, type, time, subject, datacontenttype, data, qqqcausationid), or null when the body is not one. */
+ event?: {
+ [key: string]: unknown;
+ } | null;
+ /** @description The message body as text. */
+ rawBody?: string;
+ /** @description Message properties. */
+ properties?: {
+ [key: string]: unknown;
+ };
+ };
+ /** @description A page of messages. */
+ EsbMessagePageResponseV1: {
+ /** @description The messages, oldest first. */
+ messages?: components["schemas"]["EsbMessage"][];
+ /** @description Whether more messages follow this page. */
+ hasMore?: boolean;
+ };
+ /** @description A destination with its publishers and triggers. */
+ EsbOverviewDestination: components["schemas"]["EsbDestination"] & {
+ /** @description Tables and processes publishing to it. */
+ publishers?: components["schemas"]["EsbPublisher"][];
+ /** @description Triggers consuming it. */
+ triggers?: components["schemas"]["EsbTrigger"][];
+ };
+ /** @description GET /esb/overview: providers and every destination. */
+ EsbOverviewResponseV1: {
+ /** @description Broker connections. */
+ providers?: components["schemas"]["EsbProvider"][];
+ /** @description Destinations with their publishers and triggers. */
+ destinations?: components["schemas"]["EsbOverviewDestination"][];
+ permissions?: components["schemas"]["EsbPermissions"];
+ };
+ /** @description What the user may do. */
+ EsbPermissions: {
+ /** @description May pause, resume and retry. */
+ canOperate?: boolean;
+ /** @description May delete messages. */
+ canDelete?: boolean;
+ };
+ /** @description GET /esb/process/{process}: what a process publishes, and the triggers that run it. */
+ EsbProcessResponseV1: {
+ /** @description Process name. */
+ process?: string;
+ /** @description Destinations the process publishes to. */
+ publications?: components["schemas"]["EsbPublication"][];
+ /** @description Triggers that run the process. */
+ triggers?: components["schemas"]["EsbTrigger"][];
+ permissions?: components["schemas"]["EsbPermissions"];
+ };
+ /** @description A broker connection. */
+ EsbProvider: {
+ /** @description Provider name. */
+ name?: string;
+ /**
+ * @description Broker type.
+ * @enum {string}
+ */
+ type?: "ACTIVEMQ_ARTEMIS" | "RABBITMQ";
+ /** @description Whether the connection is up. */
+ connected?: boolean;
+ /** @description Whether broker management (browse, pause, purge) is available. */
+ managementEnabled?: boolean;
+ };
+ /** @description A destination that a table or process publishes events to. */
+ EsbPublication: {
+ destination?: components["schemas"]["EsbDestination"];
+ /** @description Events published: INSERT, UPDATE or DELETE for tables; STARTED, COMPLETED or FAILED for processes. */
+ events?: string[];
+ };
+ /** @description A table or process that publishes to a destination. */
+ EsbPublisher: {
+ /**
+ * @description What publishes.
+ * @enum {string}
+ */
+ kind?: "TABLE" | "PROCESS";
+ /** @description Table or process name. */
+ name?: string;
+ /** @description Events published. */
+ events?: string[];
+ };
+ /** @description Broker-reported state of a queue. */
+ EsbQueueInfo: {
+ /** @description Messages waiting. */
+ messageCount?: number;
+ /** @description Connected consumers. */
+ consumerCount?: number;
+ /** @description Whether the queue is paused. */
+ paused?: boolean;
+ };
+ /** @description GET /esb/table/{table}: what a table publishes, and who subscribes. */
+ EsbTableResponseV1: {
+ /** @description Table name. */
+ table?: string;
+ /** @description Destinations the table publishes to. */
+ publications?: components["schemas"]["EsbPublication"][];
+ /** @description Triggers subscribed to those destinations (on processes the user can access). */
+ subscribers?: components["schemas"]["EsbTrigger"][];
+ permissions?: components["schemas"]["EsbPermissions"];
+ };
+ /** @description A process subscribed to a destination. */
+ EsbTrigger: {
+ /** @description Trigger name. */
+ name?: string;
+ /** @description Process the trigger runs. */
+ processName?: string;
+ /** @description User-facing label of the process. */
+ processLabel?: string;
+ destination?: components["schemas"]["EsbDestination"];
+ /**
+ * @description SINGLE runs the process per message; BATCH per batch of messages.
+ * @enum {string}
+ */
+ mode?: "SINGLE" | "BATCH";
+ /** @description Consumers run in parallel. */
+ concurrency?: number;
+ /** @description Attempts before a message is dead-lettered. */
+ maxAttempts?: number;
+ /**
+ * @description Current state of the trigger.
+ * @enum {string}
+ */
+ state?: "RUNNING" | "PAUSED" | "CONNECTING" | "STOPPED";
+ counters?: components["schemas"]["EsbCounter"];
+ deadLetter?: components["schemas"]["EsbDeadLetter"];
+ subscription?: components["schemas"]["EsbDeadLetter"];
+ };
+ HealthCheckV1: {
+ name?: string | null;
+ label?: string | null;
+ kind?: string | null;
+ severity?: string | null;
+ currentStatus?: string | null;
+ currentMessage?: string | null;
+ currentSince?: string | null;
+ lastRunAt?: string | null;
+ lastLatencyMs?: number | null;
+ };
+ HealthComponentV1: {
+ name?: string | null;
+ label?: string | null;
+ status?: string | null;
+ since?: string | null;
+ checksUp?: number | null;
+ checksDegraded?: number | null;
+ checksDown?: number | null;
+ checksUnknown?: number | null;
+ worstCheckId?: number | null;
+ updatedAt?: string | null;
+ checks?: components["schemas"]["HealthCheckV1"][];
+ };
+ HealthCountsV1: {
+ up?: number | null;
+ degraded?: number | null;
+ down?: number | null;
+ unknown?: number | null;
+ };
+ HealthDetailsV1: {
+ values?: {
+ [key: string]: unknown;
+ };
+ };
+ HealthHistoryV1: {
+ results?: components["schemas"]["HealthResultV1"][];
+ };
+ HealthMetricV1: {
+ name?: string | null;
+ value?: number;
+ unit?: string | null;
+ };
+ HealthResultV1: {
+ id?: number | null;
+ status?: string | null;
+ message?: string | null;
+ detailsJson?: string | null;
+ metricsJson?: string | null;
+ latencyMs?: number | null;
+ startedAt?: string | null;
+ finishedAt?: string | null;
+ runnerPod?: string | null;
+ isTransition?: boolean;
+ triggeredBy?: string | null;
+ };
+ HealthRunV1: {
+ status?: string | null;
+ message?: string | null;
+ details?: components["schemas"]["HealthDetailsV1"];
+ latencyMs?: number | null;
+ metrics?: components["schemas"]["HealthMetricV1"][];
+ };
+ HealthRunnerV1: {
+ lastBeatAt?: string | null;
+ pods?: (string | null)[];
+ };
+ HealthSummaryV1: {
+ status?: string | null;
+ since?: string | null;
+ counts?: components["schemas"]["HealthCountsV1"];
+ components?: components["schemas"]["HealthComponentV1"][];
+ runner?: components["schemas"]["HealthRunnerV1"];
+ };
+ /** @description An available action: operationId targets an inbox operation with this item id; process actions provide a complete href. */
+ AlertsActionV1: {
+ href?: string;
+ label?: string;
+ name?: string;
+ operationId?: string;
+ processName?: string;
+ };
+ /** @description Deprecated since 1.2.0: errors use BasicErrorResponseV1. */
+ AlertsErrorV1: {
+ error?: string | null;
+ };
+ /** @description Capability discovery only. Next obtains the follow URL from its collaboration module. */
+ AlertsFollowV1: {
+ /** @description True exactly when the collaboration UI API extension is registered. */
+ available?: boolean;
+ };
+ /** @description A notification recipient. body is included only in page items and banners; alertId only for ALERT notifications. */
+ AlertsInboxItemV1: {
+ actions?: components["schemas"]["AlertsActionV1"][];
+ age?: string;
+ alertId?: number | null;
+ body?: string | null;
+ category?: string | null;
+ deliveredAt?: string | null;
+ /** @description Existing safe link, or null. */
+ href?: string | null;
+ id?: number;
+ linkLabel?: string | null;
+ notificationId?: number;
+ severity?: string | null;
+ source?: string | null;
+ sticky?: boolean;
+ title?: string | null;
+ unread?: boolean;
+ };
+ /** @description Filtered notification page. */
+ AlertsInboxPageV1: {
+ items?: components["schemas"]["AlertsInboxItemV1"][];
+ limit?: number;
+ offset?: number;
+ total?: number;
+ };
+ /** @description Bell summary, latest ten items and up to three sticky banners. */
+ AlertsInboxSummaryV1: {
+ alertsHref?: string;
+ banners?: components["schemas"]["AlertsInboxItemV1"][];
+ highestUnreadSeverity?: string | null;
+ /** @description Canonical inbox navigation link. */
+ inboxHref?: string;
+ items?: components["schemas"]["AlertsInboxItemV1"][];
+ /** @description Existing notifications page link; retained for compatibility. */
+ notificationsHref?: string;
+ pollSeconds?: number;
+ /** @description Name of the user Preferences section for notification settings (/qqq/v1/preferences/{name}), or null when not registered. */
+ preferencesSection?: string | null;
+ unreadCount?: number;
+ };
+ /** @description Select id, nonempty ids (first 500), legacy alertId, or all:true in that precedence. All scans are capped at 1000 rows. */
+ AlertsInboxTargetV1: {
+ alertId?: number;
+ all?: boolean;
+ id?: number;
+ ids?: number[];
+ };
+ /** @description Number of the caller own recipient rows changed. */
+ AlertsMutationResultV1: {
+ updated?: number;
+ };
+ /** @description A visible open alert with permission-aware process actions. */
+ AlertsPanelAlertV1: {
+ actions?: components["schemas"]["AlertsActionV1"][];
+ age?: string;
+ alertId?: number;
+ group?: string | null;
+ href?: string;
+ raisedAt?: string | null;
+ severity?: string | null;
+ status?: string | null;
+ title?: string | null;
+ };
+ /** @description Open alerts, recent resolutions and collaboration capability. watching is deprecated legacy subscription state. */
+ AlertsRecordPanelV1: {
+ canManage?: boolean;
+ follow?: components["schemas"]["AlertsFollowV1"];
+ open?: components["schemas"]["AlertsPanelAlertV1"][];
+ openCount?: number;
+ resolvedLast30Days?: number;
+ viewAllHref?: string | null;
+ visible?: boolean;
+ /** @description Deprecated: existing RECORD subscriptions only; does not represent collaboration follow state. */
+ watching?: boolean;
+ };
+ /** @description Select id or nonempty ids (first 500), in that precedence. Legacy alertId is also accepted for compatibility. all is not supported. */
+ AlertsUnreadTargetV1: {
+ alertId?: number;
+ id?: number;
+ ids?: number[];
+ };
+ /** @description Explain access: per table, the user's UI permissions, the assistant's data access, and each tool's verdict. */
+ AssistantAccessResponseV1: {
+ tables?: {
+ [key: string]: unknown;
+ }[];
+ };
+ /** @description A write the assistant proposed and its state. */
+ AssistantActionV1: {
+ id?: number;
+ /** @description PENDING, RUNNING, EXECUTED, FAILED, REJECTED or EXPIRED. */
+ status?: string;
+ toolName?: string;
+ tableName?: string;
+ recordId?: string | null;
+ summary?: string;
+ /** @description The UI API status of the write. */
+ httpStatus?: number | null;
+ resultSummary?: string | null;
+ expiresAt?: string | null;
+ /** @description After a confirm: the tool outcome. */
+ outcome?: string | null;
+ /** @description After a confirm: what happened. */
+ message?: string | null;
+ /** @description After a confirm: the written record's /app link. */
+ href?: string | null;
+ };
+ /** @description The caller's active runs, newest first; stale leases are reaped. */
+ AssistantActiveTurnsResponseV1: {
+ turns?: {
+ turnId?: number;
+ conversationId?: number;
+ assistantMessageId?: number;
+ userMessageId?: number;
+ /** @description RUNNING or CANCELLING. */
+ status?: string;
+ phase?: string;
+ /** @description ISO-8601. */
+ startedAt?: string;
+ /** @description ISO-8601. */
+ heartbeatAt?: string;
+ elapsedMs?: number;
+ /** @description Running on this replica. */
+ live?: boolean;
+ /** @description SUPERSEDE or CONCURRENT. */
+ concurrencyMode?: string;
+ }[];
+ };
+ /** @description Whether the assistant is available to this user, and how. */
+ AssistantConfigResponseV1: {
+ /** @description Whether the panel may be used. */
+ enabled?: boolean;
+ /** @description Why not: DISABLED, NO_PERMISSION, NOT_CONFIGURED or KILL_SWITCH. */
+ reason?: string | null;
+ /** @description Keyboard shortcut, e.g. mod+j. */
+ shortcut?: string;
+ /** @description The model that answers. */
+ model?: string;
+ /** @description maxTurnSeconds and maxToolCallsPerTurn. */
+ limits?: {
+ [key: string]: unknown;
+ };
+ /** @description writes: some table allows writes; pendingActions: writes wait for confirmation. */
+ features?: {
+ [key: string]: unknown;
+ };
+ profile?: components["schemas"]["AssistantProfileV1"];
+ };
+ /** @description A conversation and a page of its messages, oldest first. */
+ AssistantConversationDetailResponseV1: {
+ conversation?: components["schemas"]["AssistantConversationV1"];
+ messages?: components["schemas"]["AssistantMessageV1"][];
+ };
+ /** @description The user's conversations, newest first. */
+ AssistantConversationListResponseV1: {
+ conversations?: components["schemas"]["AssistantConversationV1"][];
+ };
+ /** @description One of the user's own conversations. */
+ AssistantConversationV1: {
+ id?: number;
+ title?: string | null;
+ /** @description ACTIVE or ARCHIVED. */
+ status?: string;
+ pinned?: boolean;
+ /** @description ISO-8601 instant. */
+ lastMessageAt?: string | null;
+ unreadCount?: number;
+ /** @description ISO-8601 instant. */
+ createDate?: string | null;
+ };
+ /** @description Deprecated since 1.3.0: errors use BasicErrorResponseV1. */
+ AssistantErrorV1: {
+ /** @description A message for the user. */
+ error?: string;
+ /** @description BUDGET, RATE_LIMIT, NOT_CONFIGURED, KILL_SWITCH, DISABLED, NO_PERMISSION... */
+ code?: string | null;
+ };
+ /** @description A message: the user's text or the assistant's reply as parts (text, tool, record_refs, navigate, notice). */
+ AssistantMessageV1: {
+ id?: number;
+ /** @description USER or ASSISTANT. */
+ role?: string;
+ status?: string;
+ turnId?: number | null;
+ createDate?: string | null;
+ parts?: {
+ [key: string]: unknown;
+ }[];
+ };
+ /** @description How the assistant presents itself (admin-configured; text only, it never changes access). */
+ AssistantProfileV1: {
+ /** @description The assistant's name. */
+ displayName?: string;
+ /** @description A Material icon name. */
+ icon?: string;
+ /** @description Shown on a new conversation. */
+ greeting?: string | null;
+ /** @description Suggested first questions. */
+ starterPrompts?: string[];
+ };
+ /** @description An acknowledgement. */
+ AssistantStatusResponseV1: {
+ status?: string;
+ };
+ /** @description One server-sent event of a turn (event: , id: , data: this object). Types: message.start, turn.phase, text.delta, tool.start, tool.result, ui.navigate, notice, usage, message.end, error, ping. */
+ AssistantTurnEventV1: {
+ /** @description Sequence number; resume with ?after=. */
+ seq?: number;
+ /** @description The event type (also the SSE event name). */
+ type?: string;
+ /** @description The event's fields, by type. message.start includes startedAt (ISO-8601). turn.phase includes phase (thinking, tool, writing), optional toolName and label. */
+ data?: {
+ [key: string]: unknown;
+ };
+ };
+ CollaborationAccessRequestCreateRequestV1: {
+ /** @description message. */
+ message?: string | null;
+ /** @description recordId. */
+ recordId?: string | null;
+ /** @description shareId. */
+ shareId?: number | null;
+ /** @description tableName. */
+ tableName?: string | null;
+ };
+ CollaborationAccessRequestListV1: {
+ /** @description items. */
+ items?: components["schemas"]["CollaborationAccessRequestV1"][] | null;
+ /** @description nextCursor. */
+ nextCursor?: string | null;
+ };
+ CollaborationAccessRequestV1: {
+ /**
+ * Format: date-time
+ * @description handledAt.
+ */
+ handledAt?: string | null;
+ /** @description Display name of the person who handled the request. */
+ handledByDisplayName?: string | null;
+ /** @description id. */
+ id?: number | null;
+ /** @description message. */
+ message?: string | null;
+ /** @description note. */
+ note?: string | null;
+ /** @description recordId. */
+ recordId?: string | null;
+ /** @description Requester display name. */
+ requesterDisplayName?: string | null;
+ /** @description requesterUserId. */
+ requesterUserId?: string | null;
+ /** @description status. */
+ status?: string | null;
+ /** @description tableName. */
+ tableName?: string | null;
+ };
+ CollaborationAssignmentRequestV1: {
+ /** @description assigneeUserId. */
+ assigneeUserId?: string | null;
+ /** @description ownerUserId. */
+ ownerUserId?: string | null;
+ };
+ CollaborationAssignmentV1: {
+ /** @description Assignee display name. */
+ assigneeDisplayName?: string | null;
+ /** @description assigneeUserId. */
+ assigneeUserId?: string | null;
+ /** @description id. */
+ id?: number | null;
+ /** @description Owner display name. */
+ ownerDisplayName?: string | null;
+ /** @description ownerUserId. */
+ ownerUserId?: string | null;
+ /** @description recordId. */
+ recordId?: string | null;
+ /** @description tableName. */
+ tableName?: string | null;
+ };
+ /** @description Attachments, newest first. */
+ CollaborationAttachmentListV1: {
+ /** @description Attachments, newest first. */
+ items?: components["schemas"]["CollaborationAttachmentV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description Change attachment display metadata. */
+ CollaborationAttachmentPatchRequestV1: {
+ /** @description Optional description; empty clears, null leaves unchanged. */
+ description?: string | null;
+ /** @description Optional new display filename; null leaves unchanged. */
+ fileName?: string | null;
+ };
+ /** @description Multipart upload with exactly one file part named file. */
+ CollaborationAttachmentUploadRequestV1: {
+ /** @description Optional description. */
+ description?: string | null;
+ /**
+ * Format: binary
+ * @description Required file content.
+ */
+ file?: string | null;
+ };
+ /** @description An attachment visible through its parent record; no storage coordinates are exposed. */
+ CollaborationAttachmentV1: {
+ /** @description Whether the caller may change or delete this attachment. */
+ canDelete?: boolean | null;
+ /** @description MIME content type. */
+ contentType?: string | null;
+ /**
+ * Format: date-time
+ * @description Upload time.
+ */
+ createDate?: string | null;
+ /** @description Uploader display name. */
+ createdByDisplayName?: string | null;
+ /** @description Uploader identity. */
+ createdByUserId?: string | null;
+ /** @description Optional description. */
+ description?: string | null;
+ /** @description Safe display filename. */
+ fileName?: string | null;
+ /** @description Attachment identifier. */
+ id?: number | null;
+ /** @description Canonical parent record key. */
+ recordId?: string | null;
+ /** @description SHA-256 content digest. */
+ sha256?: string | null;
+ /** @description Stored byte count. */
+ sizeBytes?: number | null;
+ /** @description Parent table metadata name. */
+ tableName?: string | null;
+ };
+ /** @description Replace the caller's comment body. */
+ CollaborationCommentEditRequestV1: {
+ /** @description Required replacement body, 1 to 20000 characters. */
+ body?: string | null;
+ };
+ /** @description Previous bodies in edit order. */
+ CollaborationCommentHistoryV1: {
+ /** @description Previous bodies in edit order. */
+ items?: components["schemas"]["CollaborationCommentRevisionV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description Root threads by latest activity, with replies. */
+ CollaborationCommentPageV1: {
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ /** @description Root threads by latest activity, with replies. */
+ threads?: components["schemas"]["CollaborationCommentV1"][] | null;
+ };
+ /** @description Post a root comment or one-level reply. */
+ CollaborationCommentPostRequestV1: {
+ /** @description Required body, 1 to 20000 characters; mentions use @[Name](user:id). */
+ body?: string | null;
+ /** @description Optional existing parent field name. */
+ fieldName?: string | null;
+ /** @description Optional comment to reply to. */
+ parentCommentId?: number | null;
+ };
+ /** @description A previous comment body. */
+ CollaborationCommentRevisionV1: {
+ /** @description Previous body text. */
+ body?: string | null;
+ /**
+ * Format: date-time
+ * @description Time the body was replaced.
+ */
+ editedAt?: string | null;
+ /** @description Editor display name. */
+ editedByDisplayName?: string | null;
+ /** @description Editor identity. */
+ editedByUserId?: string | null;
+ /** @description Revision identifier. */
+ id?: number | null;
+ };
+ /** @description A comment or reply; deleted comments retain their position without body text. */
+ CollaborationCommentV1: {
+ /** @description Author display name. */
+ authorDisplayName?: string | null;
+ /** @description Author identity. */
+ authorUserId?: string | null;
+ /** @description Plain text with mention tokens; null for deleted comments. */
+ body?: string | null;
+ /** @description Caller may delete this comment. */
+ canDelete?: boolean | null;
+ /** @description Caller may edit the body. */
+ canEdit?: boolean | null;
+ /**
+ * Format: date-time
+ * @description Creation time.
+ */
+ createdAt?: string | null;
+ /** @description Whether the comment is soft deleted. */
+ deleted?: boolean | null;
+ /**
+ * Format: date-time
+ * @description Last edit time, if edited.
+ */
+ editedAt?: string | null;
+ /** @description Optional field being discussed. */
+ fieldName?: string | null;
+ /** @description Comment identifier. */
+ id?: number | null;
+ /** @description Mention recipients. */
+ mentions?: components["schemas"]["CollaborationMentionV1"][] | null;
+ /** @description Root comment for a reply; null on roots. */
+ parentCommentId?: number | null;
+ /** @description Replies in oldest-first order; empty on replies. */
+ replies?: components["schemas"]["CollaborationCommentV1"][] | null;
+ /** @description Whether the thread is resolved. */
+ resolved?: boolean | null;
+ /** @description Root thread identifier; null on roots. */
+ threadId?: number | null;
+ };
+ /** @description Temporary access to file bytes. Clients follow url. */
+ CollaborationDownloadV1: {
+ /** @description Presigned URL, valid for five minutes. Clients follow url; never persist it. */
+ url?: string | null;
+ };
+ /** @description Deprecated since 1.1.0: errors use BasicErrorResponseV1. */
+ CollaborationErrorV1: {
+ /** @description Human-readable reason the operation failed. */
+ error?: string | null;
+ };
+ /** @description Ordered personal favorites. */
+ CollaborationFavoriteListV1: {
+ /** @description Ordered personal favorites. */
+ items?: components["schemas"]["CollaborationFavoriteV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description Move selected favorites first and optionally assign folders. */
+ CollaborationFavoriteOrderRequestV1: {
+ /** @description Optional map from favorite identifier to folder; null values clear folders. */
+ folders?: {
+ [key: string]: string | null;
+ } | null;
+ /** @description Required ordered favorite identifiers, with no duplicates. */
+ ids?: number[] | null;
+ };
+ /** @description A saved navigation target, with availability rechecked for the caller. */
+ CollaborationFavoriteV1: {
+ /** @description Whether the caller can currently open this target. */
+ available?: boolean | null;
+ /** @description Optional personal grouping. */
+ folder?: string | null;
+ /** @description Navigation link, absent for unavailable targets. */
+ href?: string | null;
+ /** @description Favorite identifier. */
+ id?: number | null;
+ /** @description Current display label; Unavailable when access is lost. */
+ label?: string | null;
+ /** @description Canonical record key; null for non-record targets. */
+ recordId?: string | null;
+ /** @description Position in the personal list. */
+ sortOrder?: number | null;
+ /** @description Metadata name of the table, app, process, report or saved view. */
+ targetName?: string | null;
+ /**
+ * @description Kind of navigation target.
+ * @enum {string|null}
+ */
+ targetType?: "TABLE" | "APP" | "RECORD" | "PROCESS" | "REPORT" | "SAVED_VIEW" | null;
+ };
+ /** @description Configure the caller's follow preferences. */
+ CollaborationFollowRequestV1: {
+ /** @description Optional change notifications preference; omission retains current setting. */
+ notifyOnChange?: boolean | null;
+ /** @description Optional comment notifications preference; omission retains current setting. */
+ notifyOnComment?: boolean | null;
+ };
+ /** @description The current caller's subscription state. */
+ CollaborationFollowStateV1: {
+ /** @description Subscription settings; null when not following. */
+ follow?: components["schemas"]["CollaborationFollowV1"];
+ /** @description Whether the caller follows the record. */
+ following?: boolean | null;
+ };
+ /** @description A subscription to record changes and comments. */
+ CollaborationFollowV1: {
+ /** @description Subscription identifier. */
+ id?: number | null;
+ /**
+ * Format: date-time
+ * @description Notifications muted until this time, if set.
+ */
+ mutedUntil?: string | null;
+ /** @description Receive record change digests. */
+ notifyOnChange?: boolean | null;
+ /** @description Receive new comment notifications. */
+ notifyOnComment?: boolean | null;
+ /**
+ * @description How following began.
+ * @enum {string|null}
+ */
+ reason?: "MANUAL" | "AUTHOR" | "COMMENTED" | "MENTIONED" | "ASSIGNED" | "SHARED" | null;
+ /** @description Follower display name. */
+ userDisplayName?: string | null;
+ /** @description Follower identity. */
+ userId?: string | null;
+ };
+ /** @description Subscriptions for this record. */
+ CollaborationFollowerListV1: {
+ /** @description Subscriptions for this record. */
+ items?: components["schemas"]["CollaborationFollowV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ CollaborationLinkV1: {
+ /** @description label. */
+ label?: string | null;
+ /** @description url. */
+ url?: string | null;
+ };
+ /** @description Candidates ranked with record participants first. */
+ CollaborationMentionCandidateListV1: {
+ /** @description Candidates ranked with record participants first. */
+ items?: components["schemas"]["CollaborationMentionCandidateV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description A matching person and their known parent access. */
+ CollaborationMentionCandidateV1: {
+ /**
+ * @description Recipient access: string true, false, or unknown when it cannot be established.
+ * @enum {string|null}
+ */
+ canRead?: "true" | "false" | "unknown" | null;
+ /** @description Directory identity. */
+ person?: components["schemas"]["CollaborationPersonV1"];
+ };
+ /** @description A mention embedded in a comment. */
+ CollaborationMentionV1: {
+ /** @description Mentioned user identity. */
+ userId?: string | null;
+ /** @description Whether recipient access was confirmed when mentioned. */
+ visible?: boolean | null;
+ };
+ /** @description Acknowledgement of a completed mutation. */
+ CollaborationMutationResultV1: {
+ /** @description True after the requested operation completes. */
+ success?: boolean | null;
+ };
+ CollaborationMyWorkV1: {
+ /** @description assignedRecordsByTable. */
+ assignedRecordsByTable?: {
+ [key: string]: number;
+ } | null;
+ /** @description openTaskCount. */
+ openTaskCount?: number | null;
+ /** @description tasks. */
+ tasks?: components["schemas"]["CollaborationTaskV1"][] | null;
+ /** @description unreadMentionCount. */
+ unreadMentionCount?: number | null;
+ };
+ /** @description Matching active directory entries. */
+ CollaborationPersonListV1: {
+ /** @description Matching active directory entries. */
+ items?: components["schemas"]["CollaborationPersonV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description An active directory entry. */
+ CollaborationPersonV1: {
+ /** @description Display name. */
+ displayName?: string | null;
+ /** @description Directory email, if known. */
+ email?: string | null;
+ /**
+ * Format: date-time
+ * @description Most recent directory refresh time.
+ */
+ lastSeenAt?: string | null;
+ /** @description Stable user identity. */
+ userId?: string | null;
+ };
+ /** @description Remove the caller's lease on this connection and target. */
+ CollaborationPresenceLeaveV1: {
+ /** @description Client connection identity. */
+ connectionId?: string;
+ /** @description Optional parent key. */
+ pk?: string | null;
+ /** @description Parent table name. */
+ table?: string;
+ };
+ /** @description Renew a 45-second presence lease; send every 20 seconds. */
+ CollaborationPresenceRequestV1: {
+ /** @description Client connection identity. */
+ connectionId?: string;
+ /** @description Optional focused field on a record. */
+ fieldName?: string | null;
+ /**
+ * @description VIEWING or EDITING.
+ * @enum {string}
+ */
+ mode?: "VIEWING" | "EDITING";
+ /** @description Optional parent key; omit for a table view. */
+ pk?: string | null;
+ /** @description Parent table name. */
+ table?: string;
+ };
+ /** @description Live viewers, merged across tabs; presence.changed uses this payload. */
+ CollaborationPresenceSnapshotV1: {
+ /** @description Record key; absent for table events. */
+ pk?: string | null;
+ /** @description Parent table name. */
+ table?: string;
+ viewers?: components["schemas"]["CollaborationPresenceViewerV1"][];
+ };
+ /** @description One user merged across live tabs; EDITING takes precedence. */
+ CollaborationPresenceViewerV1: {
+ /** @description Session display name. */
+ displayName?: string;
+ /** @description Focused field; null on table snapshots. */
+ fieldName?: string | null;
+ /**
+ * @description VIEWING or EDITING.
+ * @enum {string}
+ */
+ mode?: "VIEWING" | "EDITING";
+ /** @description Stable user identity. */
+ userId?: string;
+ };
+ /** @description Most recent visible targets, at most fifty. */
+ CollaborationRecentListV1: {
+ /** @description Most recent visible targets, at most fifty. */
+ items?: components["schemas"]["CollaborationFavoriteV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ CollaborationShareListV1: {
+ /** @description items. */
+ items?: components["schemas"]["CollaborationShareV1"][] | null;
+ };
+ CollaborationSharePreviewV1: {
+ /** @description recipients. */
+ recipients?: components["schemas"]["CollaborationShareRecipientV1"][] | null;
+ };
+ CollaborationShareRecipientV1: {
+ /** @description canRead. */
+ canRead?: boolean | null;
+ /** @description displayName. */
+ displayName?: string | null;
+ /** @description userId. */
+ userId?: string | null;
+ };
+ CollaborationShareRequestV1: {
+ /** @description message. */
+ message?: string | null;
+ /** @description toUserIds. */
+ toUserIds?: string[] | null;
+ };
+ CollaborationShareV1: {
+ /** @description Sender display name. */
+ fromDisplayName?: string | null;
+ /** @description fromUserId. */
+ fromUserId?: string | null;
+ /** @description id. */
+ id?: number | null;
+ /** @description message. */
+ message?: string | null;
+ /** @description recipientCouldRead. */
+ recipientCouldRead?: boolean | null;
+ /** @description recordId. */
+ recordId?: string | null;
+ /**
+ * Format: date-time
+ * @description sentAt.
+ */
+ sentAt?: string | null;
+ /** @description tableName. */
+ tableName?: string | null;
+ /** @description Recipient display name. */
+ toDisplayName?: string | null;
+ /** @description toUserId. */
+ toUserId?: string | null;
+ };
+ /** @description Add and remove tag associations in one request. */
+ CollaborationTagApplyRequestV1: {
+ /** @description Tag identifiers to add; omitted means none. */
+ add?: number[] | null;
+ /** @description Tag identifiers to remove; omitted means none. */
+ remove?: number[] | null;
+ };
+ /** @description Create a tag or suggest one under the table policy. */
+ CollaborationTagCreateRequestV1: {
+ /** @description Optional display color. */
+ color?: string | null;
+ /** @description Required display label, 1 to 60 characters. */
+ label?: string | null;
+ /** @description Required table metadata name. */
+ table?: string | null;
+ };
+ /** @description Available or applied tags. */
+ CollaborationTagListV1: {
+ /** @description Available or applied tags. */
+ items?: components["schemas"]["CollaborationTagV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ /** @description An approved tag or the caller's pending suggestion. */
+ CollaborationTagV1: {
+ /** @description Whether anyone may apply this tag. */
+ approved?: boolean | null;
+ /** @description Optional display color. */
+ color?: string | null;
+ /** @description Tag identifier. */
+ id?: number | null;
+ /** @description Display label. */
+ label?: string | null;
+ /** @description Normalized vocabulary name. */
+ name?: string | null;
+ /** @description Table scope; null means global. */
+ tableName?: string | null;
+ /** @description Number of record associations. */
+ usageCount?: number | null;
+ };
+ /** @description Target to star, unstar, or record as recently viewed. */
+ CollaborationTargetRequestV1: {
+ /** @description Required for RECORD; omitted otherwise. */
+ recordId?: string | null;
+ /** @description Required metadata name. */
+ targetName?: string | null;
+ /**
+ * @description Required target kind.
+ * @enum {string|null}
+ */
+ targetType?: "TABLE" | "APP" | "RECORD" | "PROCESS" | "REPORT" | "SAVED_VIEW" | null;
+ };
+ CollaborationTaskCreateRequestV1: {
+ /** @description assigneeUserId. */
+ assigneeUserId?: string | null;
+ /**
+ * Format: date-time
+ * @description dueAt.
+ */
+ dueAt?: string | null;
+ /** @description notes. */
+ notes?: string | null;
+ /**
+ * Format: date-time
+ * @description remindAt.
+ */
+ remindAt?: string | null;
+ /** @description title. */
+ title?: string | null;
+ };
+ CollaborationTaskListV1: {
+ /** @description items. */
+ items?: components["schemas"]["CollaborationTaskV1"][] | null;
+ /** @description nextCursor. */
+ nextCursor?: string | null;
+ };
+ CollaborationTaskPatchRequestV1: {
+ /** @description assigneeUserId. */
+ assigneeUserId?: string | null;
+ /**
+ * Format: date-time
+ * @description dueAt.
+ */
+ dueAt?: string | null;
+ /** @description notes. */
+ notes?: string | null;
+ /**
+ * Format: date-time
+ * @description remindAt.
+ */
+ remindAt?: string | null;
+ /** @description status. */
+ status?: string | null;
+ /** @description title. */
+ title?: string | null;
+ };
+ CollaborationTaskV1: {
+ /** @description Assignee display name. */
+ assigneeDisplayName?: string | null;
+ /** @description assigneeUserId. */
+ assigneeUserId?: string | null;
+ /**
+ * Format: date-time
+ * @description completedAt.
+ */
+ completedAt?: string | null;
+ /** @description Display name of the person who completed the task. */
+ completedByDisplayName?: string | null;
+ /** @description completedByUserId. */
+ completedByUserId?: string | null;
+ /** @description Creator display name. */
+ createdByDisplayName?: string | null;
+ /** @description createdByUserId. */
+ createdByUserId?: string | null;
+ /**
+ * Format: date-time
+ * @description dueAt.
+ */
+ dueAt?: string | null;
+ /** @description id. */
+ id?: number | null;
+ /** @description notes. */
+ notes?: string | null;
+ /** @description recordId. */
+ recordId?: string | null;
+ /**
+ * Format: date-time
+ * @description remindAt.
+ */
+ remindAt?: string | null;
+ /** @description status. */
+ status?: string | null;
+ /** @description tableName. */
+ tableName?: string | null;
+ /** @description title. */
+ title?: string | null;
+ };
+ /** @description A permitted field change from a core audit. */
+ CollaborationTimelineDetailV1: {
+ /** @description Changed field metadata name. */
+ fieldName?: string | null;
+ /** @description Optional audit message. */
+ message?: string | null;
+ /** @description New display value. */
+ newValue?: string | null;
+ /** @description Previous display value. */
+ oldValue?: string | null;
+ };
+ /** @description One visible event in the merged record timeline. */
+ CollaborationTimelineItemV1: {
+ /** @description Actor display name. */
+ actorName?: string | null;
+ /** @description Actor identity, when known. */
+ actorUserId?: string | null;
+ /**
+ * Format: date-time
+ * @description Event time.
+ */
+ at?: string | null;
+ /** @description Field details filtered by caller permissions. */
+ details?: components["schemas"]["CollaborationTimelineDetailV1"][] | null;
+ /** @description Identifier within the source. */
+ id?: number | null;
+ /**
+ * @description Event source.
+ * @enum {string|null}
+ */
+ kind?: "ACTIVITY" | "AUDIT" | null;
+ /** @description Related record key. */
+ refId?: string | null;
+ /** @description Related table metadata name. */
+ refTable?: string | null;
+ /** @description Human-readable event summary. */
+ summary?: string | null;
+ };
+ /** @description Merged events, newest first. */
+ CollaborationTimelinePageV1: {
+ /** @description Merged events, newest first. */
+ items?: components["schemas"]["CollaborationTimelineItemV1"][] | null;
+ /** @description Opaque continuation token; null when finished or the service has no continuation support. */
+ nextCursor?: string | null;
+ };
+ DataAnalysisAxisV1: {
+ /** @description Field. */
+ field?: string | null;
+ /** @description Label. */
+ label?: string | null;
+ /**
+ * @description Value type.
+ * @enum {string|null}
+ */
+ valueType?: "COUNT" | "DECIMAL" | "PERCENT" | "DATE" | "DATE_TIME" | "DURATION" | "TEXT" | null;
+ } | null;
+ DataAnalysisCandidateKeyV1: {
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields?: string[] | null;
+ /** @description Row count. */
+ rowCount?: number | null;
+ /** @description Open the matching records using this table and QueryFilter; null when suppressed. */
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ } | null;
+ DataAnalysisCapabilitiesV1: {
+ /** @description Whether this session may analyze the table; false responses expose no fields. */
+ canAnalyze?: boolean | null;
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Table label. */
+ tableLabel?: string | null;
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields?: components["schemas"]["DataAnalysisCapabilityFieldV1"][] | null;
+ /** @description Limits. */
+ limits?: components["schemas"]["DataAnalysisLimitsV1"];
+ /** @description Backend capabilities. */
+ backendCapabilities?: string[] | null;
+ /** @description Whether SQL Workbench metadata is installed in this instance. */
+ sqlWorkbenchAvailable?: boolean | null;
+ } | null;
+ DataAnalysisCapabilityFieldV1: {
+ /** @description Name. */
+ name?: string | null;
+ /** @description Label. */
+ label?: string | null;
+ /** @description Type. */
+ type?: string | null;
+ /** @description Semantic field kind: NUMERIC, DATE, DATE_TIME, TEXT, BOOLEAN or CATEGORY. */
+ kind?: string | null;
+ /**
+ * @description Default chart kind.
+ * @enum {string|null}
+ */
+ defaultChartKind?: "HISTOGRAM" | "BOX" | "BAR" | "PARETO" | "TIME_SERIES" | "SCATTER" | "HEATMAP" | null;
+ } | null;
+ DataAnalysisChartV1: {
+ /** @description Stack category series to a total share of one when true. */
+ stacked?: boolean | null;
+ /**
+ * @description Semantic field kind: NUMERIC, DATE, DATE_TIME, TEXT, BOOLEAN or CATEGORY.
+ * @enum {string|null}
+ */
+ kind?: "HISTOGRAM" | "BOX" | "BAR" | "PARETO" | "TIME_SERIES" | "SCATTER" | "HEATMAP" | null;
+ /** @description Alternatives. */
+ alternatives?: ("HISTOGRAM" | "BOX" | "BAR" | "PARETO" | "TIME_SERIES" | "SCATTER" | "HEATMAP")[] | null;
+ /** @description X. */
+ x?: components["schemas"]["DataAnalysisAxisV1"];
+ /** @description Y. */
+ y?: components["schemas"]["DataAnalysisAxisV1"];
+ /** @description Series. */
+ series?: components["schemas"]["DataAnalysisSeriesV1"][] | null;
+ /** @description Annotations. */
+ annotations?: string[] | null;
+ } | null;
+ DataAnalysisColumnProfileRequestV1: {
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Request exact computation instead of the configured estimate. */
+ exact?: boolean;
+ /** @description Readable field name to profile or enumerate. */
+ fieldName: string;
+ };
+ DataAnalysisColumnProfileV1: {
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description True when statistics describe a sample rather than the entire filtered population. */
+ estimate?: boolean | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ /** @description True when the row limit prevented a complete scan. */
+ truncated?: boolean | null;
+ /** @description Number of source rows included in computation. */
+ rowsScanned?: number | null;
+ /**
+ * Format: date-time
+ * @description As of.
+ */
+ asOf?: string | null;
+ /** @description Data version. */
+ dataVersion?: string | null;
+ /** @description Warnings. */
+ warnings?: string[] | null;
+ /** @description Readable field name to profile or enumerate. */
+ fieldName?: string | null;
+ /** @description Field label. */
+ fieldLabel?: string | null;
+ /** @description Field type. */
+ fieldType?: string | null;
+ /** @description Counts. */
+ counts?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ /** @description Numeric. */
+ numeric?: components["schemas"]["DataAnalysisNumericProfileV1"];
+ /** @description Dates. */
+ dates?: components["schemas"]["DataAnalysisDateProfileV1"];
+ /** @description Text. */
+ text?: components["schemas"]["DataAnalysisTextProfileV1"];
+ /** @description Booleans. */
+ booleans?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ /** @description Top values. */
+ topValues?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Chart. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ } | null;
+ DataAnalysisCompareRequestV1: {
+ /** @description Population A filter; null selects the whole permitted table. */
+ filterA?: components["schemas"]["QueryFilter"];
+ /** @description Population B filter; null selects the whole permitted table. */
+ filterB?: components["schemas"]["QueryFilter"];
+ /** @description Display name of population A; default A. */
+ labelA?: string;
+ /** @description Display name of population B; default B. */
+ labelB?: string;
+ /** @description Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields. */
+ fields: string[];
+ };
+ DataAnalysisCompareV1: {
+ /** @description Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields. */
+ fields?: components["schemas"]["DataAnalysisFieldComparisonV1"][] | null;
+ };
+ DataAnalysisComparisonSideV1: {
+ /** @description Label. */
+ label?: string | null;
+ /** @description Typed metrics with exact population drills unless privacy suppresses them. */
+ metrics?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ };
+ DataAnalysisComparisonValueV1: {
+ /** @description Value. */
+ value?: unknown;
+ /** @description Label. */
+ label?: string | null;
+ /** @description Side a. */
+ sideA?: components["schemas"]["DataAnalysisComparisonSideV1"];
+ /** @description Side b. */
+ sideB?: components["schemas"]["DataAnalysisComparisonSideV1"];
+ /** @description B minus A, in original units (share differences are fractions). */
+ delta?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description (B minus A) divided by absolute A, a fraction; null at a zero baseline. */
+ percentDelta?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion. */
+ significance?: components["schemas"]["DataAnalysisSignificanceV1"];
+ };
+ DataAnalysisCorrelationCellV1: {
+ /** @description FULL numeric field on the x axis. */
+ xField?: string | null;
+ /** @description FULL numeric field on the y axis. */
+ yField?: string | null;
+ /** @description Pairwise non-null population count; null when privacy suppresses it. */
+ n?: number | null;
+ /** @description Pearson correlation; null for insufficient data, zero variance or privacy suppression. */
+ r?: number | null;
+ /** @description POST the included parameters to the table scatter endpoint. */
+ scatter?: components["schemas"]["DataAnalysisScatterRequestV1"];
+ };
+ DataAnalysisCorrelationRequestV1: {
+ /** @description Current-user query filter; record locks and core field rules apply. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields. */
+ fields: string[];
+ };
+ DataAnalysisCorrelationV1: {
+ /** @description Distinct FULL fields to analyze; correlation requires 2 to 12 numeric fields. */
+ fields?: string[] | null;
+ /** @description Cells. */
+ cells?: components["schemas"]["DataAnalysisCorrelationCellV1"][] | null;
+ /** @description Semantic series; category comparisons are grouped and category time series are stacked. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ };
+ DataAnalysisCrosstabCellV1: {
+ /** @description Row index. */
+ rowIndex?: number | null;
+ /** @description Column index. */
+ columnIndex?: number | null;
+ /** @description Cell count with its exact drill, or a suppressed metric. */
+ count?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Cell count divided by row total; suppressed if it could disclose a hidden cell. */
+ rowShare?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Cell count divided by column total; suppressed if it could disclose a hidden cell. */
+ columnShare?: components["schemas"]["DataAnalysisMetricV1"];
+ };
+ DataAnalysisCrosstabRequestV1: {
+ /** @description Current-user query filter; record locks and core field rules apply. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description FULL field defining crosstab rows. */
+ rowField: string;
+ /** @description FULL field defining crosstab columns. */
+ columnField: string;
+ /** @description Maximum sample points (1 to 2000, default 2000) or kept crosstab categories per axis (1 to 20, default 20). */
+ limit?: number;
+ };
+ DataAnalysisCrosstabV1: {
+ /** @description Rows. */
+ rows?: components["schemas"]["DataAnalysisPivotHeaderV1"][] | null;
+ /** @description Columns. */
+ columns?: components["schemas"]["DataAnalysisPivotHeaderV1"][] | null;
+ /** @description Cells. */
+ cells?: components["schemas"]["DataAnalysisCrosstabCellV1"][] | null;
+ /** @description Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion. */
+ significance?: components["schemas"]["DataAnalysisSignificanceV1"];
+ };
+ DataAnalysisDateProfileV1: {
+ /** @description Metrics. */
+ metrics?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ /** @description Unit. */
+ unit?: string | null;
+ /** @description Buckets. */
+ buckets?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Gaps. */
+ gaps?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Day of week. */
+ dayOfWeek?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Hour of day. */
+ hourOfDay?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ } | null;
+ DataAnalysisDistinctValuesPageV1: {
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description True when statistics describe a sample rather than the entire filtered population. */
+ estimate?: boolean | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ /** @description True when the row limit prevented a complete scan. */
+ truncated?: boolean | null;
+ /** @description Number of source rows included in computation. */
+ rowsScanned?: number | null;
+ /**
+ * Format: date-time
+ * @description As of.
+ */
+ asOf?: string | null;
+ /** @description Data version. */
+ dataVersion?: string | null;
+ /** @description Warnings. */
+ warnings?: string[] | null;
+ /** @description Readable field name to profile or enumerate. */
+ fieldName?: string | null;
+ /** @description Zero-based page number. */
+ page?: number | null;
+ /** @description Maximum values per page, from 1 to 500. */
+ pageSize?: number | null;
+ /** @description Has more. */
+ hasMore?: boolean | null;
+ /** @description Total distinct. */
+ totalDistinct?: number | null;
+ /** @description Values. */
+ values?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ } | null;
+ DataAnalysisDistinctValuesRequestV1: {
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Readable field name to profile or enumerate. */
+ fieldName: string;
+ /** @description Zero-based page number. */
+ page?: number;
+ /** @description Maximum values per page, from 1 to 500. */
+ pageSize?: number;
+ /** @description Optional search text applied to stored values. */
+ search?: string;
+ };
+ DataAnalysisDrillV1: {
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ } | null;
+ DataAnalysisDuplicatesRequestV1: {
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields: string[];
+ /** @description Maximum duplicate groups to return, from 1 to 500; default 50. */
+ limit?: number;
+ };
+ DataAnalysisDuplicatesResultV1: {
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description True when statistics describe a sample rather than the entire filtered population. */
+ estimate?: boolean | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ /** @description True when the row limit prevented a complete scan. */
+ truncated?: boolean | null;
+ /** @description Number of source rows included in computation. */
+ rowsScanned?: number | null;
+ /**
+ * Format: date-time
+ * @description As of.
+ */
+ asOf?: string | null;
+ /** @description Data version. */
+ dataVersion?: string | null;
+ /** @description Warnings. */
+ warnings?: string[] | null;
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields?: string[] | null;
+ /** @description Groups. */
+ groups?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ } | null;
+ DataAnalysisFieldComparisonV1: {
+ /** @description FULL field whose distribution is compared over time. */
+ field?: string | null;
+ /** @description Values. */
+ values?: components["schemas"]["DataAnalysisComparisonValueV1"][] | null;
+ /** @description Test assumptions, two-sided p-value, degrees of freedom and plain-language conclusion. */
+ significance?: components["schemas"]["DataAnalysisSignificanceV1"];
+ /** @description Semantic series; category comparisons are grouped and category time series are stacked. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ };
+ DataAnalysisFieldSummaryV1: {
+ /** @description Field. */
+ field?: string | null;
+ /** @description Label. */
+ label?: string | null;
+ /** @description Type. */
+ type?: string | null;
+ /** @description Non-empty share as a 0..1 ratio rounded to six decimals. */
+ completeness?: number | null;
+ /** @description Distinct. */
+ distinct?: number | null;
+ /** @description Distinct share as a 0..1 ratio rounded to six decimals. */
+ uniqueness?: number | null;
+ /** @description Constant. */
+ constant?: boolean | null;
+ /** @description Empty. */
+ empty?: boolean | null;
+ /** @description Nulls. */
+ nulls?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Blanks. */
+ blanks?: components["schemas"]["DataAnalysisMetricV1"];
+ } | null;
+ /** Format: binary */
+ DataAnalysisFileV1: string;
+ DataAnalysisLimitsV1: {
+ /** @description Max rows. */
+ maxRows?: number | null;
+ /** @description Sample threshold rows. */
+ sampleThresholdRows?: number | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ /** @description Min group size. */
+ minGroupSize?: number | null;
+ } | null;
+ DataAnalysisMetricV1: {
+ /** @description Key. */
+ key?: string | null;
+ /** @description Plain-English metric label, ready to display. */
+ label?: string | null;
+ /** @description Raw numeric or temporal value. PERCENT is a 0..1 ratio rounded to six decimals; DECIMAL field statistics have ten significant digits. DATE_TIME is an ISO instant. */
+ value?: (string | number | boolean | (Record | null)) | null;
+ /**
+ * @description Value type.
+ * @enum {string|null}
+ */
+ valueType?: "COUNT" | "DECIMAL" | "PERCENT" | "DATE" | "DATE_TIME" | "DURATION" | "TEXT" | null;
+ /** @description Whether this metric is estimated; the population rows metric remains exact. */
+ estimate?: boolean;
+ /** @description Display-ready value, including grouping, field display formats, percent signs and session-zone dates; null when absent or suppressed. */
+ formatted?: string | null;
+ /** @description Open the matching records using this table and QueryFilter; null when suppressed. */
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ /** @description Suppressed. */
+ suppressed?: boolean | null;
+ /** @description Suppressed reason. */
+ suppressedReason?: string | null;
+ } | null;
+ DataAnalysisNumericProfileV1: {
+ /** @description Metrics. */
+ metrics?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ /** @description Histogram. */
+ histogram?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Outliers. */
+ outliers?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ } | null;
+ DataAnalysisPivotCellV1: {
+ /** @description Zero-based index in rowHeaders. */
+ rowIndex?: number;
+ /** @description Zero-based index in columnHeaders. */
+ columnIndex?: number;
+ /** @description Metrics in requested measure order; suppressed metrics have no value or drill. */
+ values?: components["schemas"]["DataAnalysisMetricV1"][];
+ };
+ DataAnalysisPivotDimensionV1: {
+ /** @description FULL field name, optionally joinTable.field through an exposed join. */
+ field: string;
+ /**
+ * @description Optional calendar or cyclic bucket in the session timezone.
+ * @enum {string}
+ */
+ dateBucket?: "YEAR" | "QUARTER" | "MONTH" | "WEEK" | "DAY" | "HOUR" | "DAY_OF_WEEK" | "HOUR_OF_DAY";
+ /** @description Optional equal-width numeric bins; mutually exclusive with dateBucket. */
+ numericBins?: components["schemas"]["DataAnalysisPivotNumericBinsV1"];
+ };
+ DataAnalysisPivotHeaderV1: {
+ /** @description Typed group key; null for a blank group or Other. */
+ value?: unknown;
+ /** @description Display label, including Other (k groups). */
+ label?: string;
+ };
+ DataAnalysisPivotMeasureInfoV1: {
+ /** @description Stable measure key by request position. */
+ key?: string;
+ /** @description Display label. */
+ label?: string;
+ /**
+ * @description Semantic metric type.
+ * @enum {string}
+ */
+ valueType?: "COUNT" | "DECIMAL" | "PERCENT" | "DATE" | "DATE_TIME" | "DURATION" | "TEXT";
+ };
+ DataAnalysisPivotMeasureV1: {
+ /**
+ * @description Aggregate operator. COUNT counts records, including null values.
+ * @enum {string}
+ */
+ operator: "COUNT" | "SUM" | "AVG" | "MIN" | "MAX" | "COUNT_DISTINCT" | "PERCENTILE";
+ /** @description FULL field to aggregate; optional for COUNT. */
+ field?: string;
+ /** @description PERCENTILE only: percentile_cont fraction from 0 to 1. */
+ percentile?: number;
+ };
+ DataAnalysisPivotNumericBinsV1: {
+ /** @description Number of bins, 1–200; defaults to 20. */
+ count?: number;
+ /** @description Optional explicit lower bound; otherwise a nice enclosing edge. */
+ min?: number;
+ /** @description Optional explicit upper bound; final interior bin includes this value. */
+ max?: number;
+ };
+ DataAnalysisPivotRequestV1: {
+ /** @description User query filter, passed through for core enforcement. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description One to three row dimensions. */
+ rows: components["schemas"]["DataAnalysisPivotDimensionV1"][];
+ /** @description Zero to two column dimensions; defaults to empty. */
+ columns?: components["schemas"]["DataAnalysisPivotDimensionV1"][];
+ /** @description One to six measures. */
+ values: components["schemas"]["DataAnalysisPivotMeasureV1"][];
+ /** @description Include row, column and grand totals; defaults to true. */
+ showTotals?: boolean;
+ /** @description Kept groups per dimension; default 50, maximum 200. */
+ limitGroups?: number;
+ };
+ DataAnalysisPivotV1: {
+ /** @description Row header tuples in cell-index order. */
+ rowHeaders?: components["schemas"]["DataAnalysisPivotHeaderV1"][][];
+ /** @description Column header tuples; an empty tuple represents no column dimensions. */
+ columnHeaders?: components["schemas"]["DataAnalysisPivotHeaderV1"][][];
+ /** @description Measure metadata in request order. */
+ measures?: components["schemas"]["DataAnalysisPivotMeasureInfoV1"][];
+ /** @description Sparse cells; absent combinations are not materialized. */
+ cells?: components["schemas"]["DataAnalysisPivotCellV1"][];
+ /** @description Metric tuples aligned with rowHeaders; empty when totals disabled. */
+ rowTotals?: components["schemas"]["DataAnalysisMetricV1"][][];
+ /** @description Metric tuples aligned with columnHeaders; empty when totals disabled. */
+ columnTotals?: components["schemas"]["DataAnalysisMetricV1"][][];
+ /** @description Grand-total metrics; empty when totals disabled. */
+ grandTotals?: components["schemas"]["DataAnalysisMetricV1"][];
+ /** @description Row groups were merged into Other. */
+ truncatedRows?: boolean;
+ /** @description Column groups were merged into Other. */
+ truncatedColumns?: boolean;
+ /** @description True when bounded streamed fallback produced a partial result. */
+ estimate?: boolean;
+ /** @description Privacy, partial-result and joined-drill limitations. */
+ warnings?: string[];
+ /** @description UTC timestamp of computation. */
+ asOf?: string;
+ };
+ DataAnalysisPointV1: {
+ /** @description X. */
+ x?: (string | number | boolean | (Record | null)) | null;
+ /** @description Y. */
+ y?: number | null;
+ /** @description Label. */
+ label?: string | null;
+ /** @description Open the matching records using this table and QueryFilter; null when suppressed. */
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ } | null;
+ DataAnalysisRunStartedV1: {
+ /** @description Run id. */
+ runId?: string | null;
+ /** @description Status. */
+ status?: string | null;
+ } | null;
+ DataAnalysisRunStatusV1: {
+ /** @description Run id. */
+ runId?: string | null;
+ /** @description Status. */
+ status?: string | null;
+ /** @description Error. */
+ error?: string | null;
+ /** @description Completed column result; null for other operations or unfinished runs. */
+ columnProfile?: components["schemas"]["DataAnalysisColumnProfileV1"];
+ /** @description Completed table result; null for other operations or unfinished runs. */
+ tableProfile?: components["schemas"]["DataAnalysisTableProfileV1"];
+ /**
+ * Format: date-time
+ * @description Started at.
+ */
+ startedAt?: string | null;
+ /**
+ * Format: date-time
+ * @description Finished at.
+ */
+ finishedAt?: string | null;
+ } | null;
+ DataAnalysisSavedEntryV1: {
+ id?: number;
+ name?: string;
+ kind?: string;
+ tableName?: string;
+ tableLabel?: string;
+ owner?: string;
+ /** Format: date-time */
+ updated?: string | null;
+ shared?: boolean;
+ starred?: boolean;
+ };
+ DataAnalysisSavedListV1: {
+ analyses?: components["schemas"]["DataAnalysisSavedEntryV1"][];
+ };
+ DataAnalysisSavedRequestV1: {
+ /** @enum {string} */
+ kind: "COLUMN_PROFILE" | "TABLE_PROFILE" | "PIVOT" | "COMPARE" | "CORRELATION" | "CROSSTAB" | "SHIFT";
+ /** @description Source QQQ table name; required for ad hoc export, supplied by the path for SQL. */
+ tableName?: string;
+ /** @description Typed request matching kind. Field names, filters and dimensions use the existing analysis request contracts. */
+ request: components["schemas"]["DataAnalysisColumnProfileRequestV1"] | components["schemas"]["DataAnalysisTableProfileRequestV1"] | components["schemas"]["DataAnalysisPivotRequestV1"] | components["schemas"]["DataAnalysisCompareRequestV1"] | components["schemas"]["DataAnalysisCorrelationRequestV1"] | components["schemas"]["DataAnalysisCrosstabRequestV1"] | components["schemas"]["DataAnalysisShiftRequestV1"];
+ /**
+ * @description Required for export; ignored for SQL.
+ * @enum {string}
+ */
+ format?: "csv" | "xlsx";
+ };
+ DataAnalysisSavedResultV1: {
+ /** @enum {string} */
+ kind?: "COLUMN_PROFILE" | "TABLE_PROFILE" | "PIVOT" | "COMPARE" | "CORRELATION" | "CROSSTAB" | "SHIFT";
+ warnings?: string[];
+ columnProfile?: components["schemas"]["DataAnalysisColumnProfileV1"];
+ compare?: components["schemas"]["DataAnalysisCompareV1"];
+ correlation?: components["schemas"]["DataAnalysisCorrelationV1"];
+ crosstab?: components["schemas"]["DataAnalysisCrosstabV1"];
+ pivot?: components["schemas"]["DataAnalysisPivotV1"];
+ shift?: components["schemas"]["DataAnalysisShiftV1"];
+ tableProfile?: components["schemas"]["DataAnalysisTableProfileV1"];
+ };
+ DataAnalysisScatterRequestV1: {
+ /** @description Table for the scatter link; route parameter takes precedence. */
+ tableName?: string | null;
+ /** @description Compatibility flag; scatter always returns the bounded sample. */
+ exact?: boolean | null;
+ /** @description Current-user query filter; record locks and core field rules apply. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description FULL numeric field on the x axis. */
+ xField: string;
+ /** @description FULL numeric field on the y axis. */
+ yField: string;
+ /** @description Maximum sample points (1 to 2000, default 2000) or kept crosstab categories per axis (1 to 20, default 20). */
+ limit?: number;
+ };
+ DataAnalysisScatterV1: {
+ /** @description Pairwise non-null population count; null when privacy suppresses it. */
+ n?: number | null;
+ /** @description Number of displayed paired records. */
+ sampleSize?: number | null;
+ /** @description Sampling method; core query currently uses a deterministic primary-key prefix. */
+ sampling?: string | null;
+ /** @description Points. */
+ points?: components["schemas"]["DataAnalysisPointV1"][] | null;
+ /** @description Least-squares slope, intercept and r fitted to the displayed sample. */
+ trend?: components["schemas"]["DataAnalysisTrendLineV1"];
+ /** @description Semantic series; category comparisons are grouped and category time series are stacked. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ };
+ DataAnalysisSeriesV1: {
+ /** @description Name. */
+ name?: string | null;
+ /** @description Points. */
+ points?: components["schemas"]["DataAnalysisPointV1"][] | null;
+ } | null;
+ DataAnalysisShiftBucketV1: {
+ /** @description Value. */
+ value?: unknown;
+ /** @description Label. */
+ label?: string | null;
+ /** @description True when the calendar bucket end has passed in the session timezone. */
+ complete?: boolean | null;
+ /** @description Typed metrics with exact population drills unless privacy suppresses them. */
+ metrics?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ };
+ DataAnalysisShiftRequestV1: {
+ /** @description Current-user query filter; record locks and core field rules apply. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description FULL field whose distribution is compared over time. */
+ field: string;
+ /** @description FULL DATE or DATE_TIME field for session-timezone calendar buckets. */
+ dateField: string;
+ /** @description Calendar unit: HOUR, DAY, WEEK, MONTH, QUARTER or YEAR; default MONTH. */
+ bucket?: string;
+ };
+ DataAnalysisShiftV1: {
+ /** @description Buckets. */
+ buckets?: components["schemas"]["DataAnalysisShiftBucketV1"][] | null;
+ /** @description Population stability index, null when inapplicable; zero shares are floored at 0.000001. */
+ psi?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Plain-language result or reason the statistic is not applicable. */
+ sentence?: string | null;
+ /** @description Semantic series; category comparisons are grouped and category time series are stacked. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ };
+ DataAnalysisSignificanceV1: {
+ /** @description Test. */
+ test?: string | null;
+ /** @description Statistic. */
+ statistic?: number | null;
+ /** @description Degrees of freedom; null when undefined. */
+ df?: number | null;
+ /** @description Two-sided p-value; p >= 0.05 is never significant. */
+ pValue?: number | null;
+ /** @description Whether all test validity and privacy requirements hold. */
+ applicable?: boolean | null;
+ /** @description Plain-language result or reason the statistic is not applicable. */
+ sentence?: string | null;
+ /** @description Cramer association strength computed on the pooled contingency table; null when invalid. */
+ cramersV?: number | null;
+ };
+ DataAnalysisSqlV1: {
+ available?: boolean;
+ note?: string;
+ sql?: string | null;
+ };
+ DataAnalysisStarV1: {
+ starred?: boolean;
+ };
+ DataAnalysisStartRunRequestV1: {
+ /**
+ * @description COLUMN_PROFILE or TABLE_PROFILE.
+ * @enum {string}
+ */
+ operation: "COLUMN_PROFILE" | "TABLE_PROFILE";
+ /** @description Table name. */
+ tableName: string;
+ /** @description Profile parameters for the selected operation, without tableName. */
+ request: components["schemas"]["DataAnalysisColumnProfileRequestV1"] | components["schemas"]["DataAnalysisTableProfileRequestV1"];
+ };
+ DataAnalysisTableProfileRequestV1: {
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields?: string[];
+ };
+ DataAnalysisTableProfileV1: {
+ /** @description Table name. */
+ tableName?: string | null;
+ /** @description Core QueryFilter JSON, identical to the table query and count endpoints. */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description True when statistics describe a sample rather than the entire filtered population. */
+ estimate?: boolean | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ /** @description True when the row limit prevented a complete scan. */
+ truncated?: boolean | null;
+ /** @description Number of source rows included in computation. */
+ rowsScanned?: number | null;
+ /**
+ * Format: date-time
+ * @description As of.
+ */
+ asOf?: string | null;
+ /** @description Data version. */
+ dataVersion?: string | null;
+ /** @description Warnings. */
+ warnings?: string[] | null;
+ /** @description Row count. */
+ rowCount?: components["schemas"]["DataAnalysisMetricV1"];
+ /** @description Readable fields to include; omit for all analyzable fields on a table profile. */
+ fields?: components["schemas"]["DataAnalysisFieldSummaryV1"][] | null;
+ /** @description Heatmap. */
+ heatmap?: components["schemas"]["DataAnalysisChartV1"];
+ /** @description Candidate keys. */
+ candidateKeys?: components["schemas"]["DataAnalysisCandidateKeyV1"][] | null;
+ } | null;
+ DataAnalysisTextProfileV1: {
+ /** @description Metrics. */
+ metrics?: components["schemas"]["DataAnalysisMetricV1"][] | null;
+ /** @description Histogram. */
+ histogram?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Patterns. */
+ patterns?: components["schemas"]["DataAnalysisValueCountV1"][] | null;
+ /** @description Actual number of rows in the sample, not an extrapolated count. */
+ sampleRows?: number | null;
+ } | null;
+ DataAnalysisTrendLineV1: {
+ /** @description Slope. */
+ slope?: number | null;
+ /** @description Intercept. */
+ intercept?: number | null;
+ /** @description Pearson correlation; null for insufficient data, zero variance or privacy suppression. */
+ r?: number | null;
+ };
+ DataAnalysisValueCountV1: {
+ /** @description Value. */
+ value?: (string | number | boolean | (Record | null)) | null;
+ /** @description Label. */
+ label?: string | null;
+ /** @description Count. */
+ count?: number | null;
+ /** @description Share as a 0..1 ratio rounded to six decimals. */
+ share?: number | null;
+ /** @description Open the matching records using this table and QueryFilter; null when suppressed. */
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ } | null;
+ DataAnalysisWatchBucketV1: {
+ /** @description Calendar date or hour-start instant in the user's time zone. */
+ start?: string;
+ value?: number | null;
+ categories?: string[];
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ };
+ DataAnalysisWatchPreviewV1: {
+ series?: components["schemas"]["DataAnalysisWatchBucketV1"][];
+ /** @description TIME_SERIES with baseline band annotations. */
+ chart?: components["schemas"]["DataAnalysisChartV1"];
+ verdict?: components["schemas"]["DataAnalysisWatchVerdictV1"];
+ };
+ DataAnalysisWatchVerdictV1: {
+ /** @description False for insufficient history or privacy suppression; must not resolve an alert. */
+ evaluated?: boolean;
+ firing?: boolean;
+ value?: number | null;
+ baseline?: number | null;
+ baselineLow?: number | null;
+ baselineHigh?: number | null;
+ message?: string;
+ drill?: components["schemas"]["DataAnalysisDrillV1"];
+ };
+ /** @description Concatenated acknowledgement previews; type is 997, 999, TA1, CONTRL, NONE or MIXED. text is null for PHI. */
+ EdiAckV1: {
+ text?: string | null;
+ type?: string | null;
+ };
+ /** @description Direct QQQ association and its target fields. */
+ EdiAssociationV1: {
+ fields?: components["schemas"]["EdiFieldV1"][];
+ label?: string | null;
+ name?: string | null;
+ table?: string | null;
+ };
+ /** @description Only differing records are returned. Both lists are empty for PHI. */
+ EdiDiffV1: {
+ againstExpected?: components["schemas"]["EdiDifferenceV1"][];
+ againstPreviousRevision?: components["schemas"]["EdiDifferenceV1"][];
+ };
+ /** @description One document comparison; documentIndex is zero based. */
+ EdiDifferenceV1: {
+ after?: {
+ [key: string]: unknown;
+ } | null;
+ /** @description Expected JSON or a previous mapped record. */
+ before?: unknown;
+ documentIndex?: number | null;
+ };
+ /** @description Element or composite component; codes contain at most 200 active codes in lexical order. */
+ EdiElementV1: {
+ codeListId?: number | null;
+ codes?: (string | null)[];
+ component?: number | null;
+ id?: string | null;
+ maxLength?: number | null;
+ minLength?: number | null;
+ name?: string | null;
+ position?: number | null;
+ type?: string | null;
+ usage?: string | null;
+ };
+ /** @description Deprecated since 1.1.0: errors use BasicErrorResponseV1. */
+ EdiErrorV1: {
+ error?: string | null;
+ };
+ /** @description QQQ target field metadata. */
+ EdiFieldV1: {
+ label?: string | null;
+ name?: string | null;
+ possibleValueSourceName?: string | null;
+ required?: boolean;
+ type?: string | null;
+ };
+ /** @description Value-free diagnostic. PHI messages are generic; only positions and codes are retained. */
+ EdiFindingV1: {
+ code?: string | null;
+ elementPosition?: number | null;
+ loopId?: string | null;
+ message?: string | null;
+ segmentId?: string | null;
+ segmentPosition?: number | null;
+ severity?: string | null;
+ snipLevel?: number | null;
+ };
+ /** @description Ordered guide tree. Root segments are outside loops; nested loops retain parent scope. */
+ EdiGuideTreeV1: {
+ loops?: components["schemas"]["EdiLoopV1"][];
+ segments?: components["schemas"]["EdiSegmentV1"][];
+ };
+ /** @description Guide loop, nested within its parent; repeat is the maximum occurrence count. */
+ EdiLoopV1: {
+ id?: string | null;
+ loops?: components["schemas"]["EdiLoopV1"][];
+ repeat?: number | null;
+ segments?: components["schemas"]["EdiSegmentV1"][];
+ };
+ /** @description Counts of wire interchanges, groups and documents. */
+ EdiParseV1: {
+ documents?: number | null;
+ groups?: number | null;
+ interchanges?: number | null;
+ };
+ /** @description mapId is required. Supply exactly one of sampleId or sampleBase64. Uploads are at most 5 MiB decoded, stored encrypted. ruleOverrides replaces the whole rule set in memory. CURRENT (default) uses the newest active guide in the pinned guide family; ORIGINAL uses the pinned guide. */
+ EdiPreviewRequestV1: {
+ /** @enum {string|null} */
+ guideRevision?: "CURRENT" | "ORIGINAL" | null;
+ mapId?: number | null;
+ ruleOverrides?: components["schemas"]["EdiRuleV1"][] | null;
+ /** Format: byte */
+ sampleBase64?: string | null;
+ sampleId?: number | null;
+ sampleName?: string | null;
+ };
+ /** @description Parse, validate, acknowledge and map without target writes. PHI suppresses result, ack text, and both diffs. */
+ EdiPreviewV1: {
+ ack?: components["schemas"]["EdiAckV1"];
+ diff?: components["schemas"]["EdiDiffV1"];
+ findings?: components["schemas"]["EdiFindingV1"][];
+ parse?: components["schemas"]["EdiParseV1"];
+ phiSuppressed?: boolean;
+ result?: components["schemas"]["EdiResultV1"];
+ };
+ /** @description Field values and recursively associated records. Values use the target table field types. */
+ EdiRecordV1: {
+ associations?: {
+ [key: string]: components["schemas"]["EdiRecordV1"][];
+ };
+ values?: {
+ [key: string]: unknown;
+ };
+ };
+ /** @description Mapped records in document order; no target writes. */
+ EdiResultV1: {
+ records?: components["schemas"]["EdiRecordV1"][];
+ };
+ /** @description Correlate errors using zero-based index, optional id and sequence. */
+ EdiRuleErrorsV1: {
+ errors?: (string | null)[];
+ id?: number | null;
+ index?: number | null;
+ sequence?: number | null;
+ };
+ /** @description Map rule. id is optional for unsaved rules. transformArgs is a JSON object encoded as a string, as in core table CRUD. */
+ EdiRuleV1: {
+ condition?: string | null;
+ defaultValue?: string | null;
+ ediPath?: string | null;
+ id?: number | null;
+ qqqPath?: string | null;
+ required?: boolean | null;
+ sequence?: number | null;
+ transform?: string | null;
+ transformArgs?: string | null;
+ };
+ /** @description Segment definition in guide sequence order. */
+ EdiSegmentV1: {
+ elements?: components["schemas"]["EdiElementV1"][];
+ id?: string | null;
+ max?: number | null;
+ min?: number | null;
+ name?: string | null;
+ position?: string | null;
+ usage?: string | null;
+ };
+ /** @description Target metadata visible to the caller, current rules and registered transforms. */
+ EdiTargetV1: {
+ associations?: components["schemas"]["EdiAssociationV1"][];
+ fields?: components["schemas"]["EdiFieldV1"][];
+ rules?: components["schemas"]["EdiRuleV1"][];
+ table?: string | null;
+ transforms?: components["schemas"]["EdiTransformV1"][];
+ };
+ /** @description Registered transform and JSON Schema describing its string-valued arguments. */
+ EdiTransformV1: {
+ /** @description JSON Schema: type, properties, required and additionalProperties. All transform arguments are strings. */
+ argumentSchema?: {
+ [key: string]: unknown;
+ };
+ name?: string | null;
+ };
+ /** @description rules is required and may be empty; rules are never persisted. */
+ EdiValidateRequestV1: {
+ rules?: components["schemas"]["EdiRuleV1"][];
+ };
+ /** @description One result per submitted rule, including rules with no errors. */
+ EdiValidationV1: {
+ rules?: components["schemas"]["EdiRuleErrorsV1"][];
+ };
+ /** @description Deprecated since 1.1.0: errors use BasicErrorResponseV1. */
+ QuickSearchErrorV1: {
+ /** @description Framework error message. */
+ error?: string;
+ };
+ QuickSearchIndexStatusV1: {
+ /**
+ * Format: date-time
+ * @description Saved validation completion; null when validation counts are unavailable.
+ */
+ countsCheckedAt?: string | null;
+ /**
+ * Format: int64
+ * @description Saved validation document count, else last indexing run count; not live.
+ */
+ documentCount?: number | null;
+ /** @description Whether this index is enabled. */
+ enabled?: boolean;
+ /** @description Persisted indexing error; null when absent. */
+ lastError?: string | null;
+ /**
+ * Format: date-time
+ * @description Newest successful basepull/full-reindex/reconcile watermark.
+ */
+ lastSuccessfulSync?: string | null;
+ /** @description Persisted real-time indexing error count. */
+ realTimeErrorCount?: number | null;
+ /**
+ * Format: int64
+ * @description Source count from saved IndexValidator report; null without validation.
+ */
+ sourceCount?: number | null;
+ /** @description Persisted indexing state, such as ACTIVE or NEEDS_REINDEX. */
+ status?: string | null;
+ /** @description Indexed source table metadata name. */
+ tableName?: string;
+ };
+ QuickSearchStatusV1: {
+ /** @description Cluster health counter; null when unavailable. */
+ activeShards?: number | null;
+ /** @description Counts are lower bounds when more than 1000 backlog rows exist. */
+ backlogTruncated?: boolean;
+ /**
+ * Format: date-time
+ * @description Snapshot completion time; remains unchanged on cache hits.
+ */
+ checkedAt?: string;
+ /** @description OpenSearch health color; null when unknown. */
+ clusterHealth?: string | null;
+ /** @description Whether OpenSearch answered; null when not probed. */
+ clusterReachable?: boolean | null;
+ /** @description Exhausted failed events, from the same bounded backlog read. */
+ exhausted?: number | null;
+ /** @description Quick Search home link, including the configured metadata prefix. */
+ homeHref?: string;
+ /** @description At most 100 persisted index rows, ordered by id. */
+ indexes?: components["schemas"]["QuickSearchIndexStatusV1"][];
+ /** @description Indexing is paused; search can still serve. */
+ indexingPaused?: boolean | null;
+ /** @description Last known indexing/search error or snapshot failure; null when absent. */
+ lastError?: string | null;
+ /**
+ * Format: date-time
+ * @description Newest successful indexing watermark; not a guarantee all tables are current.
+ */
+ lastSuccessfulSync?: string | null;
+ /** @description Cluster health counter; null when unavailable. */
+ nodes?: number | null;
+ /** @description Pending and awaiting-reindex failed events, from at most 1000 backlog rows. */
+ pending?: number | null;
+ /**
+ * @description Overall availability; incomplete diagnostics are DEGRADED.
+ * @enum {string}
+ */
+ state?: "OK" | "DEGRADED" | "DOWN" | "DISABLED";
+ /** @description More than 100 index rows exist. */
+ tablesTruncated?: boolean;
+ /** @description Cluster health counter; null when unavailable. */
+ unassignedShards?: number | null;
+ };
+ QuickSearchSuggestGroupV1: {
+ /** @description An extra accessible item was found in the bounded batch. False does not prove the index has no further matches. */
+ hasMore?: boolean;
+ /** @description At most limitPerTable accessible items in per-table relevance order. */
+ items?: components["schemas"]["QuickSearchSuggestItemV1"][];
+ /** @description Source table label, falling back to its metadata name. */
+ tableLabel?: string;
+ /** @description Source table metadata name. */
+ tableName?: string;
+ };
+ QuickSearchSuggestItemV1: {
+ /** @description Filtered record label, falling back to tableLabel #recordId when blank. */
+ label?: string;
+ /** @description Source record primary key. */
+ recordId?: string;
+ /** @description Already-filtered result subtitle; null when absent. */
+ subtitle?: string | null;
+ };
+ QuickSearchSuggestV1: {
+ /** @description Readable tables ordered by best accessible score; at most maxTables. */
+ groups?: components["schemas"]["QuickSearchSuggestGroupV1"][];
+ /** @description Search term after trimming and collapsing whitespace. */
+ query?: string;
+ /** @description More tables had accessible hits than maxTables. */
+ truncated?: boolean;
+ };
+ SecuredDataBreakGlassV1: {
+ id?: number;
+ reason?: string;
+ /** Format: date-time */
+ expiresAt?: string;
+ scope?: string | null;
+ ceiling?: string;
+ };
+ /** @description Deprecated since 1.1.0: errors use BasicErrorResponseV1. */
+ SecuredDataErrorV1: {
+ error?: string;
+ };
+ SecuredDataRevealAllowanceV1: {
+ tableName?: string;
+ fieldName?: string;
+ remainingDailyAllowance?: number | null;
+ };
+ SecuredDataRevealOptionsResponseV1: {
+ reasonOptions?: string[];
+ allowFreeTextReason?: boolean;
+ requireFreeText?: boolean;
+ revealMinutes?: number;
+ remainingDailyAllowance?: number | null;
+ };
+ /** @description tableName, primaryKey and fieldName are required. Supply a policy reason or allowed free text; maximum 500 characters. */
+ SecuredDataRevealRequestV1: {
+ tableName?: string;
+ fieldName?: string;
+ /** @description Record primary key (string or number). */
+ primaryKey?: string | number;
+ reason?: string | null;
+ reasonText?: string | null;
+ };
+ SecuredDataRevealResponseV1: {
+ /** @description Authorized raw field value. */
+ value?: unknown;
+ displayValue?: string | null;
+ /** Format: date-time */
+ expiresAt?: string;
+ revealId?: number;
+ };
+ SecuredDataStatusResponseV1: {
+ breakGlass?: components["schemas"]["SecuredDataBreakGlassV1"];
+ revealsUsedToday?: number;
+ revealAllowances?: components["schemas"]["SecuredDataRevealAllowanceV1"][];
+ };
+ SqlWorkbenchBackendV1: {
+ name?: string;
+ label?: string;
+ vendor?: string | null;
+ dialect?: components["schemas"]["SqlWorkbenchDialectV1"];
+ readOnlyCredentials?: boolean;
+ readOnlyEnforced?: boolean;
+ transactionalDdl?: boolean;
+ writeAllowed?: boolean;
+ };
+ SqlWorkbenchBinaryValueV1: {
+ $binary?: boolean;
+ /** Format: int64 */
+ length?: number;
+ hexPreview?: string;
+ };
+ SqlWorkbenchCancelledV1: {
+ cancelled?: boolean;
+ };
+ SqlWorkbenchCapabilitiesV1: {
+ version?: string;
+ canWrite?: boolean;
+ canShare?: boolean;
+ writeModeEnabled?: boolean;
+ limits?: components["schemas"]["SqlWorkbenchLimitsV1"];
+ backends?: components["schemas"]["SqlWorkbenchBackendV1"][];
+ };
+ SqlWorkbenchCellV1: {
+ cellKey?: string;
+ cellType?: string;
+ title?: string | null;
+ content?: string;
+ backendName?: string | null;
+ /** Format: int64 */
+ sortOrder?: number;
+ };
+ /** @enum {string} */
+ SqlWorkbenchColumnKindV1: "number" | "string" | "boolean" | "date" | "datetime" | "time" | "json" | "binary" | "array" | "other";
+ SqlWorkbenchColumnV1: {
+ name?: string;
+ label?: string;
+ typeName?: string;
+ /** Format: int64 */
+ jdbcType?: number;
+ kind?: components["schemas"]["SqlWorkbenchColumnKindV1"];
+ };
+ SqlWorkbenchDatabaseSchemaV1: {
+ name?: string;
+ tables?: components["schemas"]["SqlWorkbenchSchemaTableV1"][];
+ };
+ SqlWorkbenchDeletedV1: {
+ deleted?: boolean;
+ };
+ /** @enum {string} */
+ SqlWorkbenchDialectV1: "postgresql" | "mysql" | "sqlite" | "h2" | "sql";
+ SqlWorkbenchEmptyRequestV1: Record;
+ /** @description Deprecated since 1.1.0: errors use BasicErrorResponseV1. */
+ SqlWorkbenchErrorV1: {
+ error?: string;
+ };
+ SqlWorkbenchExecuteRequestV1: {
+ backendName?: string;
+ sql?: string;
+ params?: components["schemas"]["SqlWorkbenchParametersV1"];
+ mode?: string;
+ /** Format: int64 */
+ notebookId?: number | null;
+ cellKey?: string | null;
+ /** Format: int64 */
+ pageSize?: number | null;
+ confirmToken?: string | null;
+ acknowledgeRowGuard?: boolean;
+ executionUuid?: string | null;
+ };
+ SqlWorkbenchExecutionV1: {
+ executionUuid?: string;
+ status?: components["schemas"]["SqlWorkbenchStatusV1"];
+ mode?: string;
+ backendName?: string;
+ /** Format: int64 */
+ durationMs?: number | null;
+ statements?: components["schemas"]["SqlWorkbenchStatementV1"][];
+ columns?: components["schemas"]["SqlWorkbenchColumnV1"][];
+ rows?: components["schemas"]["SqlWorkbenchRowsDataV1"];
+ /** Format: int64 */
+ rowCount?: number;
+ hasMore?: boolean;
+ truncated?: boolean;
+ truncatedReason?: string | null;
+ /** Format: int64 */
+ rowsAffected?: number;
+ error?: string;
+ sqlState?: string | null;
+ dryRunSupported?: boolean;
+ dryRunNote?: string | null;
+ /** Format: int64 */
+ totalAffectedRows?: number | null;
+ rowGuardExceeded?: boolean;
+ /** Format: int64 */
+ rowGuardLimit?: number;
+ confirmToken?: string;
+ expiresAt?: string;
+ /** Format: int64 */
+ previewAffectedRows?: number;
+ /** Format: int64 */
+ actualAffectedRows?: number;
+ };
+ SqlWorkbenchExplainRequestV1: {
+ backendName?: string;
+ sql?: string;
+ params?: components["schemas"]["SqlWorkbenchParametersV1"];
+ analyze?: boolean;
+ };
+ SqlWorkbenchExplainV1: {
+ executionUuid?: string;
+ status?: components["schemas"]["SqlWorkbenchStatusV1"];
+ mode?: string;
+ backendName?: string;
+ dialect?: components["schemas"]["SqlWorkbenchDialectV1"];
+ analyze?: boolean;
+ plan?: components["schemas"]["SqlWorkbenchPlanNodeV1"];
+ raw?: string;
+ error?: string;
+ sqlState?: string | null;
+ /** Format: int64 */
+ durationMs?: number | null;
+ };
+ /** Format: binary */
+ SqlWorkbenchExportFileV1: string;
+ /** @description Rows keyed by unique column labels, with duplicate labels suffixed. */
+ SqlWorkbenchExportJsonV1: {
+ [key: string]: components["schemas"]["SqlWorkbenchValueV1"];
+ }[];
+ SqlWorkbenchFreeObjectV1: {
+ [key: string]: unknown;
+ };
+ SqlWorkbenchHistoryEntryV1: {
+ executionUuid?: string;
+ backendName?: string;
+ mode?: string;
+ status?: string;
+ sqlText?: string;
+ /** Format: int64 */
+ notebookId?: number | null;
+ cellKey?: string | null;
+ startTime?: string | null;
+ /** Format: int64 */
+ durationMs?: number | null;
+ /** Format: int64 */
+ rowsReturned?: number | null;
+ /** Format: int64 */
+ rowsAffected?: number | null;
+ errorMessage?: string | null;
+ };
+ SqlWorkbenchHistoryV1: {
+ executions?: components["schemas"]["SqlWorkbenchHistoryEntryV1"][];
+ };
+ SqlWorkbenchLimitsV1: {
+ /** Format: int64 */
+ maxRows?: number;
+ /** Format: int64 */
+ pageSize?: number;
+ /** Format: int64 */
+ maxPageSize?: number;
+ /** Format: int64 */
+ maxResultBytes?: number;
+ /** Format: int64 */
+ statementTimeoutSeconds?: number;
+ /** Format: int64 */
+ writeStatementTimeoutSeconds?: number;
+ /** Format: int64 */
+ maxAffectedRowsWithoutAcknowledgement?: number;
+ /** Format: int64 */
+ maxAffectedRows?: number;
+ /** Format: int64 */
+ maxSqlLength?: number;
+ /** Format: int64 */
+ maxStatementsPerRun?: number;
+ };
+ SqlWorkbenchNotebookContentV1: {
+ title?: string;
+ description?: string | null;
+ defaultBackendName?: string | null;
+ parameters?: components["schemas"]["SqlWorkbenchNotebookParameterV1"][];
+ cells?: components["schemas"]["SqlWorkbenchCellV1"][];
+ };
+ SqlWorkbenchNotebookParameterV1: {
+ name?: string;
+ type?: string;
+ defaultValue?: string | null;
+ label?: string | null;
+ };
+ SqlWorkbenchNotebookRequestV1: {
+ title?: string;
+ description?: string | null;
+ defaultBackendName?: string | null;
+ parameters?: components["schemas"]["SqlWorkbenchNotebookParameterV1"][];
+ cells?: components["schemas"]["SqlWorkbenchCellV1"][];
+ comment?: string;
+ };
+ SqlWorkbenchNotebookSummaryV1: {
+ /** Format: int64 */
+ id?: number;
+ title?: string;
+ description?: string | null;
+ visibility?: string;
+ ownerUserId?: string;
+ ownerName?: string | null;
+ defaultBackendName?: string | null;
+ /** Format: int64 */
+ currentVersion?: number;
+ canEdit?: boolean;
+ createDate?: string | null;
+ modifyDate?: string | null;
+ };
+ SqlWorkbenchNotebookV1: {
+ /** Format: int64 */
+ id?: number;
+ title?: string;
+ description?: string | null;
+ visibility?: string;
+ ownerUserId?: string;
+ ownerName?: string | null;
+ defaultBackendName?: string | null;
+ /** Format: int64 */
+ currentVersion?: number;
+ canEdit?: boolean;
+ createDate?: string | null;
+ modifyDate?: string | null;
+ parameters?: components["schemas"]["SqlWorkbenchNotebookParameterV1"][];
+ cells?: components["schemas"]["SqlWorkbenchCellV1"][];
+ };
+ SqlWorkbenchNotebooksV1: {
+ notebooks?: components["schemas"]["SqlWorkbenchNotebookSummaryV1"][];
+ };
+ /** @description Named SQL parameter values. JSON decimals are parsed exactly as BigDecimal. */
+ SqlWorkbenchParametersV1: {
+ [key: string]: unknown;
+ };
+ SqlWorkbenchPlanNodeV1: {
+ label?: string;
+ detail?: string | null;
+ startupCost?: number | null;
+ totalCost?: number | null;
+ /** Format: int64 */
+ planRows?: number | null;
+ actualTimeMs?: number | null;
+ /** Format: int64 */
+ actualRows?: number | null;
+ /** Format: int64 */
+ loops?: number | null;
+ extra?: components["schemas"]["SqlWorkbenchFreeObjectV1"];
+ children?: components["schemas"]["SqlWorkbenchPlanNodeV1"][];
+ };
+ SqlWorkbenchPublishRequestV1: {
+ shared?: boolean;
+ };
+ SqlWorkbenchQqqFieldV1: {
+ name?: string;
+ label?: string | null;
+ sqlName?: string;
+ type?: string | null;
+ };
+ SqlWorkbenchQqqTableV1: {
+ name?: string;
+ label?: string | null;
+ sqlName?: string;
+ fields?: components["schemas"]["SqlWorkbenchQqqFieldV1"][];
+ };
+ SqlWorkbenchRowsDataV1: components["schemas"]["SqlWorkbenchValueV1"][][];
+ SqlWorkbenchRowsV1: {
+ executionUuid?: string;
+ columns?: components["schemas"]["SqlWorkbenchColumnV1"][];
+ rows?: components["schemas"]["SqlWorkbenchRowsDataV1"];
+ /** Format: int64 */
+ offset?: number;
+ /** Format: int64 */
+ rowCount?: number;
+ truncated?: boolean;
+ truncatedReason?: string | null;
+ };
+ SqlWorkbenchSchemaColumnV1: {
+ name?: string;
+ typeName?: string;
+ nullable?: boolean;
+ };
+ SqlWorkbenchSchemaTableV1: {
+ name?: string;
+ type?: string;
+ columns?: components["schemas"]["SqlWorkbenchSchemaColumnV1"][];
+ };
+ SqlWorkbenchSchemaV1: {
+ backendName?: string;
+ dialect?: components["schemas"]["SqlWorkbenchDialectV1"];
+ schemas?: components["schemas"]["SqlWorkbenchDatabaseSchemaV1"][];
+ truncated?: boolean;
+ keywords?: string[];
+ functions?: string[];
+ qqqTables?: components["schemas"]["SqlWorkbenchQqqTableV1"][];
+ cachedAt?: string;
+ };
+ SqlWorkbenchSnapshotRequestV1: {
+ executionUuid?: string;
+ cellKey?: string;
+ label?: string | null;
+ };
+ SqlWorkbenchSnapshotResultV1: {
+ columns?: components["schemas"]["SqlWorkbenchColumnV1"][];
+ rows?: components["schemas"]["SqlWorkbenchRowsDataV1"];
+ };
+ SqlWorkbenchSnapshotV1: {
+ /** Format: int64 */
+ id?: number;
+ cellKey?: string | null;
+ executionUuid?: string | null;
+ label?: string | null;
+ backendName?: string | null;
+ /** Format: int64 */
+ rowCount?: number;
+ truncated?: boolean;
+ createDate?: string | null;
+ result?: components["schemas"]["SqlWorkbenchSnapshotResultV1"];
+ };
+ SqlWorkbenchSnapshotsV1: {
+ snapshots?: components["schemas"]["SqlWorkbenchSnapshotV1"][];
+ };
+ /** @enum {string} */
+ SqlWorkbenchStatementKindV1: "READ" | "EXPLAIN_ANALYZE" | "WRITE" | "DDL" | "FORBIDDEN";
+ SqlWorkbenchStatementV1: {
+ /** Format: int64 */
+ index?: number;
+ kind?: components["schemas"]["SqlWorkbenchStatementKindV1"];
+ leadingKeyword?: string | null;
+ text?: string;
+ /** Format: int64 */
+ affectedRows?: number | null;
+ };
+ /** @enum {string} */
+ SqlWorkbenchStatusV1: "SUCCEEDED" | "FAILED" | "TIMED_OUT" | "CANCELLED" | "REJECTED" | "PREVIEW" | "DRIFTED";
+ /** @description JSON-safe JDBC value; null, scalar, binary preview, nested array or vendor JSON object. */
+ SqlWorkbenchValueV1: (string | null) | number | boolean | components["schemas"]["SqlWorkbenchBinaryValueV1"] | unknown[] | components["schemas"]["SqlWorkbenchFreeObjectV1"];
+ SqlWorkbenchVersionSummaryV1: {
+ /** Format: int64 */
+ versionNumber?: number;
+ savedByName?: string | null;
+ comment?: string | null;
+ createDate?: string;
+ };
+ SqlWorkbenchVersionV1: {
+ /** Format: int64 */
+ versionNumber?: number;
+ savedByName?: string | null;
+ comment?: string | null;
+ createDate?: string;
+ notebook?: components["schemas"]["SqlWorkbenchNotebookContentV1"];
+ };
+ SqlWorkbenchVersionsV1: {
+ versions?: components["schemas"]["SqlWorkbenchVersionSummaryV1"][];
+ };
+ };
+ responses: never;
+ parameters: never;
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
+}
+export type $defs = Record;
+export interface operations {
+ getVersion: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["VersionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ openRealtimeStream: {
+ parameters: {
+ query?: never;
+ header?: {
+ /** @description Last received : cursor. */
+ "Last-Event-ID"?: string;
+ };
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Realtime named events and comment heartbeats. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/event-stream": components["schemas"]["RealtimeEventV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ updateRealtimeSubscriptions: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ add?: string[];
+ connectionId?: string;
+ remove?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description Current subscriptions and refused additions. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RealtimeSubscriptionResponseV1"];
+ };
+ };
+ /** @description Malformed subscription request. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Connection not found. */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAuthenticationMetaData: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AuthenticationMetaDataResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getBrandingAsset: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description logo or icon. */
+ role: "logo" | "icon";
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The image (png, jpeg, gif, webp, avif, ico or svg). */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "image/*": string;
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ manageSession: {
+ parameters: {
+ query?: never;
+ header?: {
+ /**
+ * @description For `TABLE_BASED` authentication: `Basic ` followed by the base64 encoding of `username:password` (UTF-8).
+ * Not used by other authentication types.
+ * @example Basic dXNlcm5hbWU6cGFzc3dvcmQ=
+ */
+ Authorization?: string;
+ };
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ /** @description An access token from a downstream authentication provider (e.g., Auth0), to use as the basis for authentication and authorization. */
+ accessToken?: string;
+ /** @description OAuth2 authorization code, for the backend to exchange with the identity provider (authorization-code + PKCE sign-in). */
+ code?: string;
+ /** @description PKCE code verifier that goes with `code`. */
+ codeVerifier?: string;
+ /** @description Redirect URI the authorization `code` was issued to. */
+ redirectUri?: string;
+ /** @description UUID of an existing session, to resume it instead of signing in again. Omit it (and all credentials) to resume the session named by the sessionUUID cookie. */
+ sessionUUID?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description Successful response - session has been created */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ManageSessionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Authentication error - session was not created */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ logout: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Session has been invalidated */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["LogoutResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ oidcBackChannelLogout: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Back-channel logout processed successfully */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BackChannelLogoutResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getMetaData: {
+ parameters: {
+ query?: {
+ /**
+ * @description Name of the frontend requesting the meta-data.
+ * Generally a QQQ frontend library, unless a custom application frontend has been built.
+ * @example qqq-frontend-material-dashboard
+ */
+ frontendName?: string;
+ /**
+ * @description Version of the frontend requesting the meta-data.
+ * @example 0.23.0
+ */
+ frontendVersion?: string;
+ /**
+ * @description Name of the application requesting the meta-data. e.g., an instance of a specific frontend
+ * (i.e., an application might be deployed with 2 different qqq-frontend-material-dashboard frontends,
+ * in which case this attribute allows differentiation between them).
+ * @example my-admin-web-app
+ */
+ applicationName?: string;
+ /**
+ * @description Version of the application requesting the meta-data.
+ * @example 20241021
+ */
+ applicationVersion?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Overall metadata for the application. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["MetaDataResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listPreferenceSections: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Current preferences for the session user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PreferencesResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listDeliveryDestinations: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Delivery response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DeliveryDestinationsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ chooseDeliveryTargets: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ name: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DeliveryTargetsRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Delivery response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DeliveryTargetStepResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getDeliveryOutput: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ logId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Stored output; multiple attachments form a ZIP archive */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/octet-stream": components["schemas"]["DeliveryOutputResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getPreferenceSection: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Registered visible preference section name, from GET /preferences. */
+ sectionName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Current preferences for the session user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PreferenceSectionV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ updatePreferenceSection: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Registered visible preference section name, from GET /preferences. */
+ sectionName: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["PreferenceSectionPatchRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Current preferences for the session user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PreferenceSectionV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ runPreferenceSectionAction: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Registered visible preference section name, from GET /preferences. */
+ sectionName: string;
+ /** @description Registered action name from the visible section. */
+ actionName: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["PreferenceActionRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Current preferences for the session user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PreferenceActionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getTableMetaData: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to load.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The full table metadata */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableMetaDataResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ queryTable: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to query.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description QueryFilter to specify matching records to be returned by the query */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description QueryJoin objects to specify tables to be joined into the query */
+ joins?: components["schemas"]["QueryJoin"][];
+ /** @description For tables that use variant backends, specification of which variant to use. */
+ tableVariant?: components["schemas"]["TableVariant"];
+ };
+ };
+ };
+ responses: {
+ /** @description The records matching query */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableQueryResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ countTable: {
+ parameters: {
+ query: {
+ /**
+ * @description Whether or not to also return the count distinct records from the main table (e.g., in case of a to-many join; by default, do not).
+ * @example true
+ */
+ includeDistinct: boolean;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to count.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description QueryFilter to specify matching records to be returned by the query */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description QueryJoin objects to specify tables to be joined into the query */
+ joins?: components["schemas"]["QueryJoin"][];
+ /** @description For tables that use variant backends, specification of which variant to use. */
+ tableVariant?: components["schemas"]["TableVariant"];
+ };
+ };
+ };
+ responses: {
+ /** @description The number (count) of records matching the query */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableCountResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ searchRecords: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ /**
+ * @description Text to search for (required; at most 100 characters after trimming).
+ * @example Kelkhoff
+ */
+ searchTerm?: string;
+ /** @description Optional list of table names to search. When omitted or empty, every table with search fields is searched. */
+ tableNames?: string[];
+ /** @description Maximum number of records to return from each table. */
+ limitPerTable?: number;
+ /** @description Number of matches to skip in each table, for paging (default 0, maximum 1000). Mainly useful with one table in tableNames. */
+ offset?: number;
+ /**
+ * @description Order of the results within each table: RELEVANCE (default) or RECENT (most recently modified first, for tables with a last-modified field).
+ * @enum {string}
+ */
+ sort?: "RELEVANCE" | "RECENT";
+ };
+ };
+ };
+ responses: {
+ /** @description The records matching the search term */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordSearchResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ searchHelp: {
+ parameters: {
+ query: {
+ q: string;
+ limit?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Help search results */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HelpSearchResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getHelpCoverage: {
+ parameters: {
+ query?: {
+ kind?: string;
+ missingOnly?: boolean;
+ parentKey?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Help coverage results */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HelpCoverageResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No INSERT or EDIT permission on helpContent */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listTableVariants: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table whose variants to list.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The variants the table can be scoped to. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableVariantsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listTableApis: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Name of the table. */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableApisResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getRecord: {
+ parameters: {
+ query?: {
+ /**
+ * @description Whether or not to include associated records.
+ * @example true
+ */
+ includeAssociations?: boolean;
+ /**
+ * @description JSON array of QueryJoin objects specifying tables to join into the get.
+ * @example [{"joinTable":"orderLine","select":true}]
+ */
+ queryJoins?: string;
+ /**
+ * @description For tables that use variant backends, JSON object naming the variant to read from (the same `type` and `id` as in query requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to get the record from.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record to get.
+ * @example 42
+ */
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The record matching the given primary key */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableGetResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteRecord: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to delete from.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record to delete.
+ * @example 42
+ */
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The number of records that were deleted */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableDeleteResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ updateRecord: {
+ parameters: {
+ query?: {
+ /** @description Optional optimistic version from the last read, encoded as a string in the version field's format (ISO-8601 for modify dates). A mismatch returns 409 RecordConflictV1 and leaves the record unchanged. Omit for an unconditional update. Tables with recordVersionField set to an empty string opt out. */
+ expectedVersion?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table containing the record to update.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record to update.
+ * @example 42
+ */
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Value for a field in the record. Repeat for each field to update. */
+ fieldName?: string;
+ };
+ "multipart/form-data": {
+ /** @description Value for a field in the record. Repeat for each field to set. */
+ fieldName?: string;
+ /** @description JSON object of association name to a list of associated records. */
+ associations?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description The record that was updated */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableUpdateResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The record changed since it was read. */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordConflictV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getRecordFeatures: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ tableName: string;
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Record collaboration summary */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordFeatureSummaryV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ runFormAdjuster: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Name of the table whose form is being adjusted. */
+ tableName: string;
+ /** @description `table:{tableName}`, or a field's `formAdjusterIdentifier`. */
+ identifier: string;
+ /** @description Which adjuster to run. */
+ event: "onLoad" | "onChange";
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ /** @description The field the event is for (field adjusters). */
+ fieldName?: string;
+ /** @description The field's new value (field adjusters); sent to the adjuster as text. */
+ newValue?: unknown;
+ /** @description Every value of the form, by field name. */
+ allValues?: {
+ [key: string]: unknown;
+ };
+ };
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["FormAdjusterOutputV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getTableApiDocument: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Name of the table. */
+ tableName: string;
+ /** @description The API's name (`name` in `GET /table/{tableName}/apis`). */
+ apiName: string;
+ /** @description The API version (`versions[].version`). */
+ version: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableApiDocumentV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ insertRecord: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to insert into.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Value for a field in the record. Repeat for each field to set. */
+ fieldName?: string;
+ };
+ "multipart/form-data": {
+ /** @description Value for a field in the record. Repeat for each field to set. */
+ fieldName?: string;
+ /** @description JSON object of association name to a list of associated records. */
+ associations?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description The record that was inserted */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TableInsertResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ queryRelatedRecordPicker: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that declares the picker (e.g. the order).
+ * @example sales_order
+ */
+ tableName: string;
+ /**
+ * @description Name of the picker, from the table metadata's relatedRecordPickers.
+ * @example addSkus
+ */
+ pickerName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Primary key of the parent record (required for MULTI_CHILD and LINK; for SINGLE, the record being edited, if any). Read with the user's own security. */
+ primaryKey?: string;
+ /** @description Current form values (SINGLE on a create form, when there is no primaryKey), for ${input.fieldName} variables in the picker's filters */
+ values?: Record;
+ /** @description Case-insensitive text matched (contains) against the target table's search fields, or its record-label fields */
+ searchTerm?: string;
+ /** @description The user's filter on the target table (criteria and orderBys on target fields only); ANDed with the picker's filter */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Records to skip (offset paging) */
+ skip?: number;
+ /** @description Records per page, 1 to 200 (default 50) */
+ limit?: number;
+ };
+ };
+ };
+ responses: {
+ /** @description Query the records a related-record picker offers: result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RelatedRecordPickerQueryResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ prepareRelatedRecordPicker: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that declares the picker (e.g. the order).
+ * @example sales_order
+ */
+ tableName: string;
+ /**
+ * @description Name of the picker, from the table metadata's relatedRecordPickers.
+ * @example addSkus
+ */
+ pickerName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Primary key of the parent record. Read with the user's own security. */
+ primaryKey?: string;
+ /** @description Primary keys of the picked target records */
+ targetIds?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description Prepare child rows for picked records (MULTI_CHILD, LINK): result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RelatedRecordPickerPrepareResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ addRelatedRecords: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that declares the picker (e.g. the order).
+ * @example sales_order
+ */
+ tableName: string;
+ /**
+ * @description Name of the picker, from the table metadata's relatedRecordPickers.
+ * @example addSkus
+ */
+ pickerName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Primary key of the parent record. Read with the user's own security. */
+ primaryKey?: string;
+ /** @description Primary keys of the picked target records */
+ targetIds?: string[];
+ /** @description Reviewed child rows (instead of targetIds), e.g. the prepare route's rows after the user filled the review fields */
+ records?: {
+ /** @description The row's values: the childTargetFieldName (which target) and the picker's reviewFieldNames; other values are ignored, and the parent and target keys always come from the server */
+ values?: Record;
+ }[];
+ };
+ };
+ };
+ responses: {
+ /** @description Add child or join rows for picked records (MULTI_CHILD, LINK): result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RelatedRecordPickerAddResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ removeRelatedRecords: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that declares the picker (e.g. the order).
+ * @example sales_order
+ */
+ tableName: string;
+ /**
+ * @description Name of the picker, from the table metadata's relatedRecordPickers.
+ * @example addSkus
+ */
+ pickerName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Primary key of the parent record. Read with the user's own security. */
+ primaryKey?: string;
+ /** @description Primary keys of the picked target records */
+ targetIds?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description Unlink picked records (LINK): result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RelatedRecordPickerRemoveResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getRecordDeveloperMode: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that the record is in.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record.
+ * @example 42
+ */
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The record, with its table's associated scripts */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordDeveloperModeResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listRecordDeveloperPanels: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that the record is in.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record.
+ * @example 42
+ */
+ primaryKey: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The record's developer panels */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordDeveloperPanelsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ storeAssociatedScript: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that the record is in.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record.
+ * @example 42
+ */
+ primaryKey: string;
+ /**
+ * @description Name of the associated script field (in the table) whose script is being stored.
+ * @example greetingScriptId
+ */
+ fieldName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /**
+ * @description The script's new contents (its code).
+ * @example return ("Hello, " + input.getName());
+ */
+ contents?: string;
+ /**
+ * @description A message describing the change. If not given, a default message is used.
+ * @example Say hello by name
+ */
+ commitMessage?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description The script, and the revision that was stored */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordAssociatedScriptStoreResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssociatedScriptLogs: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table that the record is in.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record.
+ * @example 42
+ */
+ primaryKey: string;
+ /**
+ * @description Name of the associated script field (in the table) whose script the revision is of.
+ * @example greetingScriptId
+ */
+ fieldName: string;
+ /**
+ * @description Id of the script revision to get logs for.
+ * @example 12
+ */
+ scriptRevisionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The script revision's logs */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RecordAssociatedScriptLogsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ searchTablePossibleValues: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table containing the field.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Name of the field whose possible values should be searched.
+ * @example partnerPersonId
+ */
+ fieldName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Text to search for within possible value labels */
+ searchTerm?: string;
+ /** @description List of specific ids to look up */
+ ids?: string[];
+ /** @description Map of other field values, used for filter interpolation on possible value source filters */
+ values?: Record;
+ /**
+ * @description Use case for possible value search filtering. Controls behavior when filter values are missing.
+ * @enum {string}
+ */
+ useCase?: "FORM" | "FILTER";
+ /** @description List of specific labels to look up */
+ labels?: string[];
+ /** @description Map of field values from the current process step, used for filter interpolation */
+ processValues?: Record;
+ /** @description Optional default filter to apply to the possible value search */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count) */
+ picker?: {
+ /** @description Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key) */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Keyset paging: the last option id of the previous page, when ordered by the primary key alone */
+ afterId?: string;
+ /** @description Offset paging, for orderings other than the primary key */
+ skip?: number;
+ /** @description Options per page (default: the picker's pageSize; at most 200) */
+ limit?: number;
+ };
+ };
+ };
+ };
+ responses: {
+ /** @description List of possible value options matching the search criteria. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PossibleValuesResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ searchProcessPossibleValues: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process containing the field.
+ * @example greetInteractive
+ */
+ processName: string;
+ /**
+ * @description Name of the field whose possible values should be searched.
+ * @example partnerPersonId
+ */
+ fieldName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Text to search for within possible value labels */
+ searchTerm?: string;
+ /** @description List of specific ids to look up */
+ ids?: string[];
+ /** @description Map of other field values, used for filter interpolation on possible value source filters */
+ values?: Record;
+ /**
+ * @description Use case for possible value search filtering. Controls behavior when filter values are missing.
+ * @enum {string}
+ */
+ useCase?: "FORM" | "FILTER";
+ /** @description List of specific labels to look up */
+ labels?: string[];
+ /** @description Map of field values from the current process step, used for filter interpolation */
+ processValues?: Record;
+ /** @description Optional default filter to apply to the possible value search */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count) */
+ picker?: {
+ /** @description Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key) */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Keyset paging: the last option id of the previous page, when ordered by the primary key alone */
+ afterId?: string;
+ /** @description Offset paging, for orderings other than the primary key */
+ skip?: number;
+ /** @description Options per page (default: the picker's pageSize; at most 200) */
+ limit?: number;
+ };
+ };
+ };
+ };
+ responses: {
+ /** @description List of possible value options matching the search criteria. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PossibleValuesResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ searchPossibleValues: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the possible value source to search.
+ * @example person
+ */
+ possibleValueSourceName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Text to search for within possible value labels */
+ searchTerm?: string;
+ /** @description List of specific ids to look up */
+ ids?: string[];
+ /** @description Map of other field values, used for filter interpolation on possible value source filters */
+ values?: Record;
+ /**
+ * @description Use case for possible value search filtering. Controls behavior when filter values are missing.
+ * @enum {string}
+ */
+ useCase?: "FORM" | "FILTER";
+ /** @description List of specific labels to look up */
+ labels?: string[];
+ /** @description Map of field values from the current process step, used for filter interpolation */
+ processValues?: Record;
+ /** @description Optional default filter to apply to the possible value search */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Record picker request, for a possible value source that declares a picker: options carry the picker's display values and the response says whether more follow (no count) */
+ picker?: {
+ /** @description Criteria (only on the picker's filterFields) and orderBys (only on its sort fields or the primary key) */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Keyset paging: the last option id of the previous page, when ordered by the primary key alone */
+ afterId?: string;
+ /** @description Offset paging, for orderings other than the primary key */
+ skip?: number;
+ /** @description Options per page (default: the picker's pageSize; at most 200) */
+ limit?: number;
+ };
+ };
+ };
+ };
+ responses: {
+ /** @description List of possible value options matching the search criteria. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["PossibleValuesResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getWidgetData: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the widget to render.
+ * @example myWidget
+ */
+ widgetName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ [key: string]: string;
+ };
+ };
+ };
+ responses: {
+ /** @description The rendered widget data itself (not wrapped): one of the WidgetData shapes, chosen by its `type`. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["WidgetData"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getProcessMetaData: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process to load.
+ * @example samplePersonProcess
+ */
+ processName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The full process metadata */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessMetaDataResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ initProcess: {
+ parameters: {
+ query?: {
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process to initialize
+ * @example samplePersonProcess
+ */
+ processName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "multipart/form-data": {
+ /** @description Process-specific field names and values. */
+ values?: Record;
+ /** @description Specifies which other query-param will contain the indicator of initial records to pass in to the process. */
+ recordsParam?: string;
+ /** @description Comma-separated list of ids from the table this process is based on, to use as input records for the process. Needs `recordsParam=recordIds` value to be given as well. */
+ recordIds?: string;
+ /** @description JSON encoded QQueryFilter object, to execute against the table this process is based on, to find input records for the process. Needs `recordsParam=filterJSON` value to be given as well. */
+ filterJSON?: string;
+ /** @description Optionally change the time that the server will wait for the job before letting it go asynchronous. Default value is 3000. */
+ stepTimeoutMillis?: number;
+ /**
+ * Format: binary
+ * @description A file upload, for processes which expect to be initialized with an uploaded file.
+ */
+ file?: string;
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests). May also be given as a query parameter.
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ };
+ };
+ responses: {
+ /**
+ * @description State of the initialization of the job, with different fields set, based on the
+ * status of the task.
+ */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessStepResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ stepProcess: {
+ parameters: {
+ query?: {
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process to perform the step in.
+ * @example samplePersonProcess
+ */
+ processName: string;
+ /**
+ * @description Unique identifier for this run of the process - as was returned by the `init` call.
+ * @example 01234567-89AB-CDEF-0123-456789ABCDEF
+ */
+ processUUID: string;
+ /**
+ * @description Name of the frontend step that the user has just completed.
+ * @example inputForm
+ */
+ stepName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "multipart/form-data": {
+ /** @description Process-specific field names and values. */
+ values?: Record;
+ /** @description Optionally change the time that the server will wait for the job before letting it go asynchronous. Default value is 3000. */
+ stepTimeoutMillis?: number;
+ /**
+ * Format: binary
+ * @description A file upload, for process steps which expect an uploaded file.
+ */
+ file?: string;
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests). May also be given as a query parameter.
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ };
+ };
+ responses: {
+ /**
+ * @description State of the backend's running of the next step(s) of the job, with different fields set,
+ * based on the status of the job.
+ */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessStepResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getProcessStatus: {
+ parameters: {
+ query?: {
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process that is being ran
+ * @example samplePersonProcess
+ */
+ processName: string;
+ /**
+ * @description Unique identifier for this run of the process - as was returned by the `init` call.
+ * @example 01234567-89AB-CDEF-0123-456789ABCDEF
+ */
+ processUUID: string;
+ /**
+ * @description Unique identifier for the asynchronous job being executed, as returned by an `init` or `step` call that went asynch.
+ * @example 98765432-10FE-DCBA-9876-543210FEDCBA
+ */
+ jobUUID: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /**
+ * @description State of the backend's running of the specified job, with different fields set,
+ * based on the status of the job.
+ */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessStepResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getProcessRecords: {
+ parameters: {
+ query?: {
+ /**
+ * @description Number of records to skip (default 0)
+ * @example 0
+ */
+ skip?: number;
+ /**
+ * @description Maximum number of records to return (default 20)
+ * @example 20
+ */
+ limit?: number;
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process
+ * @example samplePersonProcess
+ */
+ processName: string;
+ /**
+ * @description Unique identifier for this run of the process
+ * @example 01234567-89AB-CDEF-0123-456789ABCDEF
+ */
+ processUUID: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Paginated list of records from the process state. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessRecordsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ cancelProcess: {
+ parameters: {
+ query?: {
+ /**
+ * @description For processes on tables that use variant backends, JSON object naming the variant to use (the same `type` and `id` as in table requests).
+ * @example {"type":"store","id":"1"}
+ */
+ tableVariant?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process to cancel
+ * @example samplePersonProcess
+ */
+ processName: string;
+ /**
+ * @description Unique identifier for this run of the process
+ * @example 01234567-89AB-CDEF-0123-456789ABCDEF
+ */
+ processUUID: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Empty JSON object indicating successful cancellation. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessCancelResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ launchProcessJob: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the process to run as a job
+ * @example person.bulkEdit
+ */
+ processName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Process values (what the frontend steps would have collected). */
+ values?: Record;
+ /** @description A records filter (QQueryFilter JSON) the process runs over. */
+ filter?: Record;
+ /** @description Primary keys the process runs over. */
+ recordIds?: string[];
+ /** @description Upload refs from POST /uploads. */
+ uploadRefs?: string[];
+ /** @description A saved bulk load profile to load with. */
+ savedBulkLoadProfileId?: number;
+ /** @description A bulk load profile (BulkLoadProfile v1 JSON) to load with. */
+ profile?: Record;
+ /**
+ * @description EXECUTE (default) or VALIDATE (no store).
+ * @enum {string}
+ */
+ mode?: "EXECUTE" | "VALIDATE";
+ /** @description 0-9, default 5 (higher runs first). */
+ priority?: number;
+ /** @description Email the owner when the job finishes. */
+ notifyEmail?: boolean;
+ /** @description A label for the job (defaults to the process label). */
+ label?: string;
+ /** @description The launch point: backend steps after this step run in the job. */
+ startAfterStep?: string;
+ /** @description A known row count (e.g., from a count). */
+ expectedRows?: number;
+ };
+ };
+ };
+ responses: {
+ /** @description The new job's id and status. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProcessJobLaunchResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many jobs are waiting for this user (or for the assistant). */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ listJobs: {
+ parameters: {
+ query?: {
+ /** @description mine (default), or all (requires jobs_admin) */
+ scope?: string;
+ /** @description active (default), recent, or all */
+ state?: string;
+ /** @description 1-200; default 50 */
+ limit?: number;
+ /** @description Optional process filter */
+ processName?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Job list result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobListResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getJob: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ jobId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Job detail result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobDetailV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getJobProgress: {
+ parameters: {
+ query?: {
+ /** @description Last observed log id, default 0; response includes a twenty-id overlap */
+ afterLogId?: number;
+ /** @description 1-200 new lines, plus overlap; default 100 */
+ logLimit?: number;
+ };
+ header?: never;
+ path: {
+ jobId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Job progress result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobProgressPollV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ cancelJob: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ jobId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Job cancel result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobActionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ retryJob: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ jobId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Job retry result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobActionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ trackJob: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["JobTrackRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Job track result */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["JobActionResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Job not found or not visible */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Invalid job transition */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ upload: {
+ parameters: {
+ query?: {
+ /**
+ * @description The file's name, when the body is the raw file (not multipart).
+ * @example people.csv
+ */
+ fileName?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "multipart/form-data": {
+ /**
+ * Format: binary
+ * @description The file.
+ */
+ file?: string;
+ };
+ "application/octet-stream": string;
+ };
+ };
+ responses: {
+ /** @description The upload's ref, name, size, content type and expiry. */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["UploadRefResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ exportTable: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table to export.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description Export format: csv, xlsx, json, tsv */
+ format?: string;
+ /** @description Optional filename for the download. Generated if absent. */
+ filename?: string;
+ /** @description QueryFilter to specify matching records to export */
+ filter?: components["schemas"]["QueryFilter"];
+ /** @description Optional subset of field names to include in the export */
+ fieldNames?: string[];
+ /** @description Optional maximum number of records to export */
+ limit?: number;
+ /** @description Whether to include a header row (default true) */
+ includeHeaderRow?: boolean;
+ /** @description For tables that use variant backends, the variant to export from (the same `type` and `id` as in query requests). */
+ tableVariant?: components["schemas"]["TableVariant"];
+ };
+ };
+ };
+ responses: {
+ /** @description Binary file content in the requested export format */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/octet-stream": string;
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ downloadRecordFieldFile: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description Name of the table containing the record.
+ * @example person
+ */
+ tableName: string;
+ /**
+ * @description Primary key value of the record.
+ * @example 42
+ */
+ primaryKey: string;
+ /**
+ * @description Name of the field to download.
+ * @example photo
+ */
+ fieldName: string;
+ /**
+ * @description Filename for the downloaded content.
+ * @example photo.jpg
+ */
+ filename: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Binary file content */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/octet-stream": string;
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ download: {
+ parameters: {
+ query?: {
+ /** @description Server-side file path to download from. */
+ filePath?: string;
+ /** @description Name of the storage table to download from. */
+ storageTableName?: string;
+ /** @description Storage reference key for the file. */
+ storageReference?: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Filename for the download.
+ * @example report.csv
+ */
+ file: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Binary file content */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/octet-stream": string;
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ runReport: {
+ parameters: {
+ query: {
+ /**
+ * @description Output format: csv, xlsx, json (as for table export).
+ * @example csv
+ */
+ format: string;
+ };
+ header?: never;
+ path: {
+ /**
+ * @description Name of the report to run.
+ * @example personReport
+ */
+ reportName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The generated report file, in the requested format */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/octet-stream": string;
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getBulkLoadUploadProfile: {
+ parameters: {
+ query: {
+ /**
+ * @description The table the file would be loaded into.
+ * @example person
+ */
+ tableName: string;
+ /** @description Sample values per column, where allowed (0 to 20; default 5). */
+ sampleCount?: number;
+ };
+ header?: never;
+ path: {
+ /** @description The opaque ref of an upload the session user owns. */
+ uploadRef: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The upload's header guess and column profiles */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BulkLoadUploadProfileResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ suggestBulkLoadMapping: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description The table the file would be loaded into.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description The opaque ref of an upload the session user owns. */
+ uploadRef?: string;
+ /** @description Suggest a bulk edit profile (default false: bulk insert). */
+ isBulkEdit?: boolean;
+ };
+ };
+ };
+ responses: {
+ /** @description The suggested profile and what it leaves unmapped */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BulkLoadSuggestMappingResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ validateBulkLoad: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /**
+ * @description The table the file would be loaded into.
+ * @example person
+ */
+ tableName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": {
+ /** @description The opaque ref of an upload the session user owns. */
+ uploadRef?: string;
+ /** @description A v1 bulk load profile: version, layout (FLAT), hasHeaderRow, and fieldList entries of fieldName, columnIndex, headerName, defaultValue, doValueMapping, valueMappings and clearIfEmpty. */
+ profile?: Record;
+ /**
+ * @description SAMPLE (default, the first 100 rows) or FULL.
+ * @enum {string}
+ */
+ mode?: "SAMPLE" | "FULL";
+ };
+ };
+ };
+ responses: {
+ /** @description The dry run's summary and error groups */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BulkLoadValidateResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getEsbOverview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EsbOverviewResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getEsbTableByTable: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Table name. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EsbTableResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getEsbProcessByProcess: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Process name. */
+ process: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EsbProcessResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getEsbDeadLettersByTrigger: {
+ parameters: {
+ query?: {
+ /** @description Messages to skip (default 0). */
+ offset?: number;
+ /** @description Messages to return (default and maximum set by the server). */
+ limit?: number;
+ };
+ header?: never;
+ path: {
+ /** @description Trigger name. */
+ trigger: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EsbMessagePageResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getEsbMessagesByDestination: {
+ parameters: {
+ query?: {
+ /** @description For a topic: the trigger whose subscription to browse. */
+ trigger?: string;
+ /** @description Messages to skip (default 0). */
+ offset?: number;
+ /** @description Messages to return (default and maximum set by the server). */
+ limit?: number;
+ };
+ header?: never;
+ path: {
+ /** @description Destination name. */
+ destination: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EsbMessagePageResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getHealthSummary: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HealthSummaryV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getHealthComponentsByName: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Stable health check or component name. */
+ name: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HealthComponentV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getHealthChecksByNameHistory: {
+ parameters: {
+ query?: {
+ /** @description limit is capped at 500; from/to are inclusive ISO-8601 instants. */
+ from?: string;
+ /** @description limit is capped at 500; from/to are inclusive ISO-8601 instants. */
+ to?: string;
+ /** @description limit is capped at 500; from/to are inclusive ISO-8601 instants. */
+ limit?: number;
+ };
+ header?: never;
+ path: {
+ /** @description Stable health check or component name. */
+ name: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HealthHistoryV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postHealthChecksByNameRun: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Stable health check or component name. */
+ name: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["HealthRunV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsInboxSummary: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsInboxSummaryV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsInbox: {
+ parameters: {
+ query?: {
+ /** @description all or unread; other values behave as all. */
+ status?: string;
+ /** @description Case-insensitive category filter. */
+ category?: string;
+ /** @description Case-insensitive severity filter. */
+ severity?: string;
+ /** @description Default 0; negatives clamp to 0; malformed values use the default. */
+ offset?: number;
+ /** @description Default 25; clamped to 1..100; malformed values use the default. */
+ limit?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsInboxPageV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsInboxRead: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["AlertsInboxTargetV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsInboxUnread: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["AlertsUnreadTargetV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsInboxDismiss: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["AlertsInboxTargetV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ alertsRecordPanel: {
+ parameters: {
+ query: {
+ /** @description Parent table name. */
+ tableName: string;
+ /** @description Parent record key. */
+ recordId: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AlertsRecordPanelV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantConfig: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantConfigResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantConversations: {
+ parameters: {
+ query?: {
+ /** @description ARCHIVED for archived conversations; active ones by default. */
+ status?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantConversationListResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantConversations: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ title?: string;
+ /** @description route, tableName, recordId, filter, selectedIds. */
+ context?: {
+ [key: string]: unknown;
+ };
+ };
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantConversationV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantConversationsById: {
+ parameters: {
+ query?: {
+ /** @description Only messages older than this message id. */
+ before?: number;
+ /** @description Page size (default 50, at most 200). */
+ limit?: number;
+ };
+ header?: never;
+ path: {
+ /** @description The conversation id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantConversationDetailResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteAssistantConversationsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The conversation id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Done (no body) */
+ 204: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ patchAssistantConversationsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The conversation id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ title?: string;
+ pinned?: boolean;
+ /** @description ACTIVE or ARCHIVED. */
+ status?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantConversationV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantConversationsByIdTurns: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The conversation id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ /** @description The user's message. */
+ text?: string;
+ /** @description Where the user is in the app. */
+ pageContext?: {
+ [key: string]: unknown;
+ };
+ /** @description supersede or concurrent (case-insensitive); defaults to the host configuration. */
+ concurrency?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description The turn's events, until message.end */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/event-stream": components["schemas"]["AssistantTurnEventV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantTurnsByTurnIdEvents: {
+ parameters: {
+ query?: {
+ /** @description The last sequence number already received (0 for all). */
+ after?: number;
+ };
+ header?: never;
+ path: {
+ /** @description The turn id. */
+ turnId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description The turn's events after `after`, until message.end */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/event-stream": components["schemas"]["AssistantTurnEventV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantTurnsByTurnIdCancel: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The turn id. */
+ turnId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantStatusResponseV1"];
+ };
+ };
+ /** @description Legacy replica: cancellation accepted */
+ 202: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantStatusResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantTurnsActive: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantActiveTurnsResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantMessagesByIdFeedback: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The assistant message id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": {
+ /** @description 1 or -1. */
+ rating?: number;
+ reason?: string;
+ comment?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description Done (no body) */
+ 204: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantActionsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The pending action id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantActionV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantActionsByIdConfirm: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The pending action id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantActionV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postAssistantActionsByIdReject: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description The pending action id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantActionV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getAssistantAccess: {
+ parameters: {
+ query?: {
+ /** @description Only this table. */
+ table?: string;
+ /** @description Only the tables this text mentions. */
+ prompt?: string;
+ /** @description Attribute this request to an owned turn. */
+ turnId?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["AssistantAccessResponseV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description No access to the assistant */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (or not the user's own) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Already finished or decided */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Budget or rate limit */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Disabled, not configured, or the kill switch is on */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationPresence: {
+ parameters: {
+ query: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationPresenceSnapshotV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationPresence: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationPresenceRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationPresenceSnapshotV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitCollaborationPresence: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationPresenceLeaveV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationFavorites: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationFavoriteListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ putQbitCollaborationFavorites: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTargetRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitCollaborationFavorites: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTargetRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecents: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationRecentListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecents: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTargetRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ patchQbitCollaborationFavoritesOrder: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationFavoriteOrderRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkAttachments: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAttachmentListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecordsByTableByPkAttachments: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "multipart/form-data": components["schemas"]["CollaborationAttachmentUploadRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Uploaded attachment */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAttachmentV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationAttachmentsByIdDownload: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationDownloadV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationAttachmentsByIdPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationDownloadV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitCollaborationAttachmentsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ patchQbitCollaborationAttachmentsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationAttachmentPatchRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAttachmentV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationTags: {
+ parameters: {
+ query: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Text to search in display names or vocabulary. */
+ q?: string;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTagListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationTags: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTagCreateRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTagV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkTags: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTagListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ putQbitCollaborationRecordsByTableByPkTags: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTagApplyRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTagListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkComments: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentPageV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecordsByTableByPkComments: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentPostRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitCollaborationCommentsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ patchQbitCollaborationCommentsById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentEditRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationCommentsByIdResolve: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationCommentsByIdReopen: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMutationResultV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationCommentsByIdHistory: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationCommentHistoryV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationMentionsCandidates: {
+ parameters: {
+ query: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ /** @description Text to search in display names or vocabulary. */
+ q?: string;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMentionCandidateListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkFollow: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationFollowStateV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ putQbitCollaborationRecordsByTableByPkFollow: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationFollowRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationFollowStateV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitCollaborationRecordsByTableByPkFollow: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationFollowStateV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkFollowers: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationFollowerListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkTimeline: {
+ parameters: {
+ query?: {
+ /** @description Timeline continuation token; alias for cursor. Supply only one. */
+ before?: string;
+ /** @description Comma-separated AUDIT, ACTIVITY or activity type names (for example COMMENTED). */
+ types?: string;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTimelinePageV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationPeople: {
+ parameters: {
+ query?: {
+ /** @description Text to search in display names or vocabulary. */
+ q?: string;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationPersonListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationPeopleByUserId: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Stable directory user identity. */
+ userId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationPersonV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkLink: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationLinkV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecordsByTableByPkSharesPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationShareRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationSharePreviewV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecordsByTableByPkShares: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationShareRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationShareListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationAccessRequests: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationAccessRequestCreateRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAccessRequestV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationAccessRequestsMine: {
+ parameters: {
+ query?: {
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAccessRequestListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationRecordsByTableByPkTasks: {
+ parameters: {
+ query?: {
+ /** @description Include completed and cancelled tasks; default false. */
+ includeDone?: boolean;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitCollaborationRecordsByTableByPkTasks: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskCreateRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ patchQbitCollaborationTasksById: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Collaboration object identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskPatchRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationTasksMine: {
+ parameters: {
+ query?: {
+ /** @description Task status: OPEN (default), DONE or CANCELLED. */
+ status?: string;
+ /** @description Maximum items to return, from 1 to 100; default 20. */
+ limit?: number;
+ /** @description Opaque nextCursor returned by the previous page; omit for the first page. */
+ cursor?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationTaskListV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ putQbitCollaborationRecordsByTableByPkAssignment: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Parent table metadata name. */
+ table: string;
+ /** @description Parent record primary key. */
+ pk: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["CollaborationAssignmentRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationAssignmentV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitCollaborationMyWork: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CollaborationMyWorkV1"];
+ };
+ };
+ /** @description Invalid input */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found (including invisible parents) */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisSavedByIdRun: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Owner-scoped analysis run or watch id. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisSavedResultV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitDataAnalysisSaved: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisSavedListV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ putQbitDataAnalysisSavedByIdStar: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Owner-scoped analysis run or watch id. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisStarV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ deleteQbitDataAnalysisSavedByIdStar: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Owner-scoped analysis run or watch id. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisStarV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableSql: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisSavedRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisSqlV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisExport: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisSavedRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Analysis result file */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": components["schemas"]["DataAnalysisFileV1"];
+ "text/csv": components["schemas"]["DataAnalysisFileV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitDataAnalysisSavedByIdExport: {
+ parameters: {
+ query: {
+ /** @description Result file format. */
+ format: "csv" | "xlsx";
+ };
+ header?: never;
+ path: {
+ /** @description Visible saved analysis id. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Analysis result file */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": components["schemas"]["DataAnalysisFileV1"];
+ "text/csv": components["schemas"]["DataAnalysisFileV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitDataAnalysisTablesByTableCapabilities: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCapabilitiesV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableColumnProfile: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisColumnProfileRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisColumnProfileV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableDistinctValues: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisDistinctValuesRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisDistinctValuesPageV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableCompare: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCompareRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCompareV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableShift: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisShiftRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisShiftV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableCorrelation: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCorrelationRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCorrelationV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableScatter: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisScatterRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisScatterV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableCrosstab: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCrosstabRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisCrosstabV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisWatchesByIdPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Owner-scoped analysis run or watch id. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisWatchPreviewV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTablePivot: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisPivotRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisPivotV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableTableProfile: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisTableProfileRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisTableProfileV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisTablesByTableDuplicates: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description QQQ table name to analyze. */
+ table: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisDuplicatesRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisDuplicatesResultV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitDataAnalysisRuns: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["DataAnalysisStartRunRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisRunStartedV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitDataAnalysisRunsByRunId: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Owner-scoped analysis run or watch id. */
+ runId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["DataAnalysisRunStatusV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitEdiGuidesByGuideIdTree: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Positive record identifier. */
+ guideId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EdiGuideTreeV1"];
+ };
+ };
+ /** @description Invalid request or sample exceeds 5 MiB */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible record */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Host HTTP request size limit exceeded */
+ 413: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitEdiMapsByMapIdTarget: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Positive record identifier. */
+ mapId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EdiTargetV1"];
+ };
+ };
+ /** @description Invalid request or sample exceeds 5 MiB */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible record */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Host HTTP request size limit exceeded */
+ 413: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitEdiSandboxPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["EdiPreviewRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EdiPreviewV1"];
+ };
+ };
+ /** @description Invalid request or sample exceeds 5 MiB */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible record */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Host HTTP request size limit exceeded */
+ 413: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitEdiMapsByMapIdValidate: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Positive record identifier. */
+ mapId: number;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["EdiValidateRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["EdiValidationV1"];
+ };
+ };
+ /** @description Invalid request or sample exceeds 5 MiB */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible record */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Host HTTP request size limit exceeded */
+ 413: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQuickSearchStatus: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["QuickSearchStatusV1"];
+ };
+ };
+ /** @description Diagnostic rate limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Quick Search admin permission required */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQuickSearchSuggestions: {
+ parameters: {
+ query: {
+ /** @description Search text: trim and collapse whitespace before applying the 2..100 character range. Shorter terms return empty groups; longer terms return 400. */
+ q: string;
+ /** @description Items per table: integer 1..10, default 5. */
+ limitPerTable?: number;
+ /** @description Groups to return: integer 1..20, default 8. */
+ maxTables?: number;
+ /** @description Optional comma-separated table metadata names. Unknown, disabled and unreadable tables are omitted. */
+ tables?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["QuickSearchSuggestV1"];
+ };
+ };
+ /** @description Missing q, normalized term longer than 100 characters, or invalid limits */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Session permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ postQbitSecuredDataReveal: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SecuredDataRevealRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SecuredDataRevealResponseV1"];
+ };
+ };
+ /** @description Invalid reveal request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Reveal denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Record not found or locked */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Daily reveal cap reached */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitSecuredDataRevealOptions: {
+ parameters: {
+ query: {
+ tableName: string;
+ fieldName: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SecuredDataRevealOptionsResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ getQbitSecuredDataStatus: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SecuredDataStatusResponseV1"];
+ };
+ };
+ /** @description Bad request: a parameter or the body is invalid (code BAD_REQUEST); fieldErrors may name the fields. */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not authenticated, or the session or token is invalid or expired (code UNAUTHENTICATED). Sign in again, or refresh the token. */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description The user (or the credential's scope) may not do this (code PERMISSION_DENIED). */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Not found, or not visible to this user (code NOT_FOUND). */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Conflict with the current state, e.g. an edit conflict or an invalid transition (code CONFLICT). */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetCapabilities: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchCapabilitiesV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetSchema: {
+ parameters: {
+ query?: {
+ /** @description True to bypass the schema cache; default false. */
+ refresh?: boolean;
+ };
+ header?: never;
+ path: {
+ /** @description Configured target backend name. */
+ backendName: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchSchemaV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchExecute: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchExecuteRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchExecutionV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchExplain: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchExplainRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchExplainV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetRows: {
+ parameters: {
+ query?: {
+ /** @description Rows to skip; default zero; negative values become zero. */
+ offset?: number;
+ /** @description Page size; nonpositive or absent uses the default. Rows cap at maxPageSize; history caps at 200 (default 50). */
+ limit?: number;
+ /** @description Optional zero-based result column index. */
+ sort?: number;
+ /** @description Sort direction: desc (case insensitive) or asc (default). */
+ dir?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Execution UUID; case insensitive. */
+ uuid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchRowsV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchCancelExecution: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Execution UUID; case insensitive. */
+ uuid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchEmptyRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchCancelledV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetHistory: {
+ parameters: {
+ query?: {
+ /** @description Page size; nonpositive or absent uses the default. Rows cap at maxPageSize; history caps at 200 (default 50). */
+ limit?: number;
+ /** @description Configured target backend name. */
+ backendName?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchHistoryV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchListNotebooks: {
+ parameters: {
+ query?: {
+ /** @description mine (default) or shared notebook library. */
+ scope?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebooksV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchCreateNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchUpdateNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchDeleteNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchDeletedV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchPublishNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchPublishRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchDuplicateNotebook: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchEmptyRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchListVersions: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchVersionsV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchGetVersion: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ /** @description Notebook version number. */
+ n: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchVersionV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchRestoreVersion: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ /** @description Notebook version number. */
+ n: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchEmptyRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchNotebookV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchListSnapshots: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchSnapshotsV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchCreateSnapshot: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: {
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchSnapshotRequestV1"];
+ };
+ };
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchSnapshotV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchDeleteSnapshot: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notebook identifier. */
+ id: number;
+ /** @description Snapshot identifier. */
+ snapshotId: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Successful Response */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchDeletedV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+ sqlWorkbenchExportResult: {
+ parameters: {
+ query?: {
+ /** @description csv (default), json or xlsx; case insensitive. */
+ format?: string;
+ };
+ header?: never;
+ path: {
+ /** @description Execution UUID; case insensitive. */
+ uuid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Attachment named sql-result-{short UUID}.{format}; Cache-Control: no-store */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SqlWorkbenchExportJsonV1"];
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": components["schemas"]["SqlWorkbenchExportFileV1"];
+ "text/csv; charset=utf-8": components["schemas"]["SqlWorkbenchExportFileV1"];
+ };
+ };
+ /** @description Invalid input or execution limit exceeded */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Sign in required */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Permission denied */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Missing or invisible resource */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Execution UUID already used */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ /** @description Too many requests (code RATE_LIMITED); retry later. */
+ 429: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["BasicErrorResponseV1"];
+ };
+ };
+ };
+ };
+}
diff --git a/packages/ui-api-client/src/test/client.test.ts b/packages/ui-api-client/src/test/client.test.ts
new file mode 100644
index 0000000..06ec6cf
--- /dev/null
+++ b/packages/ui-api-client/src/test/client.test.ts
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { createUiApiClient, unwrap } from '../client.js'
+import { UiApiError } from '../errors.js'
+import { deviceSignIn, refreshTokens, isExpiring } from '../auth.js'
+import { parseEventBlock } from '../realtime.js'
+
+function jsonResponse(status: number, body: unknown, headers: Record = {}): Response {
+ return new Response(JSON.stringify(body), { status, headers: { 'Content-Type': 'application/json', ...headers } })
+}
+
+test('sends the bearer token and client channel, and unwraps data', async () => {
+ const seen: Request[] = []
+ const client = createUiApiClient({
+ baseUrl: 'https://app.example.com/',
+ token: () => 'tok-1',
+ clientChannel: 'cli/test',
+ fetch: async (input) => {
+ seen.push(input as Request)
+ return jsonResponse(200, { apiVersion: '1.6.0' })
+ },
+ })
+ const version = await unwrap(client.GET('/qqq/v1/version'))
+ assert.equal((version as { apiVersion: string }).apiVersion, '1.6.0')
+ assert.equal(seen[0].url, 'https://app.example.com/qqq/v1/version')
+ assert.equal(seen[0].headers.get('Authorization'), 'Bearer tok-1')
+ assert.equal(seen[0].headers.get('X-QQQ-Client'), 'cli/test')
+})
+
+test('an error answer becomes UiApiError with code, traceId and field errors', async () => {
+ const client = createUiApiClient({
+ baseUrl: 'https://app.example.com',
+ fetch: async () => jsonResponse(400, { error: 'Bad', code: 'BAD_REQUEST', message: 'Bad input', traceId: 't-1', fieldErrors: [{ field: 'name', message: 'required' }] }),
+ })
+ await assert.rejects(unwrap(client.GET('/qqq/v1/metaData', {})), (error: unknown) => {
+ assert.ok(error instanceof UiApiError)
+ assert.equal(error.status, 400)
+ assert.equal(error.code, 'BAD_REQUEST')
+ assert.equal(error.message, 'Bad input')
+ assert.equal(error.traceId, 't-1')
+ assert.equal(error.fieldErrors[0].field, 'name')
+ return true
+ })
+})
+
+test('a pre-1.6.0 error body (only "error") still maps, using the status code and trace header', async () => {
+ const client = createUiApiClient({ baseUrl: 'https://app.example.com', fetch: async () => jsonResponse(403, { error: 'Permission denied.' }, { 'X-QQQ-Trace-Id': 'h-1' }) })
+ await assert.rejects(unwrap(client.GET('/qqq/v1/metaData', {})), (error: unknown) => {
+ assert.ok(error instanceof UiApiError)
+ assert.equal(error.code, 'PERMISSION_DENIED')
+ assert.equal(error.message, 'Permission denied.')
+ assert.equal(error.traceId, 'h-1')
+ return true
+ })
+})
+
+test('a 401 refreshes once and retries with the new token', async () => {
+ let token = 'old'
+ let calls = 0
+ const client = createUiApiClient({
+ baseUrl: 'https://app.example.com',
+ token: () => token,
+ onUnauthorized: () => {
+ token = 'new'
+ return true
+ },
+ fetch: async (input) => {
+ calls++
+ return (input as Request).headers.get('Authorization') === 'Bearer new' ? jsonResponse(200, { apiVersion: '1.6.0' }) : jsonResponse(401, { error: 'expired', code: 'UNAUTHENTICATED' })
+ },
+ })
+ await unwrap(client.GET('/qqq/v1/version'))
+ assert.equal(calls, 2)
+})
+
+test('device sign-in polls through authorization_pending and slow_down', async () => {
+ const answers = [
+ jsonResponse(400, { error: 'authorization_pending' }),
+ jsonResponse(400, { error: 'slow_down' }),
+ jsonResponse(200, { access_token: 'a.b.c', refresh_token: 'r1', expires_in: 600 }),
+ ]
+ const sleeps: number[] = []
+ let prompted = ''
+ const fetchImpl: typeof fetch = async (input) => {
+ const url = String(input)
+ if (url.endsWith('/.well-known/openid-configuration')) return jsonResponse(200, { issuer: 'https://idp/o/cli/', token_endpoint: 'https://idp/token', device_authorization_endpoint: 'https://idp/device' })
+ if (url === 'https://idp/device') return jsonResponse(200, { device_code: 'dc', user_code: 'ABCD-EFGH', verification_uri: 'https://idp/activate', verification_uri_complete: 'https://idp/activate?c=1', interval: 2, expires_in: 600 })
+ return answers.shift() as Response
+ }
+ const tokens = await deviceSignIn({ issuer: 'https://idp/o/cli/', clientId: 'cli', scope: 'openid' }, (p) => { prompted = p.userCode }, { fetch: fetchImpl, sleep: async (ms) => { sleeps.push(ms) } })
+ assert.equal(prompted, 'ABCD-EFGH')
+ assert.equal(tokens.accessToken, 'a.b.c')
+ assert.equal(tokens.refreshToken, 'r1')
+ assert.deepEqual(sleeps, [2000, 2000, 7000])
+ assert.equal(isExpiring(tokens), false)
+})
+
+test('device sign-in stops on access_denied', async () => {
+ const fetchImpl: typeof fetch = async (input) => {
+ const url = String(input)
+ if (url.endsWith('/.well-known/openid-configuration')) return jsonResponse(200, { token_endpoint: 'https://idp/token', device_authorization_endpoint: 'https://idp/device' })
+ if (url === 'https://idp/device') return jsonResponse(200, { device_code: 'dc', user_code: 'X', verification_uri: 'https://idp/a', interval: 1, expires_in: 60 })
+ return jsonResponse(400, { error: 'access_denied' })
+ }
+ await assert.rejects(deviceSignIn({ issuer: 'https://idp/', clientId: 'cli', scope: 'openid' }, () => undefined, { fetch: fetchImpl, sleep: async () => undefined }), /denied/)
+})
+
+test('refresh keeps the old refresh token when the provider does not rotate it', async () => {
+ const fetchImpl: typeof fetch = async (input) => String(input).endsWith('openid-configuration')
+ ? jsonResponse(200, { token_endpoint: 'https://idp/token' })
+ : jsonResponse(200, { access_token: 'x.y.z', expires_in: 60 })
+ const tokens = await refreshTokens({ issuer: 'https://idp/', clientId: 'cli', scope: 'openid' }, 'r-old', fetchImpl)
+ assert.equal(tokens.refreshToken, 'r-old')
+ assert.equal(isExpiring(tokens, 120), true)
+})
+
+test('SSE blocks parse events and skip comments', () => {
+ assert.deepEqual(parseEventBlock('id: c:1\nevent: hello\ndata: {"connectionId":"c"}'), { id: 'c:1', event: 'hello', data: { connectionId: 'c' } })
+ assert.equal(parseEventBlock(': ping'), undefined)
+ assert.deepEqual(parseEventBlock('event: job.progress\ndata: {"jobId":1,\ndata: "percent":50}'), { id: undefined, event: 'job.progress', data: { jobId: 1, percent: 50 } })
+})
diff --git a/packages/ui-api-client/tsconfig.json b/packages/ui-api-client/tsconfig.json
new file mode 100644
index 0000000..5285d28
--- /dev/null
+++ b/packages/ui-api-client/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}
diff --git a/scripts/fix-recursive-types.mjs b/scripts/fix-recursive-types.mjs
new file mode 100644
index 0000000..f4a04ec
--- /dev/null
+++ b/scripts/fix-recursive-types.mjs
@@ -0,0 +1,25 @@
+#!/usr/bin/env node
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+// openapi-typescript emits a directly self-recursive union (e.g. SqlWorkbenchValueV1, whose arrays
+// hold more values) as a one-line member that TypeScript rejects (TS2502). Replace the self
+// reference on such a line with `unknown`, keeping the rest of the type.
+import { readFileSync, writeFileSync } from 'node:fs'
+
+const file = process.argv[2]
+const lines = readFileSync(file, 'utf8').split('\n')
+let fixed = 0
+for (let i = 0; i < lines.length; i++) {
+ const match = /^(\s+)([A-Za-z0-9_]+): (.*);$/.exec(lines[i])
+ if (!match) continue
+ const self = `components["schemas"]["${match[2]}"]`
+ if (match[3].includes(self)) {
+ lines[i] = `${match[1]}${match[2]}: ${match[3].split(self).join('unknown')};`
+ fixed++
+ }
+}
+writeFileSync(file, lines.join('\n'))
+console.log(`fixed ${fixed} self-recursive type(s) in ${file}`)
diff --git a/scripts/merge-spec.mjs b/scripts/merge-spec.mjs
new file mode 100644
index 0000000..bf0f8d3
--- /dev/null
+++ b/scripts/merge-spec.mjs
@@ -0,0 +1,111 @@
+#!/usr/bin/env node
+/*
+ * Copyright 2026 QRun.IO, Inc.
+ * Licensed under the Apache License, Version 2.0 (see LICENSE).
+ */
+
+/**
+ * Merge the QQQ UI API core document with extension documents into one OpenAPI document.
+ *
+ * Usage: node scripts/merge-spec.mjs --out [extension.yaml|url ...]
+ *
+ * Inputs are the committed documents (qqq: qqq-middleware-javalin/src/main/resources/openapi/v1/
+ * openapi.yaml; each qbit: src/main/resources/openapi/qqq-v1/{name}.yaml), local paths or URLs.
+ * A server's own GET /qqq/v1/openapi.json is already merged and can be used directly instead.
+ *
+ * Rules: paths and operations are unioned (a duplicate method on one path is an error); component
+ * schemas are unioned (a name defined twice must be identical, e.g. BasicErrorResponseV1); the
+ * core document's info, servers and securitySchemes are kept; tags are unioned; every extension's
+ * name and version is recorded in info.x-qqq-extensions.
+ */
+
+import { readFile, writeFile } from 'node:fs/promises'
+import { parse } from 'yaml'
+
+const args = process.argv.slice(2)
+const outIndex = args.indexOf('--out')
+if (outIndex < 0 || args.length < outIndex + 2) {
+ console.error('usage: merge-spec.mjs --out [extensions...]')
+ process.exit(2)
+}
+const out = args[outIndex + 1]
+const deriveMissing = args.includes('--derive-missing-ids')
+const inputs = args.filter((a, i) => i !== outIndex && i !== outIndex + 1 && a !== '--derive-missing-ids')
+
+/**
+ * The operationId QQQ derives for an operation without one (UiApiOperationIds.derive): the method,
+ * then each path segment in camel case, `{param}` as `By{Param}`, relative to /qqq/v1. Only for
+ * documents from servers before UI API 1.6.0 (--derive-missing-ids).
+ */
+function deriveOperationId(method, path) {
+ let id = method.toLowerCase()
+ for (let segment of path.replace(/^\/qqq\/v1/, '').split('/')) {
+ if (!segment) continue
+ if (segment.startsWith('{') && segment.endsWith('}')) {
+ id += 'By'
+ segment = segment.slice(1, -1)
+ }
+ for (const word of segment.split(/[^A-Za-z0-9]+/)) if (word) id += word[0].toUpperCase() + word.slice(1)
+ }
+ return id
+}
+
+async function load(source) {
+ const text = /^https?:\/\//.test(source) ? await (await fetch(source)).text() : await readFile(source, 'utf8')
+ return source.endsWith('.json') ? JSON.parse(text) : parse(text)
+}
+
+function stable(value) {
+ if (Array.isArray(value)) return value.map(stable)
+ if (value && typeof value === 'object') return Object.fromEntries(Object.keys(value).sort().map((k) => [k, stable(value[k])]))
+ return value
+}
+
+const [coreSource, ...extensionSources] = inputs
+const merged = await load(coreSource)
+merged.paths ??= {}
+merged.components ??= {}
+merged.components.schemas ??= {}
+merged.tags ??= []
+const extensions = []
+
+for (const source of extensionSources) {
+ const doc = await load(source)
+ const name = (doc.info?.title ?? '').replace(/^QQQ Middleware API extension: /, '') || source
+ extensions.push({ name, version: doc.info?.version, description: doc.info?.description })
+
+ for (const [path, operations] of Object.entries(doc.paths ?? {})) {
+ const target = (merged.paths[path] ??= {})
+ for (const [method, operation] of Object.entries(operations)) {
+ if (target[method]) throw new Error(`duplicate operation ${method.toUpperCase()} ${path} (from ${name})`)
+ target[method] = operation
+ }
+ }
+
+ for (const [schemaName, schema] of Object.entries(doc.components?.schemas ?? {})) {
+ const existing = merged.components.schemas[schemaName]
+ if (existing && JSON.stringify(stable(existing)) !== JSON.stringify(stable(schema))) {
+ throw new Error(`schema ${schemaName} differs between the core document and ${name}`)
+ }
+ merged.components.schemas[schemaName] = schema
+ }
+
+ for (const tag of doc.tags ?? []) {
+ if (!merged.tags.some((t) => t.name === tag.name)) merged.tags.push(tag)
+ }
+}
+
+const operationIds = new Map()
+for (const [path, operations] of Object.entries(merged.paths)) {
+ for (const [method, operation] of Object.entries(operations)) {
+ if (!operation.operationId && deriveMissing) operation.operationId = deriveOperationId(method, path)
+ const id = operation.operationId
+ if (!id) throw new Error(`no operationId: ${method.toUpperCase()} ${path}`)
+ if (operationIds.has(id)) throw new Error(`duplicate operationId ${id}: ${operationIds.get(id)} and ${method.toUpperCase()} ${path}`)
+ operationIds.set(id, `${method.toUpperCase()} ${path}`)
+ }
+}
+
+merged.info['x-qqq-extensions'] = extensions
+await writeFile(out, JSON.stringify(merged, null, 2) + '\n')
+console.log(`merged ${1 + extensionSources.length} documents: ${Object.keys(merged.paths).length} paths, ${operationIds.size} operations -> ${out}`)
diff --git a/tsconfig.base.json b/tsconfig.base.json
new file mode 100644
index 0000000..a42bb05
--- /dev/null
+++ b/tsconfig.base.json
@@ -0,0 +1,13 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "strict": true,
+ "declaration": true,
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true
+ }
+}