Download OpenAPI specification:
Public HTTP surface of Auto Ontology, served by the Next.js route handlers. Generated by pnpm openapi — do not edit by hand.
List every acronym, newest first.
With ?name=, the route answers { exists } instead of listing — the create
form uses it to pre-check the unique constraint before submitting.
| name | string When given, the route answers the existence check instead of listing. |
{- "exists": true
}Create an acronym: the term plus the expansion the agent should read it as.
name must be unique; description is optional and defaults to empty.
name is unique across the instance.
| name required | string |
| description | string |
{- "name": "string",
- "description": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update an acronym's name or description.
Both fields are optional and only the ones present in the body are written, so a partial body leaves the rest of the record untouched.
| id required | string Acronym id. |
Both fields are optional; non-string values are ignored.
| name | string |
| description | string |
{- "name": "string",
- "description": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Viewing the analytics report requires the analytics:read permission (admin).
| skip | integer [ -9007199254740991 .. 9007199254740991 ] Rows to skip. Unparseable values fall back to 0. |
| limit | integer [ -9007199254740991 .. 9007199254740991 ] Page size. Omitted returns every row in the window. |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "string",
- "source": "string",
- "question": "string",
- "question_timestamp": "2019-08-24T14:15:22Z",
- "response": "string",
- "response_timestamp": "2019-08-24T14:15:22Z",
- "sql": "string",
- "user": {
- "id": "string",
- "name": "string",
- "email": "string",
- "role": "string"
}
}
], - "total": -9007199254740991
}List the caller's own API tokens.
Metadata only: tokens are stored hashed, so the plaintext value is never returned again after creation. Requires a browser session — an API token may not enumerate tokens.
[- {
- "id": "string",
- "name": "string",
- "start": "string",
- "enabled": true,
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_request": "2019-08-24T14:15:22Z"
}
]Mint a new API token for the caller, carrying the caller's own permissions.
expires_in_days is optional — omitting it mints a non-expiring token, which
is what an unattended script usually wants. The response is the only place the
plaintext token ever appears; it is stored hashed and cannot be shown again.
Requires a browser session — a token may not mint another token.
Omit expires_in_days for a token that never expires.
| name required | string Label shown in the token list. |
| expires_in_days | number [ 1 .. 365 ] |
{- "name": "string",
- "expires_in_days": 1
}{- "id": "string",
- "name": "string",
- "start": "string",
- "enabled": true,
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_request": "2019-08-24T14:15:22Z",
- "token": "string"
}Revoke a token. Deletion is immediate and irreversible — the next request
carrying that token fails to resolve a user and gets a 401. The plugin scopes
the delete to the session user, so id can only ever name the caller's own
token; an id belonging to someone else reads back as "not found".
| id required | string Id of one of the caller’s own tokens. |
{- "id": "string"
}Better Auth's GET surface: session lookup and the SSO callbacks.
Public by design — sign-in and the callback that completes it must both be
reachable without a session. The plugin's own /api/auth/api-key/* routes
are blocked here so /api/api-tokens stays the single way to manage tokens.
| all required | string |
{- "property1": null,
- "property2": null
}Better Auth's POST surface: sign-in, sign-out, and the SSO callbacks.
Public for the same reason GET is — none of it can require a session. The
plugin's own /api/auth/api-key/* management routes are blocked here so
/api/api-tokens stays the single way to mint or revoke a token.
| all required | string |
{- "property1": null,
- "property2": null
}Abort the agent run in flight for a conversation the caller owns.
This is what makes the chat UI's Stop button actually stop the run rather than merely detach the browser from it: an abandoned run keeps the conversation's slot claimed and the next question is rejected with 409. Cancelling ends the run without a final answer, so the persisted user turn keeps no assistant reply. 404 when the conversation does not exist or belongs to someone else.
| conversation_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Conversation whose in-flight run to abort. Must belong to the caller. |
{- "cancelled": true
}Ask a question and stream the answer back as Server-Sent Events.
FastAPI emits the SQL plus the formatted answer first (result), then —
when that answer has an executed result — generates and persists the
chart/table bubble itself and streams it back as its own charts event
before the stream closes. No second request needed from this route or the
browser. Passing conversation_id persists the turn and additionally
requires conversation: ['write']; the route answers 409 while that
conversation already has a run in flight. Omitting it runs the question
statelessly, with no history and no chart step.
SQL plus a formatted answer, streamed as SSE. When the answer has an executed result, the backend also generates and persists a chart (or fallback table) and streams it back on this same connection as its own charts event — no follow-up call needed. Reuse one conversation_id for follow-up turns; an unknown UUID creates a conversation, while an ID owned by another user returns 404. Omitting conversation_id runs the question statelessly, with no history and no chart step.
| question required | string non-empty |
string or null | |
string or null | |
string or null | |
boolean or null |
{- "question": "string",
- "evidence": "string",
- "conversation_id": "cc71b11a-25cd-4c2d-9950-df2cc38e3407",
- "target_db": "string",
- "prediction": true
}{- "detail": "string"
}Reattach to a chat run already in progress, as a Server-Sent Events stream.
A reloaded or reopened tab uses this to follow a run it did not start. It is a
passive observer: it never submits a question and persists nothing, so a
dropped watch connection has no effect on the run or on what gets saved. 400
without conversation_id, 404 when the conversation is not the caller's.
| conversation_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Conversation whose in-flight run to observe. Must belong to the caller. |
datasources.getColumnsForTable — list columns for one table.
| table_id required | string (Table Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": {
- "columns": [
- {
- "column_name": "string",
- "data_type": "string",
- "description": "string",
- "description_certified": true,
- "id": "string",
- "ordinal_position": 0,
- "sample_values": [
- "string"
], - "tags": [
- {
- "id": "string",
- "name": "string"
}
]
}
], - "columns_count": 0,
- "database_name": "string",
- "schema_name": "string",
- "table_name": "string",
- "table_type": "string"
}, - "total": 0
}Turn distinct value scanning on or off instance-wide (admin-only).
Deliberately does NOT trigger a compilation run. The flag is read at the top of each run, so it applies from the next one onward — flipping it is a change of policy, not a request to recompile. Operators who want it applied now can use Reset, which is on the same page.
Rejects a non-boolean enabled rather than coercing it, which is why this
differs from the sibling configuration routes. Those flags are opt-in, so
coercing a malformed value to false lands on their default and is harmless.
This one is opt-out: coercion would silently turn OFF something that is on by
default, so {"enabled": "true"} from a shell client would disable scanning
while reading as if it enabled it.
enabled must be a boolean. This flag is opt-out, so coercing a malformed value would silently turn scanning off.
| enabled required | boolean |
{- "enabled": true
}{- "enabled": true
}Turn PII detection on or off instance-wide (admin-only).
Deliberately does NOT trigger an ingest. The flag is read at the start of each ingest's PII step, so it applies from the next one onward — flipping it is a change of policy, not a request to re-scan. Existing PII tags are left in place.
Rejects a non-boolean enabled rather than coercing it, so
{"enabled": "true"} from a shell client cannot silently disagree with
what the page would show after a save.
enabled must be a boolean. A malformed value is rejected rather than coerced.
| enabled required | boolean |
{- "enabled": true
}{- "enabled": true
}Turn scheduled semantic compilation on or off instance-wide (admin-only).
Enabling also kicks off a compilation run immediately and starts the ingestion service's scheduler, so the change takes effect without a restart. That trigger is best-effort: the setting is still saved if the service is down, and the scheduler picks the flag up on its next boot.
Anything other than true turns the flag off.
| enabled required | boolean |
{- "enabled": true
}{- "enabled": true
}Key/value stored in the configurations table. The text-to-SQL pipeline
reads this same key (see auto_ontology/infra/feature_flags.py) before each
statement it issues, and cancels the statement once it runs this long. An
absent row means 30 seconds, which is also what a backend running without
this frontend uses.
Report the instance-wide SQL query timeout, in seconds.
{- "seconds": -9007199254740991
}Set the instance-wide SQL query timeout (admin-only).
Rejects anything but an in-range integer rather than coercing it: the backend treats an unusable stored value as the default, so a coerced value would be silently ignored while the page showed it as saved.
seconds must be an integer from 1 to 3600.
| seconds required | integer [ 1 .. 3600 ] |
{- "seconds": 1
}{- "seconds": -9007199254740991
}Report whether the instance-wide "Visualize SQL Results" setting is on.
The flag lives under Settings > Agent Settings, stored in the
configurations key/value table. The chat proxy route resolves the value per
request, so a client cannot override it.
{- "enabled": true
}Turn the instance-wide "Visualize SQL Results" setting on or off (admin-only).
Chat resolves the value per request, so the change takes effect on the next question without a client reload. It gates chart generation only — the result table still renders when it is off.
Anything other than true turns the flag off.
| enabled required | boolean |
{- "enabled": true
}{- "enabled": true
}connectionsApi.create — add a connection (admin only; carries credentials).
required | object (Connection) |
{- "connection": { }
}{- "data": {
- "connection": { },
- "database_name": "string"
}
}connectionsApi.delete — remove a connection (admin only).
| database_name required | string (Database Name) Catalog database name, which doubles as the connection's identity. |
{- "data": {
- "connection": { },
- "database_name": "string"
}
}connectionsApi.update — rewrite a connection's settings (admin only).
| database_name required | string (Database Name) Catalog database name, which doubles as the connection's identity. |
required | object (Connection) |
{- "connection": { }
}{- "data": {
- "connection": { },
- "database_name": "string"
}
}connectionsApi.setSsoFederation — toggle "authenticate as signed-in user" on an existing connection (admin only).
| database_name required | string (Database Name) Catalog database name, which doubles as the connection's identity. |
| enabled required | boolean (Enabled) |
{- "enabled": true
}{- "data": {
- "database_name": "string",
- "sso_federation": true
}
}connectionsApi.test — validate a connection config (admin only).
required | object (Connection) |
Replacing (string) or Replacing (null) (Replacing) |
{- "connection": { },
- "replacing": "string"
}{- "schemas": [
- "string"
], - "success": true
}List the caller's own conversations, newest first, without their messages.
Scoped to the authenticated user: a conversation is only ever visible to its owner, so there is no way to list someone else's.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "string",
- "title": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Start a new, empty conversation owned by the caller.
title is optional and defaults to empty. Chat clients usually create the
conversation here first, then pass its id to POST /api/chat/completions.
An omitted title creates the conversation with an empty one.
| title | string |
{- "title": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "string",
- "title": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Delete a conversation and its messages; 404 when it is not the caller's.
Answers 204 with no body. The delete cascades to the conversation's messages.
| id required | string Conversation id. Must belong to the caller; someone else’s id answers 404. |
{- "error": "string"
}Fetch one conversation with its full message history, oldest message first.
Scoped to the caller, so another user's conversation reads as 404 rather than 403 — ownership is not disclosed.
| id required | string Conversation id. Must belong to the caller; someone else’s id answers 404. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "string",
- "title": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "messages": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "conversation_id": "cc71b11a-25cd-4c2d-9950-df2cc38e3407",
- "role": "string",
- "content": "string",
- "sql_code": "string",
- "sql_response": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Rename a conversation the caller owns; 404 when it is not theirs.
| id required | string Conversation id. Must belong to the caller; someone else’s id answers 404. |
Rename the conversation.
| title | string |
{- "title": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "string",
- "title": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Append a message to a conversation the caller owns.
The manual path, for clients that record their own turns; the chat routes
persist their messages themselves via FastAPI, so a normal chat flow never
calls this. Also bumps the conversation's updated_at. 404 when the
conversation does not exist or belongs to someone else.
| id required | string Conversation to append the message to. Must belong to the caller. |
Chat turns are written by POST /api/chat/completions itself; this route is for callers that persist a turn they produced some other way.
| role required | string
|
| content | string |
string or null | |
string or null |
{- "role": "string",
- "content": "string",
- "sql_code": "string",
- "sql_response": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "conversation_id": "cc71b11a-25cd-4c2d-9950-df2cc38e3407",
- "role": "string",
- "content": "string",
- "sql_code": "string",
- "sql_response": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Anyone may list custom analyses; only admins (analysis:manage) may add one.
Query (string) or Query (null) (Query) Case-insensitive substring filter on the analysis name. | |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": [
- {
- "description": "string",
- "id": "string",
- "name": "string",
- "sql": "string"
}
], - "total": 0
}Create a new CustomAnalysis with its Sql node.
Strict insert: input shape is enforced by :class:CustomAnalysisCreate
and the frontend is responsible for trimming and rejecting blank
values before sending. Updating an existing analysis goes through
PUT /custom-analyses/{analysis_id}.
Returns 409 when name or sql is already used by another
CustomAnalysis (both are unique natural keys), and 422 when the SQL
can't be parsed against the current catalog (no recognised tables) —
without those references the analysis would be invisible to
retrieval.
| description required | string (Description) |
| name required | string (Name) non-empty |
| sql required | string (Sql) non-empty |
{- "description": "string",
- "name": "string",
- "sql": "string"
}{- "data": {
- "description": "string",
- "id": "string",
- "name": "string",
- "sql": "string"
}
}Delete a CustomAnalysis (with its Sql node and VDB embedding).
Returns 404 when no CustomAnalysis with analysis_id exists.
On success the deleted {"id": ...} is echoed so the UI can
confirm the targeted record was removed.
| analysis_id required | string (Analysis Id) |
{- "data": {
- "id": "string"
}
}Editing/deleting a custom analysis is admin-only (analysis:manage).
| analysis_id required | string (Analysis Id) |
| description required | string (Description) |
| name required | string (Name) non-empty |
| sql required | string (Sql) non-empty |
{- "description": "string",
- "name": "string",
- "sql": "string"
}{- "data": {
- "description": "string",
- "id": "string",
- "name": "string",
- "sql": "string"
}
}Validating SQL is part of the create/edit flow, so it shares the same analysis:manage permission as POST /custom-analyses.
| sql required | string (Sql) non-empty |
{- "sql": "string"
}{- "data": {
- "sql": "string",
- "valid": true
}
}List every custom prompt: the instance-wide prompt overrides the agent uses.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": "string"
}
]Create a custom prompt from content, which defaults to empty when omitted.
An omitted content creates an empty prompt.
| content | string |
{- "content": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": "string"
}Fetch one custom prompt by id; 404 when no prompt has that id.
| id required | string Custom prompt id. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": "string"
}Update a custom prompt's text. content is the only writable field, and a
body without it leaves the prompt unchanged.
| id required | string Custom prompt id. |
Only content is writable; a non-string value is ignored.
| content | string |
{- "content": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": "string"
}{- "count": 0,
- "data": [
- {
- "description": "string",
- "id": "string",
- "name": "string",
- "num_of_schemas": 0,
- "owner_id": "string",
- "schemas": [
- {
- "description": "string",
- "id": "string",
- "owner_id": "string",
- "schema_name": "string",
- "tables_count": 0
}
]
}
]
}explorationApi.getColumnAttributeExplorationDetails — a ColumnAttribute's own owning Term, for expanding it on the graph.
| attr_id required | string (Attr Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "data": {
- "columns": [
- {
- "data_type": "string",
- "database_id": "string",
- "database_name": "string",
- "description": "string",
- "id": "string",
- "name": "string",
- "relationship_types": [
- "string"
], - "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string"
}
], - "columns_total": 0,
- "term": {
- "description": "string",
- "id": "string",
- "name": "string"
}
}
}explorationApi.getColumnExplorationDetails — the Column's own ColumnAttribute, for expanding it on the graph.
| column_id required | string (Column Id) |
{- "data": {
- "column_attribute": {
- "description": "string",
- "id": "string",
- "name": "string",
- "relationship_type": "string"
}, - "foreign_key_column": {
- "data_type": "string",
- "database_id": "string",
- "database_name": "string",
- "description": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string"
}, - "referencing_columns": [
- {
- "data_type": "string",
- "database_id": "string",
- "database_name": "string",
- "description": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string"
}
], - "sql_queries": [
- {
- "id": "string",
- "sql": "string"
}
]
}
}explorationApi.getEdges — table connections backed by a shared SQL query or a foreign key.
{- "count": 0,
- "data": [
- {
- "foreign_keys": [
- {
- "source_column": "string",
- "source_sample_values": [
- "string"
], - "target_column": "string",
- "target_sample_values": [
- "string"
]
}
], - "queries": [
- "string"
], - "relationship_types": [
- "string"
], - "source": "string",
- "target": "string",
- "via_foreign_key": false
}
]
}explorationApi.getDataExplorationGraph — full data-layer graph ({nodes, links}).
| limit | integer (Limit) >= 1 Default: 500 Max nodes returned when database_id is omitted; always capped at 500. Ignored when database_id is set. |
Database Id (string) or Database Id (null) (Database Id) When set, scope the graph to this database and skip the 500-node cap that applies to the unfiltered catalog. |
{- "data": {
- "links": [
- {
- "foreign_keys": [
- {
- "source_column": "string",
- "source_sample_values": [
- "string"
], - "target_column": "string",
- "target_sample_values": [
- "string"
]
}
], - "queries": [
- "string"
], - "relationship_types": [
- "string"
], - "source": "string",
- "target": "string",
- "via_foreign_key": false
}
], - "nodes": [
- {
- "columns_count": 0,
- "database_id": "string",
- "database_name": "string",
- "description": "string",
- "id": "string",
- "name": "string",
- "relationship_count": 0,
- "schema_id": "string",
- "schema_name": "string",
- "sql_count": 0,
- "table_type": "string",
- "terms_count": 0,
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
]
}
}explorationApi.getRelatedNodes — a page of related Exploration nodes.
| node_id required | string (Node Id) Table id when layer is |
| layer required | string (Layer) Enum: "data" "semantic" Which graph to walk: |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "data": {
- "nodes": [
- {
- "database_id": "string",
- "id": "string",
- "name": "string",
- "relationship_count": 0,
- "schema_id": "string",
- "table_type": "string"
}
], - "total": 0
}
}explorationApi.getSemanticExplorationGraph — full semantic-layer graph ({nodes, links}).
| limit | integer (Limit) >= 1 Default: 500 Max nodes returned when database_id is omitted; always capped at 500. Ignored when database_id is set. |
Database Id (string) or Database Id (null) (Database Id) When set, return every term linked to a table in this database. The 500-node cap that applies to the unfiltered glossary is skipped. |
{- "data": {
- "links": [
- {
- "relationship_types": [
- "string"
], - "source": "string",
- "target": "string"
}
], - "nodes": [
- {
- "column_attributes_count": 0,
- "description": "string",
- "id": "string",
- "name": "string",
- "relationship_count": 0,
- "sql_attributes_count": 0,
- "synonyms": [
- "string"
], - "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
]
}
}explorationApi.getSqlAttributeExplorationDetails — a SqlAttribute's own Sql query and owning Term, for expanding it on the graph.
| attr_id required | string (Attr Id) |
{- "data": {
- "sql": {
- "id": "string",
- "sql": "string"
}, - "term": {
- "description": "string",
- "id": "string",
- "name": "string"
}
}
}explorationApi.getSqlExplorationDetails — the CustomAnalysis, Column, Table and SqlAttribute nodes hanging off this Sql node, for expanding it on the graph.
| sql_id required | string (Sql Id) |
{- "data": {
- "columns": [
- {
- "data_type": "string",
- "database_id": "string",
- "database_name": "string",
- "description": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string"
}
], - "custom_analyses": [
- {
- "description": "string",
- "id": "string",
- "name": "string"
}
], - "sql_attributes": [
- {
- "description": "string",
- "id": "string",
- "name": "string",
- "term_id": "string",
- "term_name": "string"
}
], - "tables": [
- {
- "database_id": "string",
- "database_name": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_type": "string"
}
]
}
}explorationApi.getTableExplorationDetails — columns-adjacent SQL and Term details for one table.
| table_id required | string (Table Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "data": {
- "queries": [
- {
- "id": "string",
- "sql": "string"
}
], - "terms": [
- {
- "description": "string",
- "id": "string",
- "name": "string",
- "relationship_types": [
- "string"
]
}
], - "terms_total": 0
}
}explorationApi.getTableZonesMap — {table_id: [zone, ...]} map.
{- "data": {
- "property1": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
], - "property2": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}explorationApi.getTermExplorationDetails — Tables linked to one term, for expanding it on the graph.
| term_id required | string (Term Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "data": {
- "tables": [
- {
- "database_id": "string",
- "database_name": "string",
- "id": "string",
- "name": "string",
- "relationship_types": [
- "string"
], - "schema_id": "string",
- "schema_name": "string",
- "table_type": "string"
}
], - "tables_total": 0
}
}explorationApi.getSemanticLinkPath — the real hop chain connecting two terms, for highlighting a clicked term↔term edge on the graph.
| term_id required | string (Term Id) |
| other_term_id required | string (Other Term Id) |
{- "data": {
- "hops": [
- {
- "relationship": "string",
- "source": {
- "database_id": "string",
- "database_name": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string",
- "type": "string"
}, - "target": {
- "database_id": "string",
- "database_name": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string",
- "schema_name": "string",
- "table_id": "string",
- "table_name": "string",
- "type": "string"
}
}
]
}
}groupsApi.getAll — list groups. Admin only: each group names its members.
{- "count": 0,
- "data": [
- {
- "color": "string",
- "created": "2019-08-24T14:15:22Z",
- "description": "string",
- "id": "string",
- "name": "string",
- "permissions": [
- "string"
], - "role": "string",
- "roles": [
- {
- "id": "string",
- "name": "string"
}
], - "users": [
- {
- "email": "string",
- "id": "string",
- "name": "string",
- "role": "string"
}
]
}
]
}groupsApi.create — add a group. The identity header is what the backend checks for the admin role, so it has to be the caller this gate just resolved.
| color required | string (Color) |
Description (string) or Description (null) (Description) | |
| name required | string (Name) |
| role required | string (Role) |
| user_ids | Array of strings (User Ids) Default: [] |
{- "color": "string",
- "description": "string",
- "name": "string",
- "role": "string",
- "user_ids": [ ]
}{- "data": {
- "color": "string",
- "created": "2019-08-24T14:15:22Z",
- "description": "string",
- "id": "string",
- "name": "string",
- "permissions": [
- "string"
], - "role": "string",
- "roles": [
- {
- "id": "string",
- "name": "string"
}
], - "users": [
- {
- "email": "string",
- "id": "string",
- "name": "string",
- "role": "string"
}
]
}
}groupsApi — one group. The path is forwarded as-is, so the id stays in the URL.
| group_id required | string (Group Id) |
{- "data": {
- "color": "string",
- "created": "2019-08-24T14:15:22Z",
- "description": "string",
- "id": "string",
- "name": "string",
- "permissions": [
- "string"
], - "role": "string",
- "roles": [
- {
- "id": "string",
- "name": "string"
}
], - "users": [
- {
- "email": "string",
- "id": "string",
- "name": "string",
- "role": "string"
}
]
}
}groupsApi.update — edit a group or replace its members.
| group_id required | string (Group Id) |
Color (string) or Color (null) (Color) | |
Description (string) or Description (null) (Description) | |
Name (string) or Name (null) (Name) | |
Role (string) or Role (null) (Role) | |
Array of User Ids (strings) or User Ids (null) (User Ids) |
{- "color": "string",
- "description": "string",
- "name": "string",
- "role": "string",
- "user_ids": [
- "string"
]
}{- "data": {
- "color": "string",
- "created": "2019-08-24T14:15:22Z",
- "description": "string",
- "id": "string",
- "name": "string",
- "permissions": [
- "string"
], - "role": "string",
- "roles": [
- {
- "id": "string",
- "name": "string"
}
], - "users": [
- {
- "email": "string",
- "id": "string",
- "name": "string",
- "role": "string"
}
]
}
}Liveness/readiness probe for the Next.js tier, unauthenticated by design.
Probes Postgres and answers 200 { status: 'ok' }, or 503
{ status: 'degraded' } carrying the failing check's error detail.
{- "status": "ok",
- "postgres": {
- "status": "ok"
}
}List unused invites (active or expired). Accepted rows are deleted on
redeem, so they never appear here. Active rows include url.
{- "invitations": [
- {
- "id": "string",
- "email": "string",
- "name": "string",
- "role": "admin",
- "kind": "invite",
- "status": "active",
- "expires_at": "string",
- "created_at": "string",
- "url": "string"
}
]
}Create an email-bound invite link. The token is returned in url and kept
while the invite is active so the list can copy it later. No email is sent.
Replaces any unused invite for the same address.
Email-bound invite. No mail is sent; copy url and share it.
| email required | string |
| name | string |
| role required | string Enum: "admin" "viewer" |
{- "email": "string",
- "name": "string",
- "role": "admin"
}{- "url": "string",
- "email": "string",
- "expires_at": "string"
}Permanently remove an unused invitation by id. An active link stops redeeming. Accept already deletes the invite; the user account stays.
| token required | string Invitation id. |
{- "id": "string"
}Redeem an invite: join creates the account, reset updates the existing password. Public — the unguessable token is the credential. One-shot.
| token required | string |
Password for the invited email. A join invite creates the account; a reset invite updates the existing password.
| password required | string [ 8 .. 128 ] characters |
{- "password": "stringst"
}{- "email": "string"
}Password reset for an existing user: mint an invite bound to that account. The user row stays; redeeming the link updates the credential password.
Id of the existing user who should set a new password via invite link.
| userId required | string |
{- "userId": "string"
}{- "url": "string",
- "email": "string",
- "expires_at": "string"
}modelInterchangeApi.exportModel — download the catalog + semantic layer as a YAML file. Admin-only: it can include every connection's schema.
| databases | Array of strings (Databases) |
| format | string (ModelFormat) Default: "auto_ontology" Enum: "auto_ontology" "ossie" Serialisation dialect of an exchanged model document. |
| include_ontology | boolean (Include Ontology) Default: false Apache Ossie only: also export the terms as an Ossie ontology, with a mapping onto the semantic model, as a zip of the three documents. |
{- "databases": [
- "string"
], - "format": "auto_ontology",
- "include_ontology": false
}{- "detail": [
- {
- "ctx": { },
- "input": null,
- "loc": [
- "string"
], - "msg": "string",
- "type": "string"
}
]
}modelInterchangeApi.importModel — upload a native Auto Ontology or Apache Ossie model YAML file and apply it to the catalog + semantic layer. Admin-only: can replace existing data.
| replace | boolean (Replace) Default: true |
| embed | boolean (Embed) Default: true |
File (string) or File (null) (File) |
{- "success": true,
- "summary": { }
}datasources.updateNode — edit mutable properties of a catalog node. The backend authorizes the write against the account role or this node's owner group. Requiring read here admits an owner-group viewer. A column stores no owner, so that viewer is still rejected there.
| node_id required | string (Node Id) Id of any catalog node — a Database, Schema, Table or Column. |
Description (string) or Description (null) (Description) | |
Description Certified (boolean) or Description Certified (null) (Description Certified) | |
Owner Id (string) or Owner Id (null) (Owner Id) | |
Array of Sample Values (strings) or Sample Values (null) (Sample Values) |
{- "description": "string",
- "description_certified": true,
- "owner_id": "string",
- "sample_values": [
- "string"
]
}{- "description": "string",
- "description_certified": true,
- "id": "string",
- "owner_id": "string",
- "sample_values": [
- "string"
]
}ownersApi.list — users and groups a picker can offer as an owner. Readable by anyone who can open the catalog: a viewer has to see who owns a table. The identity goes down so a group's member list is only the caller, when they belong to it.
{- "count": 0,
- "data": [
- {
- "color": "string",
- "id": "string",
- "kind": "string",
- "member_ids": [
- "string"
], - "name": "string",
- "permissions": [
- "string"
]
}
]
}Anyone may list PQL analyses; only admins (analysis:manage) may add one.
Query (string) or Query (null) (Query) Case-insensitive substring filter on the analysis name. | |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": [
- {
- "description": "string",
- "id": "string",
- "name": "string",
- "pql": "string"
}
], - "total": 0
}Create a new PqlAnalysis (verified PQL example) and embed it.
Returns 409 when name or pql is already used by another PqlAnalysis.
The PQL text is stored as-is — it is validated against the prediction graph at
predict time, not here.
| description required | string (Description) |
| name required | string (Name) non-empty |
| pql required | string (Pql) non-empty |
{- "description": "string",
- "name": "string",
- "pql": "string"
}{- "data": {
- "description": "string",
- "id": "string",
- "name": "string",
- "pql": "string"
}
}Editing/deleting a PQL analysis is admin-only (analysis:manage).
| analysis_id required | string (Analysis Id) |
| description required | string (Description) |
| name required | string (Name) non-empty |
| pql required | string (Pql) non-empty |
{- "description": "string",
- "name": "string",
- "pql": "string"
}{- "data": {
- "description": "string",
- "id": "string",
- "name": "string",
- "pql": "string"
}
}Grade how well the semantic layer covers the entities in a free-text
question. Same retrieval capability as chat, so it is gated on
chat: ['use'].
| max_distance | number (Max Distance) > 0 Default: 0.75 Maximum L2 vector distance for a candidate to count (lower score = closer match). |
| question required | string (Question) non-empty |
{- "max_distance": 0.75,
- "question": "string"
}{- "data": {
- "candidates": [
- {
- "attribute": "string",
- "id": "string",
- "label": "string",
- "term": "string"
}
], - "coverage": 0,
- "uncovered_entities": [
- "string"
]
}
}rulesApi.getAll — list rules.
manage rather than the read that guards the tag list: a rule names the
search it replays, so the list of them describes the catalog the way a tag's
own page does. The only screen that asks for it is Settings → Rules, and that
whole section is admin-only already.
withTagAuthors despite the name: it resolves created_by / modified_by in
a { data } envelope, and a rule stores those two columns for the same reason
a tag does — the accounts live in the frontend schema, which the backend has
no model for. Unconditionally, without the ?authors= the tag list gates it
behind: that param exists because the tag picker reads the vocabulary on every
navigation and throws the names away, and nothing reads rules but the one page
that shows an owner on every card.
Query (string) or Query (null) (Query) Case-insensitive substring filter on the rule name or on the name of a tag it applies. | |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": [
- {
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "filters": {
- "description": false,
- "objects": [
- "string"
], - "synonyms": true
}, - "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "search_term": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "text_match_option": "string"
}
], - "total": 0
}rulesApi.create — save a rule (admin only).
Guarded like creating a tag rather than like applying one: a rule labels everything its search matches, and goes on labelling whatever matches later, so it curates the vocabulary's reach rather than putting one existing tag on one object.
The identity goes with it because the backend attributes the rule to whoever
saved it — created_by — and proxyToBackend forwards nothing from the
incoming request. ctx.user is the resolved caller, so the id the backend
trusts is the one this route authenticated.
object (GlobalSearchFilters) What a query is matched against, and which kinds of object it may hit. Two flags widen the match beyond an object's name: Their defaults differ, which is deliberate rather than an oversight.
| |
| name required | string (Name) |
| search_term required | string (Search Term) |
required | Array of objects (Tags) |
| text_match_option | string (Text Match Option) Default: "contains" |
{- "filters": {
- "data": [
- "string"
], - "description": false,
- "objects": [
- "string"
], - "synonyms": true,
- "tags": [
- "string"
]
}, - "name": "string",
- "search_term": "string",
- "tags": [
- {
- "id": "string"
}
], - "text_match_option": "contains"
}{- "data": {
- "id": "string"
}
}rulesApi.delete — remove a rule, and with it the tags it applied unless
?keep_tags=true says to leave them (admin only). tag: ['manage'] rather
than the catalog: ['edit'] that guards applying a single tag: this un-tags
every object the rule matched in one request, and can remove a tag from the
vocabulary outright when the rule was the whole of what used it — a change to
the vocabulary rather than an edit of any one object.
No identity forwarded: nothing survives the delete to record an actor on.
| rule_id required | string (Rule Id) |
| keep_tags | boolean (Keep Tags) Default: false Leave the tags the rule applied on their objects, attributed to whoever wrote the rule, instead of removing them with the rule. |
{- "data": {
- "id": "string"
}
}rulesApi.update — rename a rule (admin only).
The identity goes with it, as it does with the create, but for the other
column: created_by is left alone so the rule stays attributed to whoever
saved it, and modified_by records who renamed it — which is what the
information card reads to say who last edited the rule.
| rule_id required | string (Rule Id) |
| name required | string (Name) |
{- "name": "string"
}{- "data": {
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "filters": {
- "description": false,
- "objects": [
- "string"
], - "synonyms": true
}, - "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "search_term": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "text_match_option": "string"
}
}datasources.getSchemasForDatabase — list schemas for one database.
| db_id required | string (Db Id) |
{- "schemas": [
- {
- "description": "string",
- "id": "string",
- "owner_id": "string",
- "schema_name": "string",
- "tables_count": 0
}
], - "schemas_count": 0
}Fulltext global search across catalog and semantic nodes.
Requires at least two characters after trimming. contains is the only
match option. Results are capped at 200 and ranked so names that contain
every token sort first, then Terms an alias matched.
filters.synonyms turns that alias matching off, which drops the Terms
reached only by one and empties the synonyms reported on every hit --
with it off, no alias caused a hit, so there is none to name.
filters.tags narrows to the objects carrying one of those tags, or --
for the untagged sentinel among them -- carrying none. Labels a rule
applied count the same as labels applied by hand.
filters.data narrows to what lives under the given databases and
schemas, which leaves Tables, Views and Columns and nothing else.
object (GlobalSearchFilters) What a query is matched against, and which kinds of object it may hit. Two flags widen the match beyond an object's name: Their defaults differ, which is deliberate rather than an oversight.
| |
| search_term required | string (Search Term) >= 0 characters |
| text_match_option | string (Text Match Option) Default: "contains" |
{- "filters": {
- "data": [
- "string"
], - "description": false,
- "objects": [
- "string"
], - "synonyms": true,
- "tags": [
- "string"
]
}, - "search_term": "string",
- "text_match_option": "contains"
}{- "count": 0,
- "data": [
- {
- "breadcrumbs": [
- {
- "id": "string",
- "name": "string",
- "type": "string"
}
], - "certified": true,
- "description": "string",
- "id": "string",
- "name": "string",
- "parent_id": "string",
- "synonyms": [
- "string"
], - "table_type": "string",
- "type": "string"
}
]
}Hit counts by type for the same query as /search/global-search.
object (GlobalSearchFilters) What a query is matched against, and which kinds of object it may hit. Two flags widen the match beyond an object's name: Their defaults differ, which is deliberate rather than an oversight.
| |
| search_term required | string (Search Term) >= 0 characters |
| text_match_option | string (Text Match Option) Default: "contains" |
{- "filters": {
- "data": [
- "string"
], - "description": false,
- "objects": [
- "string"
], - "synonyms": true,
- "tags": [
- "string"
]
}, - "search_term": "string",
- "text_match_option": "contains"
}{- "data": {
- "property1": 0,
- "property2": 0
}
}semanticCompilationApi.reset — delete every database's compiled semantic
layer. Destructive, so it sits behind manage rather than the read tier
that may view the toggle.
{- "status": "string"
}Whether the semantic layer has been calculated (any Term exists). The chat page uses this to gate the conversation area when the layer is missing.
{- "calculated": true,
- "last_failure_at": "string",
- "last_success_at": "string",
- "running": true
}Creating a SqlAttribute is a catalog edit and requires catalog:edit, the same permission PATCH /api/nodes/{node_id} uses. A viewer does not have it.
| description required | string (Description) |
| expression required | string (Expression) non-empty |
| name required | string (Name) non-empty |
Owner Id (string) or Owner Id (null) (Owner Id) | |
| source | string (Source) Default: "manual" |
| term_id required | string (Term Id) |
{- "description": "string",
- "expression": "string",
- "name": "string",
- "owner_id": "string",
- "source": "manual",
- "term_id": "string"
}{- "data": {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "database_name": "string",
- "description": "string",
- "description_suggestion": "string",
- "expression": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "owner_id": "string",
- "source": "string",
- "sql": "string",
- "sql_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_id": "string",
- "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}sqlAttributesApi.get — fetch one SqlAttribute node, with the account behind created_by / modified_by so the side panel can name them.
| attr_id required | string (Attr Id) |
{- "data": {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "database_name": "string",
- "description": "string",
- "description_suggestion": "string",
- "expression": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "owner_id": "string",
- "source": "string",
- "sql": "string",
- "sql_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_id": "string",
- "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}Patch name, description, or certification. The account role authorizes the write. The term owner shown beside the attribute does not grant it.
| attr_id required | string (Attr Id) |
Certified (boolean) or Certified (null) (Certified) | |
Description (string) or Description (null) (Description) | |
Name (string) or Name (null) (Name) | |
Owner Id (string) or Owner Id (null) (Owner Id) |
{- "certified": true,
- "description": "string",
- "name": "string",
- "owner_id": "string"
}{- "data": {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "database_name": "string",
- "description": "string",
- "description_suggestion": "string",
- "expression": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "owner_id": "string",
- "source": "string",
- "sql": "string",
- "sql_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_id": "string",
- "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}, - "term_certification": "string"
}Replace a SqlAttribute's SQL. The page shows the term's owner. The account role authorizes the write, the same way a column attribute edit does.
| attr_id required | string (Attr Id) |
| description required | string (Description) |
| expression required | string (Expression) non-empty |
| name required | string (Name) non-empty |
| source | string (Source) Default: "manual" |
| term_id required | string (Term Id) |
{- "description": "string",
- "expression": "string",
- "name": "string",
- "source": "manual",
- "term_id": "string"
}{- "data": {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "database_name": "string",
- "description": "string",
- "description_suggestion": "string",
- "expression": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "owner_id": "string",
- "source": "string",
- "sql": "string",
- "sql_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_id": "string",
- "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}LLM-assisted description suggestion, offered from the SqlAttribute edit flow. The account role must allow a catalog edit, the same way editing the attribute does. The generated text is cached on the attribute, so the caller's identity goes with the request.
| attr_id required | string (Attr Id) |
{- "data": "string"
}Validate a SQL expression without writing it. Catalog read is enough. Creating an attribute and saving one both require catalog:edit.
Attribute Id (string) or Attribute Id (null) (Attribute Id) | |
| expression required | string (Expression) non-empty |
Term Id (string) or Term Id (null) (Term Id) |
{- "attribute_id": "string",
- "expression": "string",
- "term_id": "string"
}{- "data": {
- "expression": "string",
- "valid": true
}
}Resolve an OIDC issuer's discovery document, admin-only.
The document is fetched server-side and relayed as the endpoints the SSO registration form needs.
Resolving the endpoints here (instead of letting Better Auth's SSO plugin
auto-discover from the issuer) lets us register providers with
skipDiscovery: true. For public IdPs that path requires no trustedOrigins
entry, so admins can add any provider without per-provider config.
Gated on sso:manage (admin) — it's an outbound fetch proxy.
| issuer required | string HTTPS issuer URL; |
{- "issuer": "string",
- "authorization_endpoint": "string",
- "token_endpoint": "string",
- "userinfo_endpoint": "string",
- "jwks_uri": "string",
- "discovery_endpoint": "string"
}Public list of registered SSO providers, carrying no secrets.
The login page reads it to decide whether to show the "Sign in with SSO" option, so it has to answer before anyone is authenticated.
{- "providers": [
- {
- "provider_id": "string",
- "issuer": "string",
- "domain": "string"
}
]
}datasources.getTablesForSchema — list tables for one schema.
| schema_id required | string (Schema Id) |
Database Name (string) or Database Name (null) (Database Name) Accepted for API compatibility and ignored — schema ids are globally unique, so the database is already implied. |
{- "count": 0,
- "data": [
- {
- "columns_count": 0,
- "database_name": "string",
- "description": "string",
- "description_certified": true,
- "id": "string",
- "name": "string",
- "owner_id": "string",
- "schema_name": "string",
- "sql_count": 0,
- "table_type": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "terms_count": 0
}
]
}termsApi.list — one page of Terms and their per-card count breakdowns.
skip/limit pass straight through.
Query (string) or Query (null) (Query) Case-insensitive substring filter on the term name. | |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "column_attribute_counts": [
- {
- "count": 0,
- "term_id": "string"
}
], - "related_counts": [
- {
- "count": 0,
- "term_id": "string"
}
], - "sql_attribute_counts": [
- {
- "count": 0,
- "term_id": "string"
}
], - "terms": [
- {
- "certification": "string",
- "description": "string",
- "description_certified": true,
- "id": "string",
- "name": "string",
- "name_certified": true,
- "owner_id": "string",
- "schema_names": [
- "string"
], - "synonyms": [
- "string"
], - "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
], - "total": 0
}termsApi.getById — fetch one Term node. Authors are resolved here so Last Modified can name the person who saved it.
| term_id required | string (Term Id) |
{- "data": {
- "certification": "string",
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "description": "string",
- "description_certified": true,
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "name_certified": true,
- "owner_id": "string",
- "related_terms": [
- {
- "description": "string",
- "id": "string",
- "name": "string"
}
], - "synonyms": [
- "string"
], - "table_count": 0,
- "tables": [
- {
- "db_id": "string",
- "id": "string",
- "name": "string",
- "schema_id": "string"
}
], - "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}The backend authorizes the write against either the account role or this term's owner group. Requiring read here admits authenticated owner-group viewers without granting them writes to terms owned by anyone else.
| term_id required | string (Term Id) |
Description (string) or Description (null) (Description) | |
Description Certified (boolean) or Description Certified (null) (Description Certified) | |
Name (string) or Name (null) (Name) | |
Name Certified (boolean) or Name Certified (null) (Name Certified) | |
Owner Id (string) or Owner Id (null) (Owner Id) |
{- "description": "string",
- "description_certified": true,
- "name": "string",
- "name_certified": true,
- "owner_id": "string"
}{- "data": {
- "certification": "string",
- "description": "string",
- "description_certified": true,
- "id": "string",
- "name": "string",
- "name_certified": true,
- "owner_id": "string",
- "synonyms": [
- "string"
], - "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
}termsApi.getColumnAttributes — ColumnAttribute nodes for one term (with primary/referenced columns). Authors ride along so the side panel can name who last edited each attribute.
| term_id required | string (Term Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": [
- {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "datatype": "string",
- "description": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "primary_column": {
- "column_name": "string",
- "db_id": "string",
- "id": "string",
- "schema_id": "string",
- "table_id": "string",
- "table_name": "string"
}, - "referenced_columns": [
- {
- "column_name": "string",
- "db_id": "string",
- "id": "string",
- "schema_id": "string",
- "table_id": "string",
- "table_name": "string"
}
], - "sample_values": [
- "string"
], - "source_column": "string",
- "table_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
], - "total": 0
}Updating a ColumnAttribute changes only name/description; backend refreshes the corresponding semantic VDB embedding.
| term_id required | string (Term Id) |
| attr_id required | string (Attr Id) ColumnAttribute id, not a SqlAttribute id. |
Certified (boolean) or Certified (null) (Certified) | |
Description (string) or Description (null) (Description) | |
Name (string) or Name (null) (Name) | |
Array of Sample Values (strings) or Sample Values (null) (Sample Values) |
{- "certified": true,
- "description": "string",
- "name": "string",
- "sample_values": [
- "string"
]
}{- "data": {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "datatype": "string",
- "description": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "primary_column": {
- "column_name": "string",
- "db_id": "string",
- "id": "string",
- "schema_id": "string",
- "table_id": "string",
- "table_name": "string"
}, - "referenced_columns": [
- {
- "column_name": "string",
- "db_id": "string",
- "id": "string",
- "schema_id": "string",
- "table_id": "string",
- "table_name": "string"
}
], - "sample_values": [
- "string"
], - "source_column": "string",
- "table_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}, - "term_certification": "string"
}termsApi.getSqlAttributes — SqlAttribute nodes for one term.
| term_id required | string (Term Id) |
| skip | integer (Skip) >= 0 Default: 0 Rows to skip before the page starts. |
Limit (integer) or Limit (null) (Limit) Page size, at most 100. Omit to return every matching row in one response. |
{- "count": 0,
- "data": [
- {
- "certified": true,
- "created": "2019-08-24T14:15:22Z",
- "created_by": "string",
- "database_name": "string",
- "description": "string",
- "description_suggestion": "string",
- "expression": "string",
- "id": "string",
- "modified": "2019-08-24T14:15:22Z",
- "modified_by": "string",
- "name": "string",
- "owner_id": "string",
- "source": "string",
- "sql": "string",
- "sql_id": "string",
- "tags": [
- {
- "id": "string",
- "name": "string"
}
], - "term_id": "string",
- "term_name": "string",
- "zones": [
- {
- "color": "string",
- "enabled": true,
- "id": "string",
- "name": "string"
}
]
}
], - "total": 0
}zonesApi.getAll — list zones (viewable by all).
| uid required | string (Uid) Requesting user id |
{- "count": 0,
- "data": [
- {
- "color": "string",
- "description": "string",
- "enabled": true,
- "id": "string",
- "items": [
- {
- "id": "string",
- "label": "string",
- "name": "string"
}
], - "label": "string",
- "name": "string"
}
]
}zonesApi.create — add a zone (admin only).
| color required | string (Color) |
| created_by required | string (Created By) |
Description (string) or Description (null) (Description) | |
| items required | Array of strings (Items) |
| name required | string (Name) |
{- "color": "string",
- "created_by": "string",
- "description": "string",
- "items": [
- "string"
], - "name": "string"
}{- "data": {
- "color": "string",
- "description": "string",
- "enabled": true,
- "id": "string",
- "items": [
- {
- "id": "string",
- "label": "string",
- "name": "string"
}
], - "label": "string",
- "name": "string"
}
}zonesApi.getById — fetch one zone (viewable by all).
| zone_id required | string (Zone Id) |
| uid required | string (Uid) Requesting user id |
{- "data": {
- "color": "string",
- "description": "string",
- "enabled": true,
- "id": "string",
- "items": [
- {
- "id": "string",
- "label": "string",
- "name": "string"
}
], - "label": "string",
- "name": "string"
}
}zonesApi.update — edit a zone (admin only).
| zone_id required | string (Zone Id) |
Color (string) or Color (null) (Color) | |
Description (string) or Description (null) (Description) | |
Array of Items (strings) or Items (null) (Items) | |
Name (string) or Name (null) (Name) |
{- "color": "string",
- "description": "string",
- "items": [
- "string"
], - "name": "string"
}{- "data": {
- "color": "string",
- "description": "string",
- "enabled": true,
- "id": "string",
- "items": [
- {
- "id": "string",
- "label": "string",
- "name": "string"
}
], - "label": "string",
- "name": "string"
}
}zonesApi.setEnabled — enable/disable a zone (admin only).
| zone_id required | string (Zone Id) |
| admin_uid required | string (Admin Uid) Admin user id performing the request |
| enabled required | boolean (Enabled) |
{- "enabled": true
}{- "data": {
- "color": "string",
- "description": "string",
- "enabled": true,
- "id": "string",
- "items": [
- {
- "id": "string",
- "label": "string",
- "name": "string"
}
], - "label": "string",
- "name": "string"
}
}