Auto Ontology API (1.1.0)

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.

acronyms

List every acronym, newest first.

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.

Authorizations:
ApiToken
query Parameters
name
string

When given, the route answers the existence check instead of listing.

Responses

Response samples

Content type
application/json
{
  • "exists": true
}

Create an acronym: the term plus the expansion the agent should read it as.

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

name is unique across the instance.

name
required
string
description
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "description": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete an acronym permanently.

Delete an acronym permanently. Answers 204 with no body.

Authorizations:
ApiToken
path Parameters
id
required
string

Acronym id.

Responses

Update an acronym's name or description.

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.

Authorizations:
ApiToken
path Parameters
id
required
string

Acronym id.

Request Body schema: application/json
required

Both fields are optional; non-string values are ignored.

name
string
description
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "string",
  • "description": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

analytics

Viewing the analytics report requires the analytics:read permission (admin).

Viewing the analytics report requires the analytics:read permission (admin).

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "total": -9007199254740991
}

api-tokens

List the caller's own API tokens.

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.

Authorizations:
SessionCookie

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Mint a new API token for the caller, carrying the caller's own permissions.

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.

Authorizations:
SessionCookie
Request Body schema: application/json
required

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 ]

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "expires_in_days": 1
}

Response samples

Content type
application/json
{
  • "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.

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".

Authorizations:
SessionCookie
path Parameters
id
required
string

Id of one of the caller’s own tokens.

Responses

Response samples

Content type
application/json
{
  • "id": "string"
}

auth

Better Auth's GET surface: session lookup and the SSO callbacks.

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.

path Parameters
all
required
string

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Better Auth's POST surface: sign-in, sign-out, and the SSO callbacks.

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.

path Parameters
all
required
string

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

chat

Abort the agent run in flight for a conversation the caller owns.

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.

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "cancelled": true
}

Ask a question and stream the answer back as Server-Sent Events.

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

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

Responses

Request samples

Content type
application/json
{
  • "question": "string",
  • "evidence": "string",
  • "conversation_id": "cc71b11a-25cd-4c2d-9950-df2cc38e3407",
  • "target_db": "string",
  • "prediction": true
}

Response samples

Content type
application/json
{
  • "detail": "string"
}

Reattach to a chat run already in progress, as a Server-Sent Events stream.

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.

Authorizations:
ApiToken
query Parameters
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.

Responses

columns

List Columns By Table

datasources.getColumnsForTable — list columns for one table.

Authorizations:
ApiToken
path Parameters
table_id
required
string (Table Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": {
    },
  • "total": 0
}

configurations

Report whether compilation scans low-cardinality columns for distinct values.

Report whether compilation scans low-cardinality columns for distinct values.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

Turn distinct value scanning on or off instance-wide (admin-only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

enabled must be a boolean. This flag is opt-out, so coercing a malformed value would silently turn scanning off.

enabled
required
boolean

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "enabled": true
}

Report whether ingest classifies catalog columns as PII.

Report whether ingest classifies catalog columns as PII.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

Turn PII detection on or off instance-wide (admin-only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

enabled must be a boolean. A malformed value is rejected rather than coerced.

enabled
required
boolean

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "enabled": true
}

Report whether scheduled semantic compilation is enabled instance-wide.

Report whether scheduled semantic compilation is enabled instance-wide.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

Turn scheduled semantic compilation on or off instance-wide (admin-only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

Anything other than true turns the flag off.

enabled
required
boolean

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "enabled": true
}

Key/value stored in the `configurations` table.

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "seconds": -9007199254740991
}

Set the instance-wide SQL query timeout (admin-only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

seconds must be an integer from 1 to 3600.

seconds
required
integer [ 1 .. 3600 ]

Responses

Request samples

Content type
application/json
{
  • "seconds": 1
}

Response samples

Content type
application/json
{
  • "seconds": -9007199254740991
}

Report whether the instance-wide "Visualize SQL Results" setting is on.

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

Turn the instance-wide "Visualize SQL Results" setting on or off (admin-only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

Anything other than true turns the flag off.

enabled
required
boolean

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "enabled": true
}

connections

List Connections

connectionsApi.getAll — list connections (viewable by all).

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

Create Connection

connectionsApi.create — add a connection (admin only; carries credentials).

Authorizations:
ApiToken
Request Body schema: application/json
required
required
object (Connection)

Responses

Request samples

Content type
application/json
{
  • "connection": { }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Connection

connectionsApi.delete — remove a connection (admin only).

Authorizations:
ApiToken
path Parameters
database_name
required
string (Database Name)

Catalog database name, which doubles as the connection's identity.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Connection

connectionsApi.update — rewrite a connection's settings (admin only).

Authorizations:
ApiToken
path Parameters
database_name
required
string (Database Name)

Catalog database name, which doubles as the connection's identity.

Request Body schema: application/json
required
required
object (Connection)

Responses

Request samples

Content type
application/json
{
  • "connection": { }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Set Sso Federation

connectionsApi.setSsoFederation — toggle "authenticate as signed-in user" on an existing connection (admin only).

Authorizations:
ApiToken
path Parameters
database_name
required
string (Database Name)

Catalog database name, which doubles as the connection's identity.

Request Body schema: application/json
required
enabled
required
boolean (Enabled)

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Is Env Source

connectionsApi.isEnvSource — whether connections come from env config.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
true

Test Connection

connectionsApi.test — validate a connection config (admin only).

Authorizations:
ApiToken
Request Body schema: application/json
required
required
object (Connection)
Replacing (string) or Replacing (null) (Replacing)

Responses

Request samples

Content type
application/json
{
  • "connection": { },
  • "replacing": "string"
}

Response samples

Content type
application/json
{
  • "schemas": [
    ],
  • "success": true
}

conversations

List the caller's own conversations, newest first, without their messages.

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Start a new, empty conversation owned by the caller.

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

An omitted title creates the conversation with an empty one.

title
string

Responses

Request samples

Content type
application/json
{
  • "title": "string"
}

Response samples

Content type
application/json
{
  • "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.

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.

Authorizations:
ApiToken
path Parameters
id
required
string

Conversation id. Must belong to the caller; someone else’s id answers 404.

Responses

Response samples

Content type
application/json
{
  • "error": "string"
}

Fetch one conversation with its full message history, oldest message first.

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.

Authorizations:
ApiToken
path Parameters
id
required
string

Conversation id. Must belong to the caller; someone else’s id answers 404.

Responses

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Rename a conversation the caller owns; 404 when it is not theirs.

Rename a conversation the caller owns; 404 when it is not theirs.

Authorizations:
ApiToken
path Parameters
id
required
string

Conversation id. Must belong to the caller; someone else’s id answers 404.

Request Body schema: application/json
required

Rename the conversation.

title
string

Responses

Request samples

Content type
application/json
{
  • "title": "string"
}

Response samples

Content type
application/json
{
  • "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.

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.

Authorizations:
ApiToken
path Parameters
id
required
string

Conversation to append the message to. Must belong to the caller.

Request Body schema: application/json
required

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

user or assistant.

content
string
string or null
string or null

Responses

Request samples

Content type
application/json
{
  • "role": "string",
  • "content": "string",
  • "sql_code": "string",
  • "sql_response": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

custom-analyses

List Custom Analyses

Anyone may list custom analyses; only admins (analysis:manage) may add one.

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

Create Custom Analysis

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.

Authorizations:
ApiToken
Request Body schema: application/json
required
description
required
string (Description)
name
required
string (Name) non-empty
sql
required
string (Sql) non-empty

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "sql": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Custom Analysis

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.

Authorizations:
ApiToken
path Parameters
analysis_id
required
string (Analysis Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Custom Analysis

Editing/deleting a custom analysis is admin-only (analysis:manage).

Authorizations:
ApiToken
path Parameters
analysis_id
required
string (Analysis Id)
Request Body schema: application/json
required
description
required
string (Description)
name
required
string (Name) non-empty
sql
required
string (Sql) non-empty

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "sql": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Validate Custom Analysis Sql

Validating SQL is part of the create/edit flow, so it shares the same analysis:manage permission as POST /custom-analyses.

Authorizations:
ApiToken
Request Body schema: application/json
required
sql
required
string (Sql) non-empty

Responses

Request samples

Content type
application/json
{
  • "sql": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

custom-prompts

List every custom prompt: the instance-wide prompt overrides the agent uses.

List every custom prompt: the instance-wide prompt overrides the agent uses.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a custom prompt from `content`, which defaults to empty when omitted.

Create a custom prompt from content, which defaults to empty when omitted.

Authorizations:
ApiToken
Request Body schema: application/json
required

An omitted content creates an empty prompt.

content
string

Responses

Request samples

Content type
application/json
{
  • "content": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "content": "string"
}

Delete a custom prompt permanently.

Delete a custom prompt permanently. Answers 204 with no body.

Authorizations:
ApiToken
path Parameters
id
required
string

Custom prompt id.

Responses

Fetch one custom prompt by id; 404 when no prompt has that id.

Fetch one custom prompt by id; 404 when no prompt has that id.

Authorizations:
ApiToken
path Parameters
id
required
string

Custom prompt id.

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "content": "string"
}

Update a custom prompt's text.

Update a custom prompt's text. content is the only writable field, and a body without it leaves the prompt unchanged.

Authorizations:
ApiToken
path Parameters
id
required
string

Custom prompt id.

Request Body schema: application/json
required

Only content is writable; a non-string value is ignored.

content
string

Responses

Request samples

Content type
application/json
{
  • "content": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "content": "string"
}

datasources

List Databases

datasources.getDBs — list databases.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

exploration

Get Column Attribute Exploration Details

explorationApi.getColumnAttributeExplorationDetails — a ColumnAttribute's own owning Term, for expanding it on the graph.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Column Exploration Details

explorationApi.getColumnExplorationDetails — the Column's own ColumnAttribute, for expanding it on the graph.

Authorizations:
ApiToken
path Parameters
column_id
required
string (Column Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

List Data Exploration Edges

explorationApi.getEdges — table connections backed by a shared SQL query or a foreign key.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

Get Data Exploration Graph

explorationApi.getDataExplorationGraph — full data-layer graph ({nodes, links}).

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Exploration Node Relationships

explorationApi.getRelatedNodes — a page of related Exploration nodes.

Authorizations:
ApiToken
path Parameters
node_id
required
string (Node Id)

Table id when layer is data, Term id when it is semantic.

query Parameters
layer
required
string (Layer)
Enum: "data" "semantic"

Which graph to walk: data relates tables sharing a SQL query or a foreign key, semantic relates terms sharing a table.

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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Semantic Exploration Graph

explorationApi.getSemanticExplorationGraph — full semantic-layer graph ({nodes, links}).

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Sql Attribute Exploration Details

explorationApi.getSqlAttributeExplorationDetails — a SqlAttribute's own Sql query and owning Term, for expanding it on the graph.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Sql Exploration Details

explorationApi.getSqlExplorationDetails — the CustomAnalysis, Column, Table and SqlAttribute nodes hanging off this Sql node, for expanding it on the graph.

Authorizations:
ApiToken
path Parameters
sql_id
required
string (Sql Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Table Exploration Details

explorationApi.getTableExplorationDetails — columns-adjacent SQL and Term details for one table.

Authorizations:
ApiToken
path Parameters
table_id
required
string (Table Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

List Table Zones

explorationApi.getTableZonesMap — {table_id: [zone, ...]} map.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Term Exploration Details

explorationApi.getTermExplorationDetails — Tables linked to one term, for expanding it on the graph.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Semantic Link Path

explorationApi.getSemanticLinkPath — the real hop chain connecting two terms, for highlighting a clicked term↔term edge on the graph.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
other_term_id
required
string (Other Term Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

groups

groupsApi.getAll — list groups.

groupsApi.getAll — list groups. Admin only: each group names its members.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

groupsApi.create — add a group.

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.

Authorizations:
ApiToken
Request Body schema: application/json
required
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: []

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "description": "string",
  • "name": "string",
  • "role": "string",
  • "user_ids": [ ]
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Group

groupsApi.delete — remove a group and its membership.

Authorizations:
ApiToken
path Parameters
group_id
required
string (Group Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

groupsApi — one group.

groupsApi — one group. The path is forwarded as-is, so the id stays in the URL.

Authorizations:
ApiToken
path Parameters
group_id
required
string (Group Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Group

groupsApi.update — edit a group or replace its members.

Authorizations:
ApiToken
path Parameters
group_id
required
string (Group Id)
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "description": "string",
  • "name": "string",
  • "role": "string",
  • "user_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

health

Liveness/readiness probe for the Next.js tier, unauthenticated by design.

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.

Responses

Response samples

Content type
application/json
{
  • "status": "ok",
  • "postgres": {
    }
}

invitations

List unused invites (active or expired).

List unused invites (active or expired). Accepted rows are deleted on redeem, so they never appear here. Active rows include url.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "invitations": [
    ]
}

Create an email-bound invite link.

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.

Authorizations:
ApiToken
Request Body schema: application/json
required

Email-bound invite. No mail is sent; copy url and share it.

email
required
string
name
string
role
required
string
Enum: "admin" "viewer"

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "name": "string",
  • "role": "admin"
}

Response samples

Content type
application/json
{
  • "url": "string",
  • "email": "string",
  • "expires_at": "string"
}

Permanently remove an unused invitation by id.

Permanently remove an unused invitation by id. An active link stops redeeming. Accept already deletes the invite; the user account stays.

Authorizations:
ApiToken
path Parameters
token
required
string

Invitation id.

Responses

Response samples

Content type
application/json
{
  • "id": "string"
}

Redeem an invite: join creates the account, reset updates the existing password.

Redeem an invite: join creates the account, reset updates the existing password. Public — the unguessable token is the credential. One-shot.

path Parameters
token
required
string
Request Body schema: application/json
required

Password for the invited email. A join invite creates the account; a reset invite updates the existing password.

password
required
string [ 8 .. 128 ] characters

Responses

Request samples

Content type
application/json
{
  • "password": "stringst"
}

Response samples

Content type
application/json
{
  • "email": "string"
}

Password reset for an existing user: mint an invite bound to that account.

Password reset for an existing user: mint an invite bound to that account. The user row stays; redeeming the link updates the credential password.

Authorizations:
ApiToken
Request Body schema: application/json
required

Id of the existing user who should set a new password via invite link.

userId
required
string

Responses

Request samples

Content type
application/json
{
  • "userId": "string"
}

Response samples

Content type
application/json
{
  • "url": "string",
  • "email": "string",
  • "expires_at": "string"
}

model

Export Model

modelInterchangeApi.exportModel — download the catalog + semantic layer as a YAML file. Admin-only: it can include every connection's schema.

Authorizations:
ApiToken
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "databases": [
    ],
  • "format": "auto_ontology",
  • "include_ontology": false
}

Response samples

Content type
application/json
{
  • "detail": [
    ]
}

Import Model

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.

Authorizations:
ApiToken
query Parameters
replace
boolean (Replace)
Default: true
embed
boolean (Embed)
Default: true
Request Body schema: multipart/form-data
File (string) or File (null) (File)

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "summary": { }
}

nodes

datasources.updateNode — edit mutable properties of a catalog node.

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.

Authorizations:
ApiToken
path Parameters
node_id
required
string (Node Id)

Id of any catalog node — a Database, Schema, Table or Column.

Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "description_certified": true,
  • "owner_id": "string",
  • "sample_values": [
    ]
}

Response samples

Content type
application/json
Example
{
  • "description": "string",
  • "description_certified": true,
  • "id": "string",
  • "owner_id": "string",
  • "sample_values": [
    ]
}

owners

ownersApi.list — users and groups a picker can offer as an owner.

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

pql-analyses

List Pql Analyses

Anyone may list PQL analyses; only admins (analysis:manage) may add one.

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

Create Pql Analysis

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.

Authorizations:
ApiToken
Request Body schema: application/json
required
description
required
string (Description)
name
required
string (Name) non-empty
pql
required
string (Pql) non-empty

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "pql": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Pql Analysis

Delete a PqlAnalysis (with its VDB embedding).

Returns 404 when no PqlAnalysis with analysis_id exists.

Authorizations:
ApiToken
path Parameters
analysis_id
required
string (Analysis Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Pql Analysis

Editing/deleting a PQL analysis is admin-only (analysis:manage).

Authorizations:
ApiToken
path Parameters
analysis_id
required
string (Analysis Id)
Request Body schema: application/json
required
description
required
string (Description)
name
required
string (Name) non-empty
pql
required
string (Pql) non-empty

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "pql": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

question-entity-coverage

Grade how well the semantic layer covers the entities in a free-text question.

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'].

Authorizations:
ApiToken
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "max_distance": 0.75,
  • "question": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

rules

rulesApi.getAll — list rules.

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.

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

rulesApi.create — save a rule (admin only).

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.

Authorizations:
ApiToken
Request Body schema: application/json
required
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: description adds its description and synonyms adds a Term's aliases.

Their defaults differ, which is deliberate rather than an oversight. description is off because matching prose is the narrower, more surprising behaviour to opt into. synonyms is on because alias matching is what this endpoint did for its whole life before the flag existed, and defaulting it off would quietly take Terms away from every caller that does not send the flag.

objects, tags and data all narrow rather than widen, and None for any of them means no narrowing -- an empty list would otherwise have to mean "nothing", which is not a search anyone asks for.

tags holds tag ids, and may hold UNTAGGED_FILTER_VALUE beside them for the objects carrying no tag at all. Any one of the entries is enough for a hit, so ticking two tags widens the selection within the narrowing. Only five kinds can carry a tag, so a search narrowed to a tag returns no Database, Schema or analysis -- they come back only when the untagged sentinel is present, since a kind that cannot be tagged is untagged.

data holds database ids and schema ids together, and narrows to what lives under them: a row matches if its own schema, or that schema's database, is among them. Only Table, View and Column live anywhere, so this one narrows the result to those three outright -- a Term picked out by an alias is dropped along with the rest.

name
required
string (Name)
search_term
required
string (Search Term)
required
Array of objects (Tags)
text_match_option
string (Text Match Option)
Default: "contains"

Responses

Request samples

Content type
application/json
{
  • "filters": {
    },
  • "name": "string",
  • "search_term": "string",
  • "tags": [
    ],
  • "text_match_option": "contains"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Rule

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.

Authorizations:
ApiToken
path Parameters
rule_id
required
string (Rule Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

rulesApi.update — rename a rule (admin only).

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.

Authorizations:
ApiToken
path Parameters
rule_id
required
string (Rule Id)
Request Body schema: application/json
required
name
required
string (Name)

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

schemas

List Schemas By Database

datasources.getSchemasForDatabase — list schemas for one database.

Authorizations:
ApiToken
path Parameters
db_id
required
string (Db Id)

Responses

Response samples

Content type
application/json
Example
{
  • "schemas": [
    ],
  • "schemas_count": 0
}

search

Post Global Search Count

Hit counts by type for the same query as /search/global-search.

Authorizations:
ApiToken
Request Body schema: application/json
required
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: description adds its description and synonyms adds a Term's aliases.

Their defaults differ, which is deliberate rather than an oversight. description is off because matching prose is the narrower, more surprising behaviour to opt into. synonyms is on because alias matching is what this endpoint did for its whole life before the flag existed, and defaulting it off would quietly take Terms away from every caller that does not send the flag.

objects, tags and data all narrow rather than widen, and None for any of them means no narrowing -- an empty list would otherwise have to mean "nothing", which is not a search anyone asks for.

tags holds tag ids, and may hold UNTAGGED_FILTER_VALUE beside them for the objects carrying no tag at all. Any one of the entries is enough for a hit, so ticking two tags widens the selection within the narrowing. Only five kinds can carry a tag, so a search narrowed to a tag returns no Database, Schema or analysis -- they come back only when the untagged sentinel is present, since a kind that cannot be tagged is untagged.

data holds database ids and schema ids together, and narrows to what lives under them: a row matches if its own schema, or that schema's database, is among them. Only Table, View and Column live anywhere, so this one narrows the result to those three outright -- a Term picked out by an alias is dropped along with the rest.

search_term
required
string (Search Term) >= 0 characters
text_match_option
string (Text Match Option)
Default: "contains"

Responses

Request samples

Content type
application/json
{
  • "filters": {
    },
  • "search_term": "string",
  • "text_match_option": "contains"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

semantic-compilation

semanticCompilationApi.reset — delete every database's compiled semantic layer.

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "status": "string"
}

Whether the semantic layer has been calculated (any Term exists).

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.

Authorizations:
ApiToken

Responses

Response samples

Content type
application/json
{
  • "calculated": true,
  • "last_failure_at": "string",
  • "last_success_at": "string",
  • "running": true
}

sql-attributes

Create Sql Attribute

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.

Authorizations:
ApiToken
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "expression": "string",
  • "name": "string",
  • "owner_id": "string",
  • "source": "manual",
  • "term_id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete a SqlAttribute.

Delete a SqlAttribute. The account role authorizes the delete.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Sql Attribute

sqlAttributesApi.get — fetch one SqlAttribute node, with the account behind created_by / modified_by so the side panel can name them.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Patch name, description, or certification.

Patch name, description, or certification. The account role authorizes the write. The term owner shown beside the attribute does not grant it.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "certified": true,
  • "description": "string",
  • "name": "string",
  • "owner_id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "term_certification": "string"
}

Replace a SqlAttribute's SQL.

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.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "expression": "string",
  • "name": "string",
  • "source": "manual",
  • "term_id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

LLM-assisted description suggestion, offered from the SqlAttribute edit flow.

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.

Authorizations:
ApiToken
path Parameters
attr_id
required
string (Attr Id)

Responses

Response samples

Content type
application/json
{
  • "data": "string"
}

Validate a SQL expression without writing it.

Validate a SQL expression without writing it. Catalog read is enough. Creating an attribute and saving one both require catalog:edit.

Authorizations:
ApiToken
Request Body schema: application/json
required
Attribute Id (string) or Attribute Id (null) (Attribute Id)
expression
required
string (Expression) non-empty
Term Id (string) or Term Id (null) (Term Id)

Responses

Request samples

Content type
application/json
{
  • "attribute_id": "string",
  • "expression": "string",
  • "term_id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

sso-discovery

Resolve an OIDC issuer's discovery document, admin-only.

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.

Authorizations:
ApiToken
query Parameters
issuer
required
string

HTTPS issuer URL; /.well-known/openid-configuration is appended.

Responses

Response samples

Content type
application/json
{
  • "issuer": "string",
  • "authorization_endpoint": "string",
  • "token_endpoint": "string",
  • "userinfo_endpoint": "string",
  • "jwks_uri": "string",
  • "discovery_endpoint": "string"
}

sso-providers

Public list of registered SSO providers, carrying no secrets.

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.

Responses

Response samples

Content type
application/json
{
  • "providers": [
    ]
}

tables

List Tables By Schema

datasources.getTablesForSchema — list tables for one schema.

Authorizations:
ApiToken
path Parameters
schema_id
required
string (Schema Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

tags

tagsApi.getAll — list tags.

tagsApi.getAll — list tags. Viewers too, unlike the rest of this file: the tag picker on every detail page offers the whole vocabulary, and a tag's name and id say nothing about the catalog.

Author names are added only when asked for — see authorsRequested. This is the hottest tag route there is, read on every navigation the picker survives, and the settings page is the only caller with anything to show them in.

Authorizations:
ApiToken
query Parameters
Query (string) or Query (null) (Query)

Case-insensitive substring filter on the tag 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.

authors
string

Resolve created_by / modified_by to the accounts they name, adding created_by_user and modified_by_user beside them. Ignored for a caller who may not manage tags, and left off by default: the tag picker reads this list on every detail page and has nothing to show an author in.

Value: "1"

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

tagsApi.create — add a tag (admin only).

tagsApi.create — add a tag (admin only). The identity goes down so the backend can record who created it, and comes back resolved to a name unconditionally: this answer only ever redraws the row on the settings page, which is the page that shows authors.

Authorizations:
ApiToken
Request Body schema: application/json
required
name
required
string (Name)

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

tagsApi.delete — remove a tag (admin only).

tagsApi.delete — remove a tag (admin only). Nothing survives the delete to record an author on, so no identity is forwarded.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

tagsApi.getById — one tag.

tagsApi.getById — one tag. What it labels is targets/route.ts beside this.

manage rather than the read that guards the tag list: only the settings page asks for a single tag, and that whole section is admin-only already.

Authors on request, by the same rule as the list: this is where the detail view reads who curated the tag, and only the gateway can put names to those ids.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)
query Parameters
authors
string

Resolve the account ids this answer carries to the accounts they name: created_by and modified_by, added beside them as *_user. Off by default, and the detail view asks for it — it shows who curated the tag.

Value: "1"

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

tagsApi.update — rename a tag (admin only).

tagsApi.update — rename a tag (admin only). manage rather than the catalog: ['edit'] the attach routes use: renaming rewrites the vocabulary itself, and the new name reaches every object already carrying the tag.

The identity goes down for the backend's modified_by, and the renamed tag comes back with both authors resolved.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)
Request Body schema: application/json
required
name
required
string (Name)

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

tagsApi.getTargets — one page of the objects a tag labels.

tagsApi.getTargets — one page of the objects a tag labels.

tag: ['manage'], not the catalog: ['edit'] below: this answer names catalog objects and spells out where they sit, and it is not scoped to the caller's zones the way the catalog reads are. Only the tag's settings page asks for it, and that section is admin-only already.

Authors unconditionally, without the ?authors= the tag list gates them behind: the "Tagged By" column is a column of this table rather than an extra a caller may not render, so a page of rows with unresolved ids would be a page with a blank column.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

tagsApi.attach — label an object with an existing tag.

tagsApi.attach — label an object with an existing tag.

The backend checks edit permission against the target's account role or owner group. Catalog read admits an authenticated owner-group viewer to that check without granting writes to targets owned by another user or group.

The identity goes down for the backend's tagged_by, which the tag's page shows in its "Tagged By" column — the one thing distinguishing a label a person applied from one a rule matched.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)
Request Body schema: application/json
required
id
required
string (Id)
type
required
string (TagTargetType)
Enum: "term" "table" "column" "column_attribute" "sql_attribute"

Which of the five things a tag points at.

Used on both sides of tagging: it is the type of a :class:TagItem a tag's page reads, and the type the attach and detach routes validate against — which is what makes an unknown kind a 422 from FastAPI's own validation, listing the five it does accept.

The five strings are also the keys auto_ontology.dal.tags resolves to a tag_target column, and they are spelled out here rather than imported from it: this module is the shape of the API, and pulling a five-string vocabulary out of the DAL made every importer of it load SQLAlchemy and the whole table metadata too. auto_ontology/server/tests/test_tag_target_type.py is what keeps the two spellings identical, since a kind the DAL has no column for would answer 500 rather than the 422 this enum exists to produce.

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "type": "term"
}

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

Detach Tag

tagsApi.detach — the backend applies the same account-role/owner-group check as attach, so an owner-group viewer may reach it with catalog read access.

Authorizations:
ApiToken
path Parameters
tag_id
required
string (Tag Id)
target_type
required
string (TagTargetType)
Enum: "term" "table" "column" "column_attribute" "sql_attribute"

Which of the five things a tag points at.

Used on both sides of tagging: it is the type of a :class:TagItem a tag's page reads, and the type the attach and detach routes validate against — which is what makes an unknown kind a 422 from FastAPI's own validation, listing the five it does accept.

The five strings are also the keys auto_ontology.dal.tags resolves to a tag_target column, and they are spelled out here rather than imported from it: this module is the shape of the API, and pulling a five-string vocabulary out of the DAL made every importer of it load SQLAlchemy and the whole table metadata too. auto_ontology/server/tests/test_tag_target_type.py is what keeps the two spellings identical, since a kind the DAL has no column for would answer 500 rather than the 422 this enum exists to produce.

item_id
required
string (Item Id)

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

terms

termsApi.list — one page of Terms and their per-card count breakdowns.

termsApi.list — one page of Terms and their per-card count breakdowns. skip/limit pass straight through.

Authorizations:
ApiToken
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "column_attribute_counts": [
    ],
  • "related_counts": [
    ],
  • "sql_attribute_counts": [
    ],
  • "terms": [
    ],
  • "total": 0
}

termsApi.getById — fetch one Term node.

termsApi.getById — fetch one Term node. Authors are resolved here so Last Modified can name the person who saved it.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Term

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.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "description_certified": true,
  • "name": "string",
  • "name_certified": true,
  • "owner_id": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

List Term Column Attributes By Id

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.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

Update Column Attribute

Updating a ColumnAttribute changes only name/description; backend refreshes the corresponding semantic VDB embedding.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
attr_id
required
string (Attr Id)

ColumnAttribute id, not a SqlAttribute id.

Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "certified": true,
  • "description": "string",
  • "name": "string",
  • "sample_values": [
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "term_certification": "string"
}

List Term Sql Attributes By Id

termsApi.getSqlAttributes — SqlAttribute nodes for one term.

Authorizations:
ApiToken
path Parameters
term_id
required
string (Term Id)
query Parameters
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.

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ],
  • "total": 0
}

zones

List Zones

zonesApi.getAll — list zones (viewable by all).

Authorizations:
ApiToken
query Parameters
uid
required
string (Uid)

Requesting user id

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "data": [
    ]
}

Create Zone

zonesApi.create — add a zone (admin only).

Authorizations:
ApiToken
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "created_by": "string",
  • "description": "string",
  • "items": [
    ],
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete Zone

zonesApi.delete — remove a zone (admin only).

Authorizations:
ApiToken
path Parameters
zone_id
required
string (Zone Id)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get Zone

zonesApi.getById — fetch one zone (viewable by all).

Authorizations:
ApiToken
path Parameters
zone_id
required
string (Zone Id)
query Parameters
uid
required
string (Uid)

Requesting user id

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update Zone

zonesApi.update — edit a zone (admin only).

Authorizations:
ApiToken
path Parameters
zone_id
required
string (Zone Id)
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "description": "string",
  • "items": [
    ],
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Set Zone Status

zonesApi.setEnabled — enable/disable a zone (admin only).

Authorizations:
ApiToken
path Parameters
zone_id
required
string (Zone Id)
query Parameters
admin_uid
required
string (Admin Uid)

Admin user id performing the request

Request Body schema: application/json
required
enabled
required
boolean (Enabled)

Responses

Request samples

Content type
application/json
{
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "data": {
    }
}