{ "swagger": "2.0", "info": { "description": "API for interacting with Marmot", "title": "Marmot API", "contact": {}, "license": { "name": "MIT", "url": "https://opensource.org/license/MIT" }, "version": "0.1" }, "paths": { "/api/v1/admin/search/reindex": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Check whether a search reindex is currently running and whether Elasticsearch is configured.", "produces": [ "application/json" ], "tags": [ "admin" ], "summary": "Get reindex status", "operationId": "getAdminSearchReindex", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ReindexStatusResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Trigger a full reindex from PostgreSQL to Elasticsearch. The reindex runs asynchronously in the background. Only one reindex can run at a time.", "produces": [ "application/json" ], "tags": [ "admin" ], "summary": "Start search reindex", "operationId": "postAdminSearchReindex", "responses": { "202": { "description": "Accepted", "schema": { "$ref": "#/definitions/ReindexAcceptedResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "503": { "description": "Service Unavailable", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/agents/runs": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "agents" ], "summary": "Record agent run", "operationId": "postAgentsRuns", "parameters": [ { "description": "Agent run record", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/RecordRunRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/AgentRun" } } } } }, "/api/v1/agents/{asset_id}/activity": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "agents" ], "summary": "Agent activity", "operationId": "getAgentsAssetIDActivity", "parameters": [ { "type": "string", "description": "Agent asset id", "name": "asset_id", "in": "path", "required": true }, { "type": "string", "description": "Lookback window (e.g. 24h, 7d). Default 24h.", "name": "period", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ActivityResponse" } } } } }, "/api/v1/agents/{asset_id}/runs": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "agents" ], "summary": "List agent runs", "operationId": "getAgentsAssetIDRuns", "parameters": [ { "type": "string", "description": "Agent asset id", "name": "asset_id", "in": "path", "required": true }, { "type": "string", "description": "Lookback window (e.g. 24h, 7d). Default 24h.", "name": "period", "in": "query" }, { "type": "integer", "description": "Max number of runs to return", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/RunsResponse" } } } } }, "/api/v1/agents/{asset_id}/stats": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "agents" ], "summary": "Agent stats", "operationId": "getAgentsAssetIDStats", "parameters": [ { "type": "string", "description": "Agent asset id", "name": "asset_id", "in": "path", "required": true }, { "type": "string", "description": "Lookback window (e.g. 24h, 7d). Default 24h.", "name": "period", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Stats" } } } } }, "/api/v1/asset-rules/": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new asset rule that applies enrichments to matching assets", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Create an asset rule", "operationId": "postAssetRules", "parameters": [ { "description": "Asset rule creation request", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateAssetRuleRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/AssetRule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/asset-rules/assets/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the list of asset IDs matched by an asset rule", "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Get assets matched by a rule", "operationId": "getAssetRulesAssetsID", "parameters": [ { "type": "string", "description": "Asset rule ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/asset-rules/list": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "List all asset rules with pagination", "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "List asset rules", "operationId": "getAssetRulesList", "parameters": [ { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetRuleListResult" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/asset-rules/preview": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Preview which assets would match a rule configuration", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Preview an asset rule", "operationId": "postAssetRulesPreview", "parameters": [ { "description": "Rule preview request", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/PreviewRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/RulePreview" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/asset-rules/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search asset rules by name", "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Search asset rules", "operationId": "getAssetRulesSearch", "parameters": [ { "type": "string", "description": "Search query", "name": "query", "in": "query" }, { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetRuleListResult" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/asset-rules/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get an asset rule by ID", "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Get an asset rule", "operationId": "getAssetRulesID", "parameters": [ { "type": "string", "description": "Asset rule ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetRule" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update an existing asset rule", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "asset-rules" ], "summary": "Update an asset rule", "operationId": "putAssetRulesID", "parameters": [ { "type": "string", "description": "Asset rule ID", "name": "id", "in": "path", "required": true }, { "description": "Asset rule update request", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateAssetRuleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetRule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an asset rule by ID", "tags": [ "asset-rules" ], "summary": "Delete an asset rule", "operationId": "deleteAssetRulesID", "parameters": [ { "type": "string", "description": "Asset rule ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new asset in the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Create a new asset", "operationId": "postAssets", "parameters": [ { "description": "Asset creation request", "name": "asset", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateAssetRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/by-glossary-term/{term_id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve all assets associated with a specific glossary term", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get assets by glossary term", "operationId": "getAssetsByGlossaryTermTermID", "parameters": [ { "type": "string", "description": "Glossary Term ID", "name": "term_id", "in": "path", "required": true }, { "type": "integer", "default": 20, "description": "Maximum number of assets", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Pagination offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/documentation/": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create or update documentation for an asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Create asset documentation", "operationId": "postAssetsDocumentation", "parameters": [ { "description": "Documentation creation request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/DocumentationCreateRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Documentation" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/documentation/batch": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create or update documentation for multiple assets", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Batch create documentation", "operationId": "postAssetsDocumentationBatch", "parameters": [ { "description": "Batch documentation request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/BatchDocumentationRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/BatchDocumentationResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/documentation/{mrn}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get documentation for a specific asset", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset documentation", "operationId": "getAssetsDocumentationMrn", "parameters": [ { "type": "string", "format": "url", "description": "Asset MRN", "name": "mrn", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/Documentation" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/lookup/{type}/{service}/{name}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get an asset by its type, service (provider), and name", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Lookup asset by type, service, and name", "operationId": "getAssetsLookupTypeServiceName", "parameters": [ { "type": "string", "description": "Asset type", "name": "type", "in": "path", "required": true }, { "type": "string", "description": "Service/Provider name", "name": "service", "in": "path", "required": true }, { "type": "string", "description": "Asset name", "name": "name", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/match-pattern/": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Find assets matching a pattern", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Match asset pattern", "operationId": "getAssetsMatchPattern", "parameters": [ { "type": "string", "description": "Asset pattern to match", "name": "pattern", "in": "query", "required": true }, { "type": "string", "description": "Asset type", "name": "type", "in": "query", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/Asset" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/my-assets": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get assets owned by the current user or their teams", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get user's assets", "operationId": "getAssetsMyAssets", "parameters": [ { "type": "integer", "default": 20, "description": "Limit", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetSearchResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/preview/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Fetches sample data from the asset's data source. Requires assets:preview permission.", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get preview data for an asset", "operationId": "getAssetsPreviewID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/PreviewResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Missing assets:preview permission", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "501": { "description": "Data preview not supported for this asset", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/qualified-name/{name}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get detailed information about a specific asset using its qualified name", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get an asset by qualified name", "operationId": "getAssetsQualifiedNameQualifiedName", "parameters": [ { "type": "string", "description": "Asset qualified name", "name": "name", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/run-history-histogram/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get histogram data for asset run history over specified period", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset run history histogram", "operationId": "getAssetsIDRunHistoryHistogram", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "type": "string", "default": "30d", "description": "Time period (7d, 30d, 90d)", "name": "period", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/HistogramResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/run-history/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get paginated run history for a specific asset", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset run history", "operationId": "getAssetsIDRunHistory", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "default": 10, "description": "Number of items per page", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/RunHistoryResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search for assets using query string and filters", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Search assets", "operationId": "getAssetsSearch", "parameters": [ { "type": "string", "description": "Search query", "name": "q", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by asset types", "name": "types", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by services", "name": "services", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by tags", "name": "tags", "in": "query" }, { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" }, { "type": "boolean", "default": false, "description": "Calculate filter counts", "name": "calculateCounts", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetSearchResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/suggestions/metadata/fields": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get suggestions for metadata fields and their types", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get metadata field suggestions", "operationId": "getAssetsSuggestionsMetadataFields", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/MetadataFieldSuggestion" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/suggestions/metadata/values": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get suggestions for values of a specific metadata field", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get metadata value suggestions", "operationId": "getAssetsSuggestionsMetadataValues", "parameters": [ { "type": "string", "description": "Metadata field name", "name": "field", "in": "query", "required": true }, { "type": "string", "description": "Value prefix to filter by", "name": "prefix", "in": "query" }, { "type": "integer", "default": 10, "description": "Maximum number of suggestions", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/MetadataValueSuggestion" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/suggestions/tags": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get suggestions for asset tags", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get tag suggestions", "operationId": "getAssetsSuggestionsTags", "parameters": [ { "type": "string", "description": "Tag prefix to filter by", "name": "prefix", "in": "query" }, { "type": "integer", "default": 10, "description": "Maximum number of suggestions", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "type": "string" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/summary": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the total count of assets by type", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset summary", "operationId": "getAssetsSummary", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetSummaryResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/tags/{id}": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Add a new tag to an existing asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Add tag to asset", "operationId": "postAssetsTagsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "description": "Tag to add", "name": "tag", "in": "body", "required": true, "schema": { "$ref": "#/definitions/TagRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Remove a tag from an existing asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Remove tag from asset", "operationId": "deleteAssetsTagsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "description": "Tag to remove", "name": "tag", "in": "body", "required": true, "schema": { "$ref": "#/definitions/TagRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/terms/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve all glossary terms associated with an asset", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset's glossary terms", "operationId": "getAssetsTermsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/AssetTerm" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Associate one or more glossary terms with an asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Add glossary terms to asset", "operationId": "postAssetsTermsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "description": "Term IDs to add", "name": "terms", "in": "body", "required": true, "schema": { "$ref": "#/definitions/AddTermsRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/AssetTerm" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Remove a glossary term association from an asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Remove glossary term from asset", "operationId": "deleteAssetsTermsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "description": "Term ID to remove", "name": "term", "in": "body", "required": true, "schema": { "$ref": "#/definitions/RemoveTermRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/AssetTerm" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/assets/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get detailed information about a specific asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get an asset by ID", "operationId": "getAssetsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update an existing asset's information", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Update an asset", "operationId": "putAssetsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "description": "Asset update request", "name": "asset", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateAssetRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an asset from the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Delete an asset", "operationId": "deleteAssetsID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new glossary term with name, definition, and optional metadata", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Create glossary term", "operationId": "postGlossary", "parameters": [ { "description": "Glossary term to create", "name": "term", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateTermRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/GlossaryTerm" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/ancestors/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve all ancestor terms of a glossary term (parent chain)", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Get ancestor terms", "operationId": "getGlossaryAncestorsID", "parameters": [ { "type": "string", "description": "Term ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/children/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve all child terms of a glossary term", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Get child terms", "operationId": "getGlossaryChildrenID", "parameters": [ { "type": "string", "description": "Parent Term ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/list": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve a paginated list of all glossary terms", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "List glossary terms", "operationId": "getGlossaryList", "parameters": [ { "type": "integer", "default": 20, "description": "Maximum number of terms to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of terms to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/GlossaryListResult" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search for glossary terms by query string and filters", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Search glossary terms", "operationId": "getGlossarySearch", "parameters": [ { "type": "string", "description": "Search query", "name": "q", "in": "query" }, { "type": "string", "description": "Filter by parent term ID", "name": "parent_term_id", "in": "query" }, { "type": "integer", "default": 20, "description": "Maximum number of terms to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of terms to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/GlossaryListResult" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/glossary/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve a glossary term by its ID", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Get glossary term", "operationId": "getGlossaryID", "parameters": [ { "type": "string", "description": "Glossary Term ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/GlossaryTerm" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update an existing glossary term by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Update glossary term", "operationId": "putGlossaryID", "parameters": [ { "type": "string", "description": "Glossary Term ID", "name": "id", "in": "path", "required": true }, { "description": "Glossary term update data", "name": "term", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateTermRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/GlossaryTerm" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a glossary term by its ID", "produces": [ "application/json" ], "tags": [ "glossary" ], "summary": "Delete glossary term", "operationId": "deleteGlossaryID", "parameters": [ { "type": "string", "description": "Glossary Term ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/runs": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "List ingestion job runs", "operationId": "getIngestionRuns", "parameters": [ { "type": "string", "description": "Filter by schedule ID", "name": "schedule_id", "in": "query" }, { "type": "string", "description": "Filter by status", "name": "status", "in": "query" }, { "type": "integer", "description": "Limit", "name": "limit", "in": "query" }, { "type": "integer", "description": "Offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListJobRunsResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/runs/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Get a job run by ID", "operationId": "getIngestionRunsID", "parameters": [ { "type": "string", "description": "Job run ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/JobRun" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/runs/{id}/cancel": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "tags": [ "ingestion" ], "summary": "Cancel a running job", "operationId": "postIngestionRunsIDCancel", "parameters": [ { "type": "string", "description": "Job run ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/runs/{id}/entities": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Get entities for a job run", "operationId": "getIngestionRunsIDEntities", "parameters": [ { "type": "string", "description": "Job run ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "description": "Limit", "name": "limit", "in": "query" }, { "type": "integer", "description": "Offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/schedules": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "List ingestion schedules", "operationId": "getIngestionSchedules", "parameters": [ { "type": "boolean", "description": "Filter by enabled status", "name": "enabled", "in": "query" }, { "type": "integer", "description": "Limit", "name": "limit", "in": "query" }, { "type": "integer", "description": "Offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListSchedulesResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Create a new ingestion schedule", "operationId": "postIngestionSchedules", "parameters": [ { "description": "Schedule configuration", "name": "schedule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateScheduleRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/Schedule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/schedules/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Get an ingestion schedule by ID", "operationId": "getIngestionSchedulesID", "parameters": [ { "type": "string", "description": "Schedule ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Schedule" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Update an ingestion schedule", "operationId": "putIngestionSchedulesID", "parameters": [ { "type": "string", "description": "Schedule ID", "name": "id", "in": "path", "required": true }, { "description": "Updated schedule configuration", "name": "schedule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateScheduleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Schedule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "tags": [ "ingestion" ], "summary": "Delete an ingestion schedule", "operationId": "deleteIngestionSchedulesID", "parameters": [ { "type": "string", "description": "Schedule ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/schedules/{id}/trigger": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "tags": [ "ingestion" ], "summary": "Manually trigger an ingestion schedule", "operationId": "postIngestionSchedulesIDTrigger", "parameters": [ { "type": "string", "description": "Schedule ID", "name": "id", "in": "path", "required": true } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/JobRun" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ingestion/validate": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "ingestion" ], "summary": "Validate plugin configuration", "operationId": "postIngestionValidate", "parameters": [ { "description": "Config to validate", "name": "config", "in": "body", "required": true, "schema": { "$ref": "#/definitions/ValidateConfigRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ValidateConfigResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/lineage": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Process OpenLineage run events and update assets/lineage accordingly", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Ingest OpenLineage event", "operationId": "postLineage", "parameters": [ { "description": "OpenLineage run event", "name": "event", "in": "body", "required": true, "schema": { "$ref": "#/definitions/RunEvent" } } ], "responses": { "200": { "description": "Event processed successfully" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/lineage/assets/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get upstream and downstream lineage for a specific asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Get asset lineage", "operationId": "getLineageAssetsID", "parameters": [ { "type": "string", "format": "uuid", "description": "Asset ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "default": 10, "description": "Maximum depth of lineage graph", "name": "limit", "in": "query" }, { "enum": [ "upstream", "downstream", "both" ], "type": "string", "default": "both", "description": "Direction of lineage (upstream, downstream, or both)", "name": "direction", "in": "query" }, { "type": "string", "description": "Comma separated edge types to leave out, for example CONTAINS to see data flow without structure", "name": "exclude_types", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/LineageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/lineage/batch": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create lineage edges in batch", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Batch create lineage edges", "operationId": "postLineageBatch", "parameters": [ { "description": "Array of lineage edges to create", "name": "edges", "in": "body", "required": true, "schema": { "type": "array", "items": { "$ref": "#/definitions/LineageEdge" } } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/BatchLineageResult" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/lineage/direct": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a direct lineage connection between two assets and returns the created edge", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Create direct lineage", "operationId": "postLineageDirect", "parameters": [ { "description": "Lineage edge to create", "name": "edge", "in": "body", "required": true, "schema": { "$ref": "#/definitions/LineageEdge" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/LineageEdge" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/lineage/direct/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a specific direct lineage connection by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Get direct lineage by ID", "operationId": "getLineageDirectID", "parameters": [ { "type": "string", "format": "uuid", "description": "Edge ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/LineageEdge" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a direct lineage connection by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Delete direct lineage", "operationId": "deleteLineageDirectID", "parameters": [ { "type": "string", "format": "uuid", "description": "Edge ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/mcp": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "JSON-RPC 2.0 over the MCP Streamable HTTP transport. Requires assets:view, glossary:view and teams:view.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "mcp" ], "summary": "MCP endpoint", "operationId": "postMcp", "parameters": [ { "description": "JSON-RPC 2.0 request", "name": "request", "in": "body", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "responses": { "200": { "description": "JSON-RPC 2.0 response", "schema": { "type": "object", "additionalProperties": true } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/metrics": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get aggregated metrics for dashboard display", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get metrics for UI", "operationId": "getMetrics", "parameters": [ { "type": "string", "description": "Start time (ISO 8601)", "name": "start", "in": "query", "required": true }, { "type": "string", "description": "End time (ISO 8601)", "name": "end", "in": "query", "required": true }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by metric names", "name": "metric_names", "in": "query" }, { "enum": [ "avg", "sum", "max", "min" ], "type": "string", "default": "avg", "description": "Aggregation type", "name": "aggregation", "in": "query" }, { "enum": [ "1m", "5m", "1h", "1d" ], "type": "string", "description": "Time bucket size", "name": "bucket_size", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/GetMetricsResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/metrics/assets/by-owner": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get asset counts grouped by owner", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by owner", "operationId": "getMetricsAssetsByOwner", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetsByOwnerResponse" } } } } }, "/api/v1/metrics/assets/by-provider": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get asset counts grouped by provider", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by provider", "operationId": "getMetricsAssetsByProvider", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetsByProviderResponse" } } } } }, "/api/v1/metrics/assets/by-type": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get asset counts grouped by type", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by type", "operationId": "getMetricsAssetsByType", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetsByTypeResponse" } } } } }, "/api/v1/metrics/assets/total": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the total number of assets", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get total assets count", "operationId": "getMetricsAssetsTotal", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/TotalAssetsResponse" } } } } }, "/api/v1/metrics/assets/with-schemas": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the count of assets that have schemas defined", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets with schemas count", "operationId": "getMetricsAssetsWithSchemas", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AssetsWithSchemasResponse" } } } } }, "/api/v1/metrics/top-assets": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the most viewed assets", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get top viewed assets", "operationId": "getMetricsTopAssets", "parameters": [ { "type": "string", "description": "Start time (ISO 8601)", "name": "start", "in": "query", "required": true }, { "type": "string", "description": "End time (ISO 8601)", "name": "end", "in": "query", "required": true }, { "type": "integer", "default": 10, "description": "Number of results", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/AssetCount" } } } } } }, "/api/v1/metrics/top-queries": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the most popular search queries", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get top search queries", "operationId": "getMetricsTopQueries", "parameters": [ { "type": "string", "description": "Start time (ISO 8601)", "name": "start", "in": "query", "required": true }, { "type": "string", "description": "End time (ISO 8601)", "name": "end", "in": "query", "required": true }, { "type": "integer", "default": 10, "description": "Number of results", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/QueryCount" } } } } } }, "/api/v1/owners/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search for asset owners (users and teams)", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "owners" ], "summary": "Search owners", "operationId": "getOwnersSearch", "parameters": [ { "type": "string", "description": "Search query", "name": "q", "in": "query", "required": true }, { "type": "integer", "default": 20, "description": "Maximum number of results", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/SearchOwnersResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/permissions": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "List all defined permissions grouped by resource type", "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "List all permissions", "operationId": "getPermissions", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/RolePermission" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/pipelines/{pipelineName}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete all resources ever created by a pipeline (across all sources)", "produces": [ "application/json" ], "tags": [ "pipelines" ], "summary": "Destroy pipeline", "operationId": "deletePipelinesPipelineName", "parameters": [ { "type": "string", "description": "Pipeline Name", "name": "pipelineName", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DestroyRunResponse" } } } } }, "/api/v1/plugins": { "get": { "produces": [ "application/json" ], "tags": [ "plugins" ], "summary": "List registered plugins", "operationId": "getPlugins", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListPluginsResponse" } } } } }, "/api/v1/plugins/aws/credentials/status": { "get": { "description": "Detects if AWS credentials are available from environment or config files", "produces": [ "application/json" ], "tags": [ "plugins" ], "summary": "Get AWS credential detection status", "operationId": "getPluginsAwsCredentialsStatus", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AWSCredentialStatus" } } } } }, "/api/v1/products/": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new data product with owners and optional membership rules", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Create data product", "operationId": "postProducts", "parameters": [ { "description": "Data product to create", "name": "product", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateDataProductRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/DataProduct" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/assets/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the manually added assets of a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Get data product assets", "operationId": "getProductsAssetsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "default": 20, "description": "Maximum number of assets to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of assets to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductAssetsResult" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Manually add assets to a data product", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Add data product assets", "operationId": "postProductsAssetsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "description": "Asset IDs to add", "name": "assets", "in": "body", "required": true, "schema": { "$ref": "#/definitions/AddDataProductAssetsRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/assets/{id}/{assetId}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Remove a manually added asset from a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Remove data product asset", "operationId": "deleteProductsAssetsIDAssetID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Asset ID", "name": "assetId", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/images/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "List all images for a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "List product images", "operationId": "getProductsImagesID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/images/{id}/{purpose}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get an icon or header image for a data product", "produces": [ "image/jpeg", "image/png", "image/gif", "image/webp" ], "tags": [ "products" ], "summary": "Get product image", "operationId": "getProductsImagesIDPurpose", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Image purpose (icon or header)", "name": "purpose", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "file" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Upload an icon or header image for a data product", "consumes": [ "multipart/form-data" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Upload product image", "operationId": "postProductsImagesIDPurpose", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Image purpose (icon or header)", "name": "purpose", "in": "path", "required": true }, { "type": "file", "description": "Image file", "name": "file", "in": "formData", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ProductImageMeta" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an icon or header image for a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Delete product image", "operationId": "deleteProductsImagesIDPurpose", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Image purpose (icon or header)", "name": "purpose", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/list": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Retrieve a paginated list of data products", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "List data products", "operationId": "getProductsList", "parameters": [ { "type": "integer", "default": 20, "description": "Maximum number of data products to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of data products to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductListResult" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/resolved-assets/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get all assets of a data product, both manually added and matched by rules", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Get resolved data product assets", "operationId": "getProductsResolvedAssetsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "integer", "default": 20, "description": "Maximum number of assets to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of assets to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductResolvedAssets" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/rule-preview": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Preview which assets would match a rule configuration", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Preview data product rule", "operationId": "postProductsRulePreview", "parameters": [ { "description": "Rule to preview", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/DataProductRuleRequest" } }, { "type": "integer", "default": 20, "description": "Maximum number of matching assets to return", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductRulePreview" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/rules/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the membership rules of a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Get data product rules", "operationId": "getProductsRulesID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductRulesResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a membership rule for a data product", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Create data product rule", "operationId": "postProductsRulesID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "description": "Rule to create", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/DataProductRuleRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/DataProductRule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/rules/{id}/{ruleId}": { "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update a membership rule of a data product", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Update data product rule", "operationId": "putProductsRulesIDRuleID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Rule ID", "name": "ruleId", "in": "path", "required": true }, { "description": "Rule fields to update", "name": "rule", "in": "body", "required": true, "schema": { "$ref": "#/definitions/DataProductRuleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductRule" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a membership rule from a data product", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Delete data product rule", "operationId": "deleteProductsRulesIDRuleID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Rule ID", "name": "ruleId", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search data products by name, description, and tags", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Search data products", "operationId": "getProductsSearch", "parameters": [ { "type": "string", "description": "Search query", "name": "q", "in": "query" }, { "type": "string", "description": "Comma-separated list of tags to filter by", "name": "tags", "in": "query" }, { "type": "integer", "default": 20, "description": "Maximum number of data products to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of data products to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProductListResult" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/products/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a data product by ID", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Get data product", "operationId": "getProductsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProduct" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update an existing data product", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Update data product", "operationId": "putProductsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true }, { "description": "Fields to update", "name": "product", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateDataProductRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/DataProduct" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a data product by ID", "produces": [ "application/json" ], "tags": [ "products" ], "summary": "Delete data product", "operationId": "deleteProductsID", "parameters": [ { "type": "string", "description": "Data Product ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/query/history": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Lists the query log, newest first. Callers without access:view only see their own queries.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "List queries", "parameters": [ { "type": "string", "description": "Source name", "name": "source", "in": "query" }, { "type": "string", "description": "allowed or denied", "name": "decision", "in": "query" }, { "type": "string", "description": "running, completed, failed or denied", "name": "status", "in": "query" }, { "type": "string", "description": "Only queries that referenced this MRN", "name": "mrn", "in": "query" }, { "type": "string", "description": "Principal type", "name": "principal_type", "in": "query" }, { "type": "string", "description": "Principal ID", "name": "principal_id", "in": "query" }, { "type": "boolean", "description": "Only the caller's own queries", "name": "mine", "in": "query" }, { "type": "string", "description": "Comma-separated clients to include: api, mcp or cli", "name": "client", "in": "query" }, { "type": "string", "description": "Only queries started at or after this time (RFC 3339)", "name": "from", "in": "query" }, { "type": "string", "description": "Only queries started before this time (RFC 3339)", "name": "to", "in": "query" }, { "type": "string", "description": "Matches the caller, source, statement or a referenced MRN", "name": "q", "in": "query" }, { "type": "integer", "default": 50, "description": "Page size", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Page offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryHistoryResponse" } } } } }, "/api/v1/query/history/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Returns one query from the log, including the catalog context recorded when it ran. Callers without access:view can only read their own queries.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Get a query", "parameters": [ { "type": "string", "description": "Query ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryRecord" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/query/run": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Runs a read-only statement against a queryable source as the caller. The statement is planned first and refused unless the caller may query every table it references. Every attempt is recorded in the query log.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Run a query", "parameters": [ { "description": "Query", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/QueryRunInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryResult" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/query/sources": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Pages through the sources that answer data queries, in name order. Use a source's name as the \"source\" of a query.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "List queryable sources", "parameters": [ { "type": "string", "description": "Search by source name or plugin", "name": "q", "in": "query" }, { "type": "integer", "default": 50, "description": "Page size, at most 200", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Page offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryListSourcesResponse" } } } } }, "/api/v1/query/sources/{name}/tables": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Lists the catalogued tables a queryable source can reach, busiest first, each with a statement that previews it in the source's own dialect.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "List a source's tables", "parameters": [ { "type": "string", "description": "Source name", "name": "name", "in": "path", "required": true }, { "type": "string", "description": "Search by table name", "name": "q", "in": "query" }, { "type": "integer", "default": 25, "description": "At most 100", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/QuerySourceTable" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/query/stats": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Summarises data query activity over a window from hourly rollups: totals, a series and the busiest callers, sources and tables. Callers without access:view only see their own activity. The window defaults to the last 24 hours.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Query statistics", "parameters": [ { "type": "string", "description": "Start of the window, RFC 3339", "name": "from", "in": "query" }, { "type": "string", "description": "End of the window, RFC 3339", "name": "to", "in": "query" }, { "type": "string", "description": "hour or day; defaults by window length", "name": "interval", "in": "query" }, { "type": "integer", "default": 6, "description": "Entries in each top list", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryStats" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/query/status": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Reports the long-running plugin processes that serve data queries.", "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Query plugin instance status", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/QueryStatusResponse" } } } } }, "/api/v1/roles": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "List all active roles with user counts and permissions", "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "List roles", "operationId": "getRoles", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/Role" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new role with optional initial permissions, named by id or by resource_type:action key. The body may be JSON or YAML.", "consumes": [ "application/json", "application/yaml" ], "produces": [ "application/json", "application/yaml" ], "tags": [ "roles" ], "summary": "Create a role", "operationId": "postRoles", "parameters": [ { "description": "Role creation request", "name": "role", "in": "body", "required": true, "schema": { "$ref": "#/definitions/v1_roles.createRoleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Role" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/roles/schema": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "The JSON Schema a role document follows, for editors and tooling.", "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Role document schema", "operationId": "getRolesSchema", "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": true } } } } }, "/api/v1/roles/validate": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Checks a role document, in JSON or YAML, without saving it, and lists every problem found with where it is, so an editor can mark each one. Pass id to check an edit to an existing role, so it keeping its own name is not reported as a clash.", "consumes": [ "application/json", "application/yaml" ], "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Validate a role document", "operationId": "postRolesValidate", "parameters": [ { "type": "string", "description": "ID of the role being edited", "name": "id", "in": "query" }, { "description": "Role document", "name": "role", "in": "body", "required": true, "schema": { "$ref": "#/definitions/v1_roles.createRoleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ValidateRoleResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/DocumentErrorResponse" } } } } }, "/api/v1/roles/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a role by ID with its permissions", "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Get a role", "operationId": "getRolesID", "parameters": [ { "type": "string", "description": "Role ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Role" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Soft-delete a role. Fails if the role is a system role or has active user assignments.", "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Delete a role", "operationId": "deleteRolesID", "parameters": [ { "type": "string", "description": "Role ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "422": { "description": "Unprocessable Entity", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "patch": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update a role's name or description. System roles cannot be renamed.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Update a role", "operationId": "patchRolesID", "parameters": [ { "type": "string", "description": "Role ID", "name": "id", "in": "path", "required": true }, { "description": "Role update request", "name": "role", "in": "body", "required": true, "schema": { "$ref": "#/definitions/v1_roles.updateRoleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Role" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "422": { "description": "Unprocessable Entity", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/roles/{id}/permissions": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Atomically replace all permissions on a role, named by id or by resource_type:action key. System roles enforce a minimum permission floor.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "roles" ], "summary": "Replace role permissions", "operationId": "postRolesIDPermissions", "parameters": [ { "type": "string", "description": "Role ID", "name": "id", "in": "path", "required": true }, { "description": "Permission IDs to assign", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/v1_roles.replacePermissionsRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Role" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "422": { "description": "Unprocessable Entity", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/runs": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get paginated list of runs with filtering", "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "List runs", "operationId": "getRuns", "parameters": [ { "type": "string", "description": "Comma-separated list of pipeline names", "name": "pipelines", "in": "query" }, { "type": "string", "description": "Comma-separated list of statuses", "name": "statuses", "in": "query" }, { "type": "integer", "default": 50, "description": "Number of results per page", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of results to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "pipelines": { "type": "array", "items": { "type": "string" } }, "runs": { "type": "array", "items": { "$ref": "#/definitions/PluginRun" } }, "total": { "type": "integer" } } } } } } }, "/api/v1/runs/assets/batch": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create/update assets within a run", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "Batch create assets", "operationId": "postRunsAssetsBatch", "parameters": [ { "description": "Batch create request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/BatchCreateRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/BatchCreateResponse" } } } } }, "/api/v1/runs/cleanup": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Mark runs as failed if they've been running too long without updates", "tags": [ "runs" ], "summary": "Cleanup stale runs", "operationId": "postRunsCleanup", "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "integer" } } } } } }, "/api/v1/runs/complete": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Complete a run with results", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "Complete run", "operationId": "postRunsComplete", "parameters": [ { "description": "Complete run request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CompleteRunRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/api/v1/runs/start": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Start a new run for tracking", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "Start run", "operationId": "postRunsStart", "parameters": [ { "description": "Start run request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/StartRunRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/PluginRun" } } } } }, "/api/v1/runs/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a specific run by ID", "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "Get run", "operationId": "getRunsID", "parameters": [ { "type": "string", "description": "Run ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/PluginRun" } } } } }, "/api/v1/runs/{id}/entities": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get paginated list of entities for a specific run", "produces": [ "application/json" ], "tags": [ "runs" ], "summary": "Get run entities", "operationId": "getRunsIDEntities", "parameters": [ { "type": "string", "description": "Run ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "Filter by entity type (asset, lineage, documentation)", "name": "entity_type", "in": "query" }, { "type": "string", "description": "Filter by status (created, updated, deleted, failed)", "name": "status", "in": "query" }, { "type": "integer", "default": 100, "description": "Number of results per page", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of results to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/RunEntitiesResponse" } } } } }, "/api/v1/search": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Search across assets, glossary terms, teams, and users", "produces": [ "application/json" ], "tags": [ "search" ], "summary": "Unified search", "operationId": "getSearch", "parameters": [ { "type": "string", "description": "Search query", "name": "q", "in": "query", "required": true }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by result types (asset, glossary, team, user)", "name": "types", "in": "query" }, { "type": "integer", "default": 20, "description": "Limit", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Offset", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/SearchResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/service-accounts": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get all service accounts", "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "List service accounts", "operationId": "getServiceAccounts", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/ServiceAccount" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new service account", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "Create service account", "operationId": "postServiceAccounts", "parameters": [ { "description": "Service account", "name": "account", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateServiceAccountRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/ServiceAccount" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/service-accounts/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a service account by ID", "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "Get service account", "operationId": "getServiceAccountsID", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ServiceAccount" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Soft-delete a service account", "tags": [ "service_accounts" ], "summary": "Delete service account", "operationId": "deleteServiceAccountsID", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "patch": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update a service account", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "Update service account", "operationId": "patchServiceAccountsID", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true }, { "description": "Update fields", "name": "account", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateServiceAccountRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ServiceAccount" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/service-accounts/{id}/api-keys": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get all API keys for a service account", "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "List API keys for a service account", "operationId": "getServiceAccountsIDAPIKeys", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/ServiceAccountAPIKey" } } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new API key. The plaintext key is only returned once.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "service_accounts" ], "summary": "Create API key for a service account", "operationId": "postServiceAccountsIDAPIKeys", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true }, { "description": "API key details", "name": "key", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateServiceAccountAPIKeyRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/ServiceAccountAPIKey" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/service-accounts/{id}/api-keys/{keyId}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an API key for a service account", "tags": [ "service_accounts" ], "summary": "Delete an API key", "operationId": "deleteServiceAccountsIDAPIKeysKeyID", "parameters": [ { "type": "string", "description": "Service account ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "API key ID", "name": "keyId", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/sso-providers": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Read-only view of SSO providers wired via server config. Editing is done in config.yaml.", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "List configured SSO providers (admin)", "operationId": "getSsoProviders", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/SSOProvidersResponse" } } } } }, "/api/v1/sso/team-mappings": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a list of SSO group to team mappings", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sso" ], "summary": "List SSO team mappings", "operationId": "getSsoTeamMappings", "parameters": [ { "type": "string", "description": "Filter by SSO provider", "name": "provider", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListSSOMappingsResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new SSO group to team mapping", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sso" ], "summary": "Create an SSO team mapping", "operationId": "postSsoTeamMappings", "parameters": [ { "description": "SSO mapping creation request", "name": "mapping", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateSSOMappingRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/SSOTeamMapping" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/sso/team-mappings/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get an SSO team mapping by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sso" ], "summary": "Get an SSO team mapping", "operationId": "getSsoTeamMappingsID", "parameters": [ { "type": "string", "description": "SSO mapping ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/SSOTeamMapping" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update an SSO team mapping by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sso" ], "summary": "Update an SSO team mapping", "operationId": "putSsoTeamMappingsID", "parameters": [ { "type": "string", "description": "SSO mapping ID", "name": "id", "in": "path", "required": true }, { "description": "SSO mapping update request", "name": "mapping", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateSSOMappingRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an SSO team mapping by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "sso" ], "summary": "Delete an SSO team mapping", "operationId": "deleteSsoTeamMappingsID", "parameters": [ { "type": "string", "description": "SSO mapping ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a paginated list of teams", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "List teams", "operationId": "getTeams", "parameters": [ { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListTeamsResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new team", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Create a team", "operationId": "postTeams", "parameters": [ { "description": "Team creation request", "name": "team", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateTeamRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/Team" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a team by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Get a team", "operationId": "getTeamsID", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/Team" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update a team's fields by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Update a team", "operationId": "putTeamsID", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "description": "Team update request", "name": "team", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateTeamRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a team by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Delete a team", "operationId": "deleteTeamsID", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams/{id}/members": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get the members of a team", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "List team members", "operationId": "getTeamsIDMembers", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListMembersResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Add a user as a member of a team", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Add a team member", "operationId": "postTeamsIDMembers", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "description": "Member addition request", "name": "member", "in": "body", "required": true, "schema": { "$ref": "#/definitions/AddMemberRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/MessageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams/{id}/members/{userId}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Remove a user from a team", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Remove a team member", "operationId": "deleteTeamsIDMembersUserID", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "User ID", "name": "userId", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams/{id}/members/{userId}/convert-to-manual": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Convert an SSO-managed team member to a manually managed member", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Convert member to manual", "operationId": "postTeamsIDMembersUserIDConvertToManual", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "User ID", "name": "userId", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/teams/{id}/members/{userId}/role": { "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update the role of a team member", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "teams" ], "summary": "Update member role", "operationId": "putTeamsIDMembersUserIDRole", "parameters": [ { "type": "string", "description": "Team ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "User ID", "name": "userId", "in": "path", "required": true }, { "description": "Role update request", "name": "role", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateMemberRoleRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/MessageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/ui/config": { "get": { "description": "Get UI configuration including banner settings", "produces": [ "application/json" ], "tags": [ "ui" ], "summary": "Get UI configuration", "operationId": "getUIConfig", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/UIConfigResponse" } } } } }, "/api/v1/users": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get a list of users with optional filtering", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "List users", "operationId": "getUsers", "parameters": [ { "type": "integer", "default": 50, "description": "Number of items to return", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Number of items to skip", "name": "offset", "in": "query" }, { "type": "string", "description": "Search query for username or email", "name": "query", "in": "query" }, { "type": "array", "items": { "type": "string" }, "collectionFormat": "csv", "description": "Filter by role IDs", "name": "role_ids", "in": "query" }, { "type": "boolean", "description": "Filter by active status", "name": "active", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/ListUsersResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new user in the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Create a new user", "operationId": "postUsers", "parameters": [ { "description": "User creation request", "name": "user", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateUserInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/User" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ValidationErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/apikeys": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get all API keys for a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "List API keys", "operationId": "getUsersApikeys", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/APIKey" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Create a new API key for a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Create API key", "operationId": "postUsersApikeys", "parameters": [ { "description": "API key creation request", "name": "key", "in": "body", "required": true, "schema": { "$ref": "#/definitions/CreateAPIKeyRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/APIKey" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/apikeys/{id}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete an API key", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Delete API key", "operationId": "deleteUsersApikeysID", "parameters": [ { "type": "string", "description": "API key ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/login": { "post": { "description": "Authenticate a user with username/email and password", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Login user", "operationId": "postUsersLogin", "parameters": [ { "description": "Login credentials", "name": "credentials", "in": "body", "required": true, "schema": { "$ref": "#/definitions/LoginRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/TokenResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/me": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get detailed information about the currently authenticated user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Get current user profile", "operationId": "getUsersMe", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/User" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/oauth/link": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Link an OAuth account to an existing user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Link OAuth account", "operationId": "postUsersOauthLink", "parameters": [ { "description": "OAuth account link request", "name": "link", "in": "body", "required": true, "schema": { "$ref": "#/definitions/OAuthLinkRequest" } } ], "responses": { "200": { "description": "OK" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/oauth/unlink/{id}/{provider}": { "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Unlink an OAuth account from a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Unlink OAuth account", "operationId": "deleteUsersOauthUnlinkIDProvider", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true }, { "type": "string", "description": "OAuth provider", "name": "provider", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/preferences": { "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update preferences for the current user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update user preferences", "operationId": "putUsersPreferences", "parameters": [ { "description": "User preferences", "name": "preferences", "in": "body", "required": true, "schema": { "type": "object", "additionalProperties": true } } ], "responses": { "200": { "description": "OK" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/sign-out-all/{id}": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Rejects every token issued to the user before now. Their password and API keys are untouched, so this is the response to a leaked or overexposed token rather than a lost credential.", "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Sign a user out of all sessions", "operationId": "postUsersIDSignOutAll", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/update-password": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update current user's password", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update user password", "operationId": "postUsersUpdatePassword", "parameters": [ { "description": "Password update request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdatePasswordRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/TokenResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/api/v1/users/{id}": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Get detailed information about a specific user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Get a user by ID", "operationId": "getUsersID", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/User" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "put": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Update user information", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update a user", "operationId": "putUsersID", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true }, { "description": "User update request", "name": "user", "in": "body", "required": true, "schema": { "$ref": "#/definitions/UpdateUserInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/User" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ValidationErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } } } }, "delete": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Delete a user from the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Delete a user", "operationId": "deleteUsersID", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/auth-providers": { "get": { "description": "Returns the enabled auth providers without sensitive data", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Get auth configuration", "operationId": "getAuthProviders", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/AuthConfig" } } } } }, "/auth/{provider}/callback": { "get": { "description": "Processes the OAuth callback from any provider", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Handle OAuth callback", "operationId": "getAuthProviderCallback", "parameters": [ { "type": "string", "description": "OAuth provider (okta, google, github, etc.)", "name": "provider", "in": "path", "required": true }, { "type": "string", "description": "Authorization code", "name": "code", "in": "query", "required": true }, { "type": "string", "description": "State parameter for CSRF protection", "name": "state", "in": "query", "required": true } ], "responses": { "307": { "description": "Temporary Redirect", "schema": { "type": "string" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/auth/{provider}/login": { "get": { "description": "Redirects the user to the OAuth provider for authentication", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Initiate OAuth login", "operationId": "getAuthProviderLogin", "parameters": [ { "type": "string", "description": "OAuth provider (okta, google, github, etc.)", "name": "provider", "in": "path", "required": true } ], "responses": { "307": { "description": "Temporary Redirect", "schema": { "type": "string" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/oauth/token": { "post": { "description": "Handles authorization_code grants (with PKCE) and token exchange (RFC 8693).\nFor token-exchange, supported subject_token_type values are\nurn:ietf:params:oauth:token-type:id_token and urn:ietf:params:oauth:token-type:access_token.", "consumes": [ "application/x-www-form-urlencoded" ], "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "OAuth token endpoint", "operationId": "postOauthToken", "parameters": [ { "type": "string", "description": "authorization_code or urn:ietf:params:oauth:grant-type:token-exchange", "name": "grant_type", "in": "formData", "required": true }, { "type": "string", "description": "Token to exchange (token-exchange grant only)", "name": "subject_token", "in": "formData" }, { "type": "string", "description": "id_token or access_token URI (token-exchange grant only)", "name": "subject_token_type", "in": "formData" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/TokenExchangeResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/OAuthErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/OAuthErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/OAuthErrorResponse" } } } } }, "/query/serve/enrol": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Issues a short-lived client certificate for a plugin running outside Marmot to connect and serve queries for the named sources. The caller must hold ingestion:serve, and each source must be free or already served by the caller.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Enrol a serving plugin", "parameters": [ { "description": "Certificate request and sources", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/pluginserve.EnrolInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/pluginserve.EnrolResult" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "403": { "description": "Forbidden", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } }, "/query/serve/keys": { "get": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "produces": [ "application/json" ], "tags": [ "query" ], "summary": "List serving key generations", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/ServeKeyGeneration" } } } } } }, "/query/serve/keys/rotate": { "post": { "security": [ { "ApiKeyAuth": [] }, { "BearerAuth": [] } ], "description": "Starts a new generation of the CA and query signing keys that secure serving plugins. A graceful rotation publishes the new keys, uses them after the overlap and then retires the old ones, without interrupting serving plugins. An immediate rotation is for a suspected compromise: it switches at once and serving plugins must be restarted.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "query" ], "summary": "Rotate serving keys", "parameters": [ { "description": "Rotation", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/ServeRotateKeysRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/ServeKeyGeneration" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } } }, "definitions": { "APIKey": { "type": "object", "properties": { "created_at": { "type": "string" }, "expires_at": { "type": "string" }, "id": { "type": "string" }, "key": { "type": "string" }, "last_used_at": { "type": "string" }, "name": { "type": "string" }, "user_id": { "type": "string" } } }, "AWSCredentialStatus": { "type": "object", "properties": { "available": { "type": "boolean" }, "error": { "type": "string" }, "sources": { "type": "array", "items": { "type": "string" } } } }, "ActivityResponse": { "type": "object", "properties": { "buckets": { "type": "array", "items": { "$ref": "#/definitions/Bucket" } } } }, "AddDataProductAssetsRequest": { "type": "object", "required": [ "asset_ids" ], "properties": { "asset_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } } } }, "AddMemberRequest": { "type": "object", "properties": { "role": { "type": "string" }, "user_id": { "type": "string" } } }, "AddTermsRequest": { "type": "object", "required": [ "term_ids" ], "properties": { "term_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } } } }, "AgentRun": { "type": "object", "properties": { "agent_id": { "type": "string" }, "created_at": { "type": "string" }, "duration_ms": { "type": "integer" }, "ended_at": { "type": "string" }, "error": { "type": "string" }, "id": { "type": "string" }, "model": { "type": "string" }, "run_id": { "type": "string" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "tokens_in": { "type": "integer" }, "tokens_out": { "type": "integer" }, "tool_calls": { "type": "array", "items": { "$ref": "#/definitions/ToolCall" } } } }, "AggregatedMetric": { "type": "object", "properties": { "aggregation_type": { "type": "string" }, "bucket_end": { "type": "string" }, "bucket_size": { "type": "integer" }, "bucket_start": { "type": "string" }, "labels": { "type": "object", "additionalProperties": { "type": "string" } }, "name": { "type": "string" }, "value": { "type": "number" } } }, "Asset": { "type": "object", "properties": { "created_at": { "type": "string" }, "created_by": { "type": "string" }, "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/AssetExternalLink" } }, "has_run_history": { "type": "boolean" }, "id": { "type": "string" }, "is_stub": { "type": "boolean" }, "last_sync_at": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "mrn": { "type": "string" }, "name": { "type": "string" }, "parent_mrn": { "type": "string" }, "providers": { "type": "array", "items": { "type": "string" } }, "query": { "type": "string" }, "query_language": { "type": "string" }, "schema": { "type": "object", "additionalProperties": { "type": "string" } }, "sources": { "type": "array", "items": { "$ref": "#/definitions/AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "terms": { "description": "Terms carries glossary term names a discovery assigned to this\nasset. It is input only: the links live in asset_terms, so reading\nan asset back from the database never fills this in.", "type": "array", "items": { "type": "string" } }, "type": { "type": "string" }, "updated_at": { "type": "string" }, "user_description": { "type": "string" } } }, "AssetCount": { "type": "object", "properties": { "asset_id": { "type": "string" }, "asset_name": { "type": "string" }, "asset_provider": { "type": "string" }, "asset_type": { "type": "string" }, "count": { "type": "integer" } } }, "AssetExternalLink": { "type": "object", "properties": { "icon": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } }, "AssetRule": { "type": "object", "properties": { "created_at": { "type": "string" }, "created_by": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "is_enabled": { "type": "boolean" }, "last_reconciled_at": { "type": "string" }, "links": { "type": "array", "items": { "$ref": "#/definitions/AssetRuleExternalLink" } }, "membership_count": { "type": "integer" }, "metadata_field": { "type": "string" }, "name": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "priority": { "type": "integer" }, "query_expression": { "type": "string" }, "reconciliation_hash": { "type": "string" }, "rule_type": { "$ref": "#/definitions/RuleType" }, "term_ids": { "type": "array", "items": { "type": "string" } }, "updated_at": { "type": "string" } } }, "AssetRuleExternalLink": { "type": "object", "properties": { "icon": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } }, "AssetRuleListResult": { "type": "object", "properties": { "asset_rules": { "type": "array", "items": { "$ref": "#/definitions/AssetRule" } }, "total": { "type": "integer" } } }, "AssetSearchResponse": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/definitions/Asset" } }, "filters": { "$ref": "#/definitions/AvailableFilters" }, "limit": { "type": "integer" }, "offset": { "type": "integer" }, "total": { "type": "integer" } } }, "AssetSource": { "type": "object", "properties": { "last_sync_at": { "type": "string" }, "name": { "type": "string" }, "priority": { "type": "integer" }, "properties": { "type": "object", "additionalProperties": true } } }, "AssetSummaryResponse": { "type": "object", "properties": { "providers": { "type": "object", "additionalProperties": { "type": "integer" } }, "tags": { "type": "object", "additionalProperties": { "type": "integer" } }, "types": { "type": "object", "additionalProperties": { "$ref": "#/definitions/AssetTypeSummary" } } } }, "AssetTerm": { "type": "object", "properties": { "created_at": { "type": "string" }, "created_by": { "type": "string" }, "created_by_username": { "type": "string" }, "definition": { "type": "string" }, "source": { "description": "\"user\" or \"plugin:name\"", "type": "string" }, "term_id": { "type": "string" }, "term_name": { "type": "string" } } }, "AssetTypeSummary": { "type": "object", "properties": { "count": { "type": "integer" }, "service": { "type": "string" } } }, "AssetsByOwnerResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer", "format": "int64" } } } }, "AssetsByProviderResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer", "format": "int64" } } } }, "AssetsByTypeResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer", "format": "int64" } } } }, "AssetsWithSchemasResponse": { "type": "object", "properties": { "count": { "type": "integer" }, "percentage": { "type": "number" }, "total": { "type": "integer" } } }, "AuthConfig": { "type": "object", "properties": { "enabled_providers": { "type": "array", "items": { "type": "string" } } } }, "AvailableFilters": { "type": "object", "properties": { "providers": { "type": "object", "additionalProperties": { "type": "integer" } }, "tags": { "type": "object", "additionalProperties": { "type": "integer" } }, "types": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "BannerResponse": { "type": "object", "properties": { "dismissible": { "type": "boolean" }, "enabled": { "type": "boolean" }, "id": { "type": "string" }, "message": { "type": "string" }, "variant": { "type": "string" } } }, "BatchAssetResult": { "type": "object", "properties": { "asset": {}, "error": { "type": "string" }, "mrn": { "type": "string" }, "name": { "type": "string" }, "provider": { "type": "string" }, "status": { "type": "string" }, "type": { "type": "string" } } }, "BatchCreateRequest": { "type": "object", "required": [ "assets", "pipeline_name", "run_id", "source_name" ], "properties": { "assets": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/RunCreateAssetRequest" } }, "config": { "$ref": "#/definitions/RawPluginConfig" }, "documentation": { "type": "array", "items": { "$ref": "#/definitions/CreateDocRequest" } }, "glossary_terms": { "type": "array", "items": { "$ref": "#/definitions/CreateGlossaryTermRequest" } }, "lineage": { "type": "array", "items": { "$ref": "#/definitions/CreateLineageRequest" } }, "pipeline_name": { "type": "string" }, "run_history": { "type": "array", "items": { "$ref": "#/definitions/CreateRunHistoryRequest" } }, "run_id": { "type": "string" }, "source_name": { "type": "string" }, "statistics": { "type": "array", "items": { "$ref": "#/definitions/CreateStatRequest" } } } }, "BatchCreateResponse": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/definitions/BatchAssetResult" } }, "documentation": { "type": "array", "items": { "$ref": "#/definitions/DocumentationResult" } }, "lineage": { "type": "array", "items": { "$ref": "#/definitions/LineageResult" } }, "stale_entities_removed": { "type": "array", "items": { "type": "string" } } } }, "BatchDocumentationRequest": { "type": "object", "required": [ "documentation" ], "properties": { "documentation": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/Documentation" } } } }, "BatchDocumentationResponse": { "type": "object", "properties": { "results": { "type": "array", "items": { "$ref": "#/definitions/BatchDocumentationResult" } } } }, "BatchDocumentationResult": { "type": "object", "properties": { "documentation": { "$ref": "#/definitions/Documentation" }, "error": { "type": "string" }, "status": { "type": "string" } } }, "BatchLineageResult": { "type": "object", "properties": { "edge": { "$ref": "#/definitions/LineageEdge" }, "status": { "description": "\"created\", \"duplicate\", or \"existing\"", "type": "string" } } }, "Bucket": { "type": "object", "properties": { "error": { "type": "integer" }, "hour": { "type": "string" }, "success": { "type": "integer" } } }, "CompleteRunRequest": { "type": "object", "required": [ "run_id", "status" ], "properties": { "error": { "type": "string" }, "run_id": { "type": "string" }, "status": { "$ref": "#/definitions/RunStatus" }, "summary": { "$ref": "#/definitions/RunSummary" } } }, "CreateAPIKeyRequest": { "type": "object", "required": [ "name" ], "properties": { "expires_in_days": { "type": "integer" }, "name": { "type": "string" } } }, "CreateAssetRequest": { "type": "object", "required": [ "name", "providers", "type" ], "properties": { "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/AssetExternalLink" } }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "providers": { "type": "array", "items": { "type": "string" } }, "schema": { "type": "object", "additionalProperties": { "type": "string" } }, "sources": { "type": "array", "items": { "$ref": "#/definitions/AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "CreateAssetRuleRequest": { "type": "object", "properties": { "description": { "type": "string" }, "is_enabled": { "type": "boolean" }, "links": { "type": "array", "items": { "$ref": "#/definitions/AssetRuleExternalLink" } }, "metadata_field": { "type": "string" }, "name": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "priority": { "type": "integer" }, "query_expression": { "type": "string" }, "rule_type": { "type": "string" }, "term_ids": { "type": "array", "items": { "type": "string" } } } }, "CreateDataProductRequest": { "type": "object", "required": [ "name" ], "properties": { "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/DataProductOwnerRequest" } }, "rules": { "type": "array", "items": { "$ref": "#/definitions/DataProductRuleRequest" } }, "tags": { "type": "array", "items": { "type": "string" } } } }, "CreateDocRequest": { "type": "object", "properties": { "asset_mrn": { "type": "string" }, "content": { "type": "string" }, "type": { "type": "string" } } }, "CreateGlossaryTermRequest": { "type": "object", "properties": { "definition": { "type": "string" }, "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "parent": { "type": "string" }, "synonyms": { "type": "array", "items": { "type": "string" } }, "tags": { "type": "array", "items": { "type": "string" } } } }, "CreateLineageRequest": { "type": "object", "properties": { "job_mrn": { "type": "string" }, "source": { "type": "string" }, "target": { "type": "string" }, "type": { "type": "string" } } }, "CreateRunHistoryRequest": { "type": "object", "properties": { "asset_mrn": { "type": "string" }, "event_time": { "type": "string" }, "event_type": { "type": "string" }, "job_facets": { "type": "object", "additionalProperties": true }, "job_name": { "type": "string" }, "job_namespace": { "type": "string" }, "run_facets": { "type": "object", "additionalProperties": true }, "run_id": { "type": "string" } } }, "CreateSSOMappingRequest": { "type": "object", "properties": { "member_role": { "type": "string" }, "provider": { "type": "string" }, "sso_group_name": { "type": "string" }, "team_id": { "type": "string" } } }, "CreateScheduleRequest": { "type": "object", "properties": { "config": { "type": "object", "additionalProperties": true }, "cron_expression": { "type": "string" }, "enabled": { "type": "boolean" }, "ingest_on_query": { "description": "IngestOnQuery refreshes the source's catalog in the background after\ndata queries, rate-limited per source.", "type": "boolean" }, "name": { "type": "string" }, "plugin_id": { "type": "string" }, "queryable": { "description": "Queryable lets agents and users query this source through Marmot; the\nplugin must support queries.", "type": "boolean" } } }, "CreateServiceAccountAPIKeyRequest": { "type": "object", "properties": { "expires_in_days": { "type": "integer" }, "name": { "type": "string" } } }, "CreateServiceAccountRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" }, "role_ids": { "type": "array", "items": { "type": "string" } } } }, "CreateStatRequest": { "type": "object", "required": [ "asset_mrn", "metric_name", "value" ], "properties": { "asset_mrn": { "type": "string" }, "metric_name": { "type": "string" }, "value": { "type": "number" } } }, "CreateTeamRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" } } }, "CreateTermRequest": { "type": "object", "required": [ "definition", "name" ], "properties": { "definition": { "type": "string" }, "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/OwnerRequest" } }, "parent_term_id": { "type": "string" } } }, "CreateUserInput": { "type": "object", "required": [ "name", "role_names", "username" ], "properties": { "name": { "type": "string" }, "oauth_provider": { "type": "string" }, "oauth_provider_data": { "type": "object", "additionalProperties": true }, "oauth_provider_id": { "type": "string" }, "password": { "type": "string", "minLength": 8 }, "profile_picture": { "type": "string" }, "role_names": { "type": "array", "minItems": 1, "items": { "type": "string" } }, "username": { "type": "string", "maxLength": 255, "minLength": 3 } } }, "DataProduct": { "type": "object", "properties": { "asset_count": { "type": "integer" }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "description": { "type": "string" }, "icon_url": { "type": "string" }, "id": { "type": "string" }, "manual_asset_count": { "type": "integer" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/DataProductOwner" } }, "rule_asset_count": { "type": "integer" }, "rules": { "type": "array", "items": { "$ref": "#/definitions/DataProductRule" } }, "tags": { "type": "array", "items": { "type": "string" } }, "updated_at": { "type": "string" } } }, "DataProductAssetsResult": { "type": "object", "properties": { "asset_ids": { "type": "array", "items": { "type": "string" } }, "total": { "type": "integer" } } }, "DataProductListResult": { "type": "object", "properties": { "data_products": { "type": "array", "items": { "$ref": "#/definitions/DataProduct" } }, "total": { "type": "integer" } } }, "DataProductOwner": { "type": "object", "properties": { "email": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "profile_picture": { "type": "string" }, "type": { "type": "string" }, "username": { "type": "string" } } }, "DataProductOwnerRequest": { "type": "object", "required": [ "id", "type" ], "properties": { "id": { "type": "string" }, "type": { "type": "string", "enum": [ "user", "team" ] } } }, "DataProductResolvedAssets": { "type": "object", "properties": { "all_assets": { "type": "array", "items": { "type": "string" } }, "dynamic_assets": { "type": "array", "items": { "type": "string" } }, "manual_assets": { "type": "array", "items": { "type": "string" } }, "total": { "type": "integer" } } }, "DataProductRule": { "type": "object", "properties": { "created_at": { "type": "string" }, "data_product_id": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "is_enabled": { "type": "boolean" }, "matched_asset_count": { "type": "integer" }, "metadata_field": { "type": "string" }, "name": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "priority": { "type": "integer" }, "query_expression": { "type": "string" }, "rule_type": { "$ref": "#/definitions/DataProductRuleType" }, "updated_at": { "type": "string" } } }, "DataProductRulePreview": { "type": "object", "properties": { "asset_count": { "type": "integer" }, "asset_ids": { "type": "array", "items": { "type": "string" } }, "errors": { "type": "array", "items": { "type": "string" } } } }, "DataProductRuleRequest": { "type": "object", "required": [ "name", "rule_type" ], "properties": { "description": { "type": "string" }, "is_enabled": { "type": "boolean" }, "metadata_field": { "type": "string" }, "name": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "priority": { "type": "integer" }, "query_expression": { "type": "string" }, "rule_type": { "type": "string" } } }, "DataProductRuleType": { "type": "string", "enum": [ "query", "metadata_match" ], "x-enum-varnames": [ "RuleTypeQuery", "RuleTypeMetadataMatch" ] }, "DataProductRulesResponse": { "type": "object", "properties": { "rules": { "type": "array", "items": { "$ref": "#/definitions/DataProductRule" } }, "total": { "type": "integer" } } }, "Dataset": { "type": "object", "properties": { "facets": { "type": "object", "additionalProperties": true }, "inputFacets": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "namespace": { "type": "string" }, "outputFacets": { "type": "object", "additionalProperties": true } } }, "DestroyRunResponse": { "type": "object", "properties": { "assets_deleted": { "type": "integer" }, "deleted_entity_mrns": { "type": "array", "items": { "type": "string" } }, "documentation_deleted": { "type": "integer" }, "lineage_deleted": { "type": "integer" } } }, "DocumentErrorResponse": { "type": "object", "properties": { "error": { "type": "string" }, "fields": { "type": "array", "items": { "$ref": "#/definitions/DocumentFieldError" } } } }, "DocumentFieldError": { "type": "object", "properties": { "message": { "type": "string" }, "path": { "description": "Path is a JSONPath-style location such as bindings[2].members[0], or empty for the document as a whole.", "type": "string" } } }, "Documentation": { "type": "object", "properties": { "content": { "type": "string" }, "created_at": { "type": "string" }, "global_docs": { "type": "array", "items": { "type": "string" } }, "id": { "type": "string" }, "mrn": { "type": "string" }, "source": { "type": "string" }, "updated_at": { "type": "string" } } }, "DocumentationCreateRequest": { "type": "object", "required": [ "content", "mrn", "source" ], "properties": { "content": { "type": "string" }, "mrn": { "type": "string" }, "source": { "type": "string" } } }, "DocumentationResult": { "type": "object", "properties": { "asset_mrn": { "type": "string" }, "error": { "type": "string" }, "status": { "type": "string" }, "type": { "type": "string" } } }, "Environment": { "type": "object", "properties": { "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "path": { "type": "string" } } }, "ErrorResponse": { "type": "object", "properties": { "error": { "type": "string" } } }, "FacetValue": { "type": "object", "properties": { "count": { "type": "integer" }, "value": { "type": "string" } } }, "Facets": { "type": "object", "properties": { "asset_types": { "type": "array", "items": { "$ref": "#/definitions/FacetValue" } }, "providers": { "type": "array", "items": { "$ref": "#/definitions/FacetValue" } }, "tags": { "type": "array", "items": { "$ref": "#/definitions/FacetValue" } }, "types": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "GetMetricsRequest": { "type": "object", "properties": { "aggregation": { "type": "string" }, "bucket_size": { "type": "string" }, "end": { "type": "string" }, "labels": { "type": "object", "additionalProperties": { "type": "string" } }, "metric_names": { "type": "array", "items": { "type": "string" } }, "start": { "type": "string" } } }, "GetMetricsResponse": { "type": "object", "properties": { "metrics": { "type": "array", "items": { "$ref": "#/definitions/AggregatedMetric" } }, "query": { "$ref": "#/definitions/GetMetricsRequest" } } }, "GlossaryListResult": { "type": "object", "properties": { "terms": { "type": "array", "items": { "$ref": "#/definitions/GlossaryTerm" } }, "total": { "type": "integer" } } }, "GlossaryOwner": { "type": "object", "properties": { "email": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "profile_picture": { "type": "string" }, "type": { "description": "\"user\" or \"team\"", "type": "string" }, "username": { "description": "Only for user owners", "type": "string" } } }, "GlossaryTerm": { "type": "object", "properties": { "created_at": { "type": "string" }, "definition": { "description": "Definition is what the last run wrote. On a term a person has\nworded themselves the read path serves UserDefinition here instead,\nso a caller always gets the wording the catalog stands behind.", "type": "string" }, "deleted_at": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/GlossaryOwner" } }, "parent_term_id": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "updated_at": { "type": "string" }, "user_definition": { "description": "UserDefinition is the wording a person gave the term. Ingestion\nreads it and never writes it, so it survives every run.", "type": "string" } } }, "HistogramBucket": { "type": "object", "properties": { "abort": { "type": "integer" }, "complete": { "type": "integer" }, "date": { "type": "string" }, "fail": { "type": "integer" }, "other": { "type": "integer" }, "running": { "type": "integer" }, "total": { "type": "integer" } } }, "HistogramResponse": { "type": "object", "properties": { "buckets": { "type": "array", "items": { "$ref": "#/definitions/HistogramBucket" } }, "period": { "type": "string" } } }, "ImagePurpose": { "type": "string", "enum": [ "icon", "header" ], "x-enum-varnames": [ "ImagePurposeIcon", "ImagePurposeHeader" ] }, "Job": { "type": "object", "properties": { "facets": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "namespace": { "type": "string" } } }, "JobRun": { "type": "object", "properties": { "assets_created": { "type": "integer" }, "assets_deleted": { "type": "integer" }, "assets_updated": { "type": "integer" }, "claimed_at": { "type": "string" }, "claimed_by": { "type": "string" }, "config": { "type": "object", "additionalProperties": true }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "documentation_added": { "type": "integer" }, "error_message": { "type": "string" }, "finished_at": { "type": "string" }, "id": { "type": "string" }, "lineage_created": { "type": "integer" }, "log": { "type": "string" }, "pipeline_name": { "type": "string" }, "plugin_run_id": { "type": "string" }, "run_id": { "type": "string" }, "schedule_id": { "type": "string" }, "source_name": { "type": "string" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "updated_at": { "type": "string" } } }, "LineageEdge": { "type": "object", "properties": { "id": { "type": "string" }, "job_mrn": { "type": "string" }, "last_seen_at": { "type": "string" }, "observation_count": { "type": "integer" }, "origin": { "type": "string" }, "source": { "type": "string" }, "target": { "type": "string" }, "type": { "type": "string" } } }, "LineageNode": { "type": "object", "properties": { "asset": { "$ref": "#/definitions/Asset" }, "depth": { "type": "integer" }, "id": { "type": "string" }, "type": { "type": "string" } } }, "LineageResponse": { "type": "object", "properties": { "edges": { "type": "array", "items": { "$ref": "#/definitions/LineageEdge" } }, "nodes": { "type": "array", "items": { "$ref": "#/definitions/LineageNode" } } } }, "LineageResult": { "type": "object", "properties": { "error": { "type": "string" }, "source": { "type": "string" }, "status": { "type": "string" }, "target": { "type": "string" }, "type": { "type": "string" } } }, "LineageRun": { "type": "object", "properties": { "facets": { "type": "object", "additionalProperties": true }, "runId": { "type": "string" } } }, "ListJobRunsResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "runs": { "type": "array", "items": { "$ref": "#/definitions/JobRun" } }, "total": { "type": "integer" } } }, "ListMembersResponse": { "type": "object", "properties": { "members": { "type": "array", "items": { "$ref": "#/definitions/TeamMemberWithUser" } } } }, "ListPluginsResponse": { "type": "object", "properties": { "loading": { "type": "boolean" }, "plugins": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.Meta" } } } }, "ListSSOMappingsResponse": { "type": "object", "properties": { "mappings": { "type": "array", "items": { "$ref": "#/definitions/SSOTeamMapping" } } } }, "ListSchedulesResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "schedules": { "type": "array", "items": { "$ref": "#/definitions/Schedule" } }, "total": { "type": "integer" } } }, "ListTeamsResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "teams": { "type": "array", "items": { "$ref": "#/definitions/Team" } }, "total": { "type": "integer" } } }, "ListUsersResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "total": { "type": "integer" }, "users": { "type": "array", "items": { "$ref": "#/definitions/User" } } } }, "LoginRequest": { "type": "object", "required": [ "password", "username" ], "properties": { "password": { "type": "string" }, "username": { "type": "string" } } }, "MessageResponse": { "type": "object", "properties": { "message": { "type": "string" } } }, "MetadataFieldSuggestion": { "type": "object", "properties": { "count": { "type": "integer" }, "example": {}, "field": { "type": "string" }, "path_parts": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" }, "types": { "type": "array", "items": { "type": "string" } } } }, "MetadataValueSuggestion": { "type": "object", "properties": { "count": { "type": "integer" }, "example": { "$ref": "#/definitions/Asset" }, "value": { "type": "string" } } }, "OAuthErrorResponse": { "type": "object", "properties": { "error": { "type": "string" }, "error_description": { "type": "string" } } }, "OAuthLinkRequest": { "type": "object", "required": [ "provider", "provider_user_id", "user_id", "user_info" ], "properties": { "provider": { "type": "string" }, "provider_user_id": { "type": "string" }, "user_id": { "type": "string" }, "user_info": { "type": "object", "additionalProperties": true } } }, "OwnerRequest": { "type": "object", "required": [ "id", "type" ], "properties": { "id": { "type": "string" }, "type": { "type": "string", "enum": [ "user", "team" ] } } }, "Permission": { "type": "object", "properties": { "action": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "resource_type": { "type": "string" } } }, "PluginInstanceStatus": { "type": "object", "properties": { "active_queries": { "type": "integer" }, "last_used_at": { "type": "string" }, "plugin_id": { "type": "string" }, "restarts": { "type": "integer" }, "started_at": { "type": "string" } } }, "PluginRun": { "type": "object", "properties": { "completed_at": { "type": "string" }, "config": { "$ref": "#/definitions/RawPluginConfig" }, "created_by": { "type": "string" }, "error_message": { "type": "string" }, "id": { "type": "string" }, "pipeline_name": { "type": "string" }, "run_id": { "type": "string" }, "source_name": { "type": "string" }, "started_at": { "type": "string" }, "status": { "$ref": "#/definitions/RunStatus" }, "summary": { "$ref": "#/definitions/RunSummary" } } }, "PreviewRequest": { "type": "object", "properties": { "limit": { "type": "integer" }, "metadata_field": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "query_expression": { "type": "string" }, "rule_type": { "type": "string" } } }, "PreviewResponse": { "type": "object", "properties": { "column_names": { "type": "array", "items": { "type": "string" } }, "rows": { "type": "array", "items": { "type": "array", "items": {} } }, "total_rows": { "type": "integer" } } }, "ProductImageMeta": { "type": "object", "properties": { "content_type": { "type": "string" }, "created_at": { "type": "string" }, "data_product_id": { "type": "string" }, "filename": { "type": "string" }, "id": { "type": "string" }, "purpose": { "$ref": "#/definitions/ImagePurpose" }, "size_bytes": { "type": "integer" }, "url": { "type": "string" } } }, "QueryAssetContext": { "type": "object", "properties": { "asset_id": { "type": "string" }, "description": { "type": "string" }, "last_sync_at": { "type": "string" }, "mrn": { "type": "string" }, "name": { "type": "string" }, "providers": { "type": "array", "items": { "type": "string" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "QueryColumn": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" } } }, "QueryCount": { "type": "object", "properties": { "count": { "type": "integer" }, "query": { "type": "string" }, "query_type": { "type": "string" } } }, "QueryHistoryResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "queries": { "type": "array", "items": { "$ref": "#/definitions/QueryRecord" } }, "total": { "type": "integer" } } }, "QueryListSourcesResponse": { "type": "object", "properties": { "sources": { "type": "array", "items": { "$ref": "#/definitions/QuerySource" } }, "total": { "type": "integer" } } }, "QueryRecord": { "type": "object", "properties": { "audit_subject": { "type": "string" }, "client": { "type": "string" }, "completed_at": { "type": "string" }, "context": { "type": "array", "items": { "$ref": "#/definitions/QueryAssetContext" } }, "decision": { "type": "string" }, "decision_detail": { "type": "object", "additionalProperties": {} }, "error": { "type": "string" }, "id": { "type": "string" }, "principal_id": { "type": "string" }, "principal_type": { "type": "string" }, "referenced_mrns": { "type": "array", "items": { "type": "string" } }, "rows_returned": { "type": "integer" }, "source_id": { "type": "string" }, "source_name": { "type": "string" }, "started_at": { "type": "string" }, "statement": { "type": "string" }, "status": { "type": "string" }, "truncated": { "type": "boolean" } } }, "QueryResult": { "type": "object", "properties": { "columns": { "type": "array", "items": { "$ref": "#/definitions/QueryColumn" } }, "context": { "type": "array", "items": { "$ref": "#/definitions/QueryAssetContext" } }, "query_id": { "type": "string" }, "referenced_mrns": { "type": "array", "items": { "type": "string" } }, "row_count": { "type": "integer" }, "rows": { "type": "array", "items": { "type": "array", "items": {} } }, "truncated": { "type": "boolean" } } }, "QueryRunInput": { "type": "object", "required": [ "source", "statement" ], "properties": { "max_rows": { "type": "integer" }, "source": { "type": "string" }, "statement": { "type": "string" } } }, "QuerySource": { "type": "object", "properties": { "id": { "type": "string" }, "ingest_on_query": { "type": "boolean" }, "last_queried_at": { "type": "string" }, "name": { "type": "string" }, "plugin_id": { "type": "string" }, "queries_last_week": { "type": "integer" }, "served": { "description": "Served is set when a plugin running outside Marmot answers this source's queries; Marmot then holds no usable config for it.", "type": "boolean" }, "table_count": { "description": "Activity, filled in when sources are listed.", "type": "integer" } } }, "QuerySourceTable": { "type": "object", "properties": { "asset_id": { "type": "string" }, "description": { "type": "string" }, "mrn": { "type": "string" }, "name": { "type": "string" }, "queries": { "type": "integer" }, "sample_statement": { "type": "string" }, "schema": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "QueryStats": { "type": "object", "properties": { "from": { "type": "string" }, "interval": { "type": "string" }, "series": { "type": "array", "items": { "$ref": "#/definitions/QueryStatsPoint" } }, "to": { "type": "string" }, "top_callers": { "type": "array", "items": { "$ref": "#/definitions/QueryStatsGroup" } }, "top_sources": { "type": "array", "items": { "$ref": "#/definitions/QueryStatsGroup" } }, "top_tables": { "type": "array", "items": { "$ref": "#/definitions/QueryStatsGroup" } }, "totals": { "$ref": "#/definitions/QueryStatsTotals" } } }, "QueryStatsGroup": { "type": "object", "properties": { "allowed": { "type": "integer" }, "denied": { "type": "integer" }, "key": { "type": "string" }, "label": { "type": "string" }, "plugin_id": { "type": "string" }, "principal_type": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "total": { "type": "integer" } } }, "QueryStatsPoint": { "type": "object", "properties": { "bucket": { "type": "string" }, "denied": { "type": "integer" }, "failed": { "type": "integer" }, "succeeded": { "type": "integer" } } }, "QueryStatsTotals": { "type": "object", "properties": { "allowed": { "type": "integer" }, "callers": { "type": "integer" }, "denied": { "type": "integer" }, "failed": { "type": "integer" }, "queries": { "type": "integer" }, "tables": { "type": "integer" } } }, "QueryStatusResponse": { "type": "object", "properties": { "instances": { "type": "array", "items": { "$ref": "#/definitions/PluginInstanceStatus" } } } }, "RawPluginConfig": { "type": "object", "additionalProperties": true }, "RecordRunRequest": { "type": "object", "properties": { "agent_mrn": { "type": "string" }, "ended_at": { "type": "string" }, "error": { "type": "string" }, "model": { "type": "string" }, "observed_assets": { "type": "array", "items": { "type": "string" } }, "run_id": { "type": "string" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "tokens_in": { "type": "integer" }, "tokens_out": { "type": "integer" }, "tool_calls": { "type": "array", "items": { "$ref": "#/definitions/ToolCallPayload" } } } }, "ReindexAcceptedResponse": { "type": "object", "properties": { "message": { "type": "string", "example": "Reindex started" }, "status": { "type": "string", "example": "accepted" } } }, "ReindexStatusResponse": { "type": "object", "properties": { "es_configured": { "type": "boolean" }, "running": { "type": "boolean" } } }, "RemoveTermRequest": { "type": "object", "required": [ "term_id" ], "properties": { "term_id": { "type": "string" } } }, "Result": { "type": "object", "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "rank": { "type": "number" }, "type": { "$ref": "#/definitions/ResultType" }, "updated_at": { "type": "string" }, "url": { "type": "string" } } }, "ResultType": { "type": "string", "enum": [ "asset", "glossary", "team", "data_product" ], "x-enum-varnames": [ "ResultTypeAsset", "ResultTypeGlossary", "ResultTypeTeam", "ResultTypeDataProduct" ] }, "Role": { "type": "object", "properties": { "created_at": { "type": "string" }, "deleted_at": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "is_system": { "type": "boolean" }, "name": { "type": "string" }, "permission_keys": { "description": "PermissionKeys are the same permissions as resource_type:action keys, the form a role document is written in.", "type": "array", "items": { "type": "string" } }, "permissions": { "type": "array", "items": { "$ref": "#/definitions/RolePermission" } }, "updated_at": { "type": "string" }, "user_count": { "type": "integer" } } }, "RoleDocumentProblem": { "type": "object", "properties": { "message": { "type": "string" }, "path": { "type": "string" } } }, "RolePermission": { "type": "object", "properties": { "action": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "resource_type": { "type": "string" } } }, "RulePreview": { "type": "object", "properties": { "asset_count": { "type": "integer" }, "asset_ids": { "type": "array", "items": { "type": "string" } }, "errors": { "type": "array", "items": { "type": "string" } } } }, "RuleType": { "type": "string", "enum": [ "query", "metadata_match" ], "x-enum-varnames": [ "RuleTypeQuery", "RuleTypeMetadataMatch" ] }, "RunCreateAssetRequest": { "type": "object", "properties": { "description": { "type": "string" }, "external_links": { "type": "array", "items": { "type": "object", "additionalProperties": { "type": "string" } } }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "providers": { "type": "array", "items": { "type": "string" } }, "schema": { "type": "object", "additionalProperties": true }, "sources": { "type": "array", "items": { "$ref": "#/definitions/AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "terms": { "description": "Terms are the names of glossary terms assigned to this asset.", "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "RunEntitiesResponse": { "type": "object", "properties": { "entities": { "type": "array", "items": { "$ref": "#/definitions/RunEntity" } }, "limit": { "type": "integer" }, "offset": { "type": "integer" }, "total": { "type": "integer" } } }, "RunEntity": { "type": "object", "properties": { "created_at": { "type": "string" }, "entity_mrn": { "type": "string" }, "entity_name": { "type": "string" }, "entity_type": { "type": "string" }, "error_message": { "type": "string" }, "id": { "type": "string" }, "run_id": { "type": "string" }, "status": { "type": "string" } } }, "RunEvent": { "type": "object", "properties": { "eventTime": { "type": "string" }, "eventType": { "type": "string" }, "inputs": { "type": "array", "items": { "$ref": "#/definitions/Dataset" } }, "job": { "$ref": "#/definitions/Job" }, "outputs": { "type": "array", "items": { "$ref": "#/definitions/Dataset" } }, "producer": { "type": "string" }, "run": { "$ref": "#/definitions/LineageRun" }, "schemaURL": { "type": "string" } } }, "RunHistory": { "type": "object", "properties": { "duration_ms": { "type": "integer" }, "end_time": { "type": "string" }, "event_time": { "type": "string" }, "id": { "type": "string" }, "job_name": { "type": "string" }, "job_namespace": { "type": "string" }, "run_id": { "type": "string" }, "start_time": { "type": "string" }, "status": { "type": "string" }, "type": { "type": "string" } } }, "RunHistoryResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "run_history": { "type": "array", "items": { "$ref": "#/definitions/RunHistory" } }, "total": { "type": "integer" } } }, "RunStatus": { "type": "string", "enum": [ "running", "completed", "failed", "cancelled" ], "x-enum-varnames": [ "StatusRunning", "StatusCompleted", "StatusFailed", "StatusCancelled" ] }, "RunSummary": { "type": "object", "properties": { "assets_created": { "type": "integer" }, "assets_deleted": { "type": "integer" }, "assets_terms_linked": { "type": "integer" }, "assets_updated": { "type": "integer" }, "documentation_added": { "type": "integer" }, "duration_seconds": { "type": "integer" }, "errors_count": { "type": "integer" }, "glossary_terms_created": { "description": "Glossary counts are absent from runs that predate them, and from\nsources that curate no business terms.", "type": "integer" }, "glossary_terms_updated": { "type": "integer" }, "lineage_created": { "type": "integer" }, "lineage_updated": { "type": "integer" }, "total_entities": { "type": "integer" } } }, "RunsResponse": { "type": "object", "properties": { "runs": { "type": "array", "items": { "$ref": "#/definitions/AgentRun" } }, "total": { "type": "integer" } } }, "SSOProvider": { "type": "object", "properties": { "issuer_url": { "type": "string" }, "name": { "type": "string" }, "type": { "type": "string" } } }, "SSOProvidersResponse": { "type": "object", "properties": { "providers": { "type": "array", "items": { "$ref": "#/definitions/SSOProvider" } } } }, "SSOTeamMapping": { "type": "object", "properties": { "created_at": { "type": "string" }, "id": { "type": "string" }, "member_role": { "type": "string" }, "provider": { "type": "string" }, "sso_group_name": { "type": "string" }, "team_id": { "type": "string" }, "updated_at": { "type": "string" } } }, "Schedule": { "type": "object", "properties": { "config": { "type": "object", "additionalProperties": true }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "cron_expression": { "type": "string" }, "enabled": { "type": "boolean" }, "id": { "type": "string" }, "ingest_on_query": { "type": "boolean" }, "last_run_at": { "type": "string" }, "last_run_status": { "type": "string" }, "managed_by": { "type": "string" }, "name": { "type": "string" }, "next_run_at": { "type": "string" }, "plugin_id": { "type": "string" }, "queryable": { "type": "boolean" }, "served_by_id": { "type": "string" }, "served_by_type": { "description": "ServedByType and ServedByID name the principal whose plugin, running outside Marmot, serves this source's queries; nil when Marmot runs the plugin itself.", "type": "string" }, "updated_at": { "type": "string" } } }, "SearchOwnersResponse": { "type": "object", "properties": { "owners": { "type": "array", "items": { "$ref": "#/definitions/TeamOwner" } } } }, "SearchResponse": { "type": "object", "properties": { "facets": { "$ref": "#/definitions/Facets" }, "limit": { "type": "integer" }, "offset": { "type": "integer" }, "results": { "type": "array", "items": { "$ref": "#/definitions/Result" } }, "total": { "type": "integer" } } }, "ServeKeyGeneration": { "type": "object", "properties": { "activates_at": { "type": "string" }, "active": { "type": "boolean" }, "id": { "type": "string" }, "retires_at": { "type": "string" }, "storage": { "type": "string" } } }, "ServeRotateKeysRequest": { "type": "object", "properties": { "ca_key_uri": { "description": "CAKeyURI and SigningKeyURI name new KMS keys. Leave both empty to have Marmot generate keys it stores encrypted, which is refused when the current keys are in a KMS.", "type": "string" }, "immediate": { "description": "Immediate switches to the new keys at once and stops trusting the old ones, for a suspected compromise; serving plugins must then be restarted.", "type": "boolean" }, "signing_key_uri": { "type": "string" } } }, "ServiceAccount": { "type": "object", "properties": { "active": { "type": "boolean" }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "roles": { "type": "array", "items": { "$ref": "#/definitions/Role" } }, "updated_at": { "type": "string" } } }, "ServiceAccountAPIKey": { "type": "object", "properties": { "created_at": { "type": "string" }, "expires_at": { "type": "string" }, "id": { "type": "string" }, "key": { "type": "string" }, "last_used_at": { "type": "string" }, "name": { "type": "string" }, "service_account_id": { "type": "string" } } }, "StartRunRequest": { "type": "object", "required": [ "pipeline_name", "source_name" ], "properties": { "config": { "$ref": "#/definitions/RawPluginConfig" }, "pipeline_name": { "type": "string" }, "source_name": { "type": "string" } } }, "Stats": { "type": "object", "properties": { "median_latency_ms": { "type": "integer" }, "p95_latency_ms": { "type": "integer" }, "run_count": { "type": "integer" }, "success_rate": { "type": "number" }, "tokens_in": { "type": "integer" }, "tokens_out": { "type": "integer" } } }, "TagRequest": { "type": "object", "required": [ "tag" ], "properties": { "tag": { "type": "string" } } }, "Team": { "type": "object", "properties": { "created_at": { "type": "string" }, "created_by": { "type": "string" }, "created_via_sso": { "type": "boolean" }, "description": { "type": "string" }, "id": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "sso_provider": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "updated_at": { "type": "string" } } }, "TeamMemberWithUser": { "type": "object", "properties": { "email": { "type": "string" }, "id": { "type": "string" }, "joined_at": { "type": "string" }, "name": { "type": "string" }, "profile_picture": { "type": "string" }, "role": { "type": "string" }, "source": { "type": "string" }, "sso_provider": { "type": "string" }, "team_id": { "type": "string" }, "user_id": { "type": "string" }, "username": { "type": "string" } } }, "TeamOwner": { "type": "object", "properties": { "email": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "profile_picture": { "type": "string" }, "type": { "type": "string" }, "username": { "type": "string" } } }, "TokenExchangeResponse": { "type": "object", "properties": { "access_token": { "type": "string" }, "expires_in": { "type": "integer" }, "issued_token_type": { "type": "string" }, "token_type": { "type": "string" } } }, "TokenResponse": { "type": "object", "properties": { "access_token": { "type": "string" }, "expires_in": { "type": "integer" }, "requires_password_change": { "type": "boolean" }, "token_type": { "type": "string" } } }, "ToolCall": { "type": "object", "properties": { "duration_ms": { "type": "integer" }, "ordinal": { "type": "integer" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "target_mrn": { "type": "string" }, "tool_name": { "type": "string" } } }, "ToolCallPayload": { "type": "object", "properties": { "duration_ms": { "type": "integer" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "target_mrn": { "type": "string" }, "tool_name": { "type": "string" } } }, "TotalAssetsResponse": { "type": "object", "properties": { "count": { "type": "integer" } } }, "UIConfigResponse": { "type": "object", "properties": { "allow_unencrypted": { "type": "boolean" }, "banner": { "$ref": "#/definitions/BannerResponse" }, "default_language": { "type": "string" }, "encryption_configured": { "type": "boolean" }, "table_preview_enabled": { "type": "boolean" } } }, "UpdateAssetRequest": { "type": "object", "properties": { "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/AssetExternalLink" } }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "providers": { "type": "array", "items": { "type": "string" } }, "schema": { "type": "object", "additionalProperties": { "type": "string" } }, "sources": { "type": "array", "items": { "$ref": "#/definitions/AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" }, "user_description": { "type": "string" } } }, "UpdateAssetRuleRequest": { "type": "object", "properties": { "description": { "type": "string" }, "is_enabled": { "type": "boolean" }, "links": { "type": "array", "items": { "$ref": "#/definitions/AssetRuleExternalLink" } }, "metadata_field": { "type": "string" }, "name": { "type": "string" }, "pattern_type": { "type": "string" }, "pattern_value": { "type": "string" }, "priority": { "type": "integer" }, "query_expression": { "type": "string" }, "rule_type": { "type": "string" }, "term_ids": { "type": "array", "items": { "type": "string" } } } }, "UpdateDataProductRequest": { "type": "object", "properties": { "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/DataProductOwnerRequest" } }, "tags": { "type": "array", "items": { "type": "string" } } } }, "UpdateMemberRoleRequest": { "type": "object", "properties": { "role": { "type": "string" } } }, "UpdatePasswordRequest": { "type": "object", "required": [ "new_password" ], "properties": { "new_password": { "type": "string", "minLength": 8 } } }, "UpdateSSOMappingRequest": { "type": "object", "properties": { "member_role": { "type": "string" }, "team_id": { "type": "string" } } }, "UpdateScheduleRequest": { "type": "object", "properties": { "config": { "type": "object", "additionalProperties": true }, "cron_expression": { "type": "string" }, "enabled": { "type": "boolean" }, "ingest_on_query": { "description": "IngestOnQuery refreshes the source's catalog in the background after\ndata queries, rate-limited per source.", "type": "boolean" }, "name": { "type": "string" }, "plugin_id": { "type": "string" }, "queryable": { "description": "Queryable lets agents and users query this source through Marmot; the\nplugin must support queries.", "type": "boolean" } } }, "UpdateServiceAccountRequest": { "type": "object", "properties": { "active": { "type": "boolean" }, "description": { "type": "string" }, "name": { "type": "string" }, "role_ids": { "type": "array", "items": { "type": "string" } } } }, "UpdateTeamRequest": { "type": "object", "properties": { "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } } }, "UpdateTermRequest": { "type": "object", "properties": { "definition": { "type": "string" }, "description": { "type": "string" }, "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "owners": { "type": "array", "items": { "$ref": "#/definitions/OwnerRequest" } }, "parent_term_id": { "type": "string" } } }, "UpdateUserInput": { "type": "object", "properties": { "active": { "type": "boolean" }, "email": { "type": "string" }, "name": { "type": "string" }, "password": { "type": "string", "minLength": 8 }, "preferences": { "type": "object", "additionalProperties": true }, "profile_picture": { "type": "string" }, "role_names": { "type": "array", "minItems": 1, "items": { "type": "string" } } } }, "User": { "type": "object", "properties": { "active": { "type": "boolean" }, "created_at": { "type": "string" }, "id": { "type": "string" }, "identities": { "type": "array", "items": { "$ref": "#/definitions/UserIdentity" } }, "must_change_password": { "type": "boolean" }, "name": { "type": "string" }, "preferences": { "type": "object", "additionalProperties": true }, "profile_picture": { "type": "string" }, "roles": { "type": "array", "items": { "$ref": "#/definitions/UserRole" } }, "sessions_invalidated_at": { "description": "Tokens issued before this moment are rejected at validation, so setting it to now signs the user out of every session at once.", "type": "string" }, "updated_at": { "type": "string" }, "username": { "type": "string" } } }, "UserIdentity": { "type": "object", "properties": { "created_at": { "type": "string" }, "id": { "type": "string" }, "provider": { "type": "string" }, "provider_data": { "type": "object", "additionalProperties": true }, "provider_email": { "type": "string" }, "provider_user_id": { "type": "string" }, "updated_at": { "type": "string" }, "user_id": { "type": "string" } } }, "UserRole": { "type": "object", "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "permissions": { "type": "array", "items": { "$ref": "#/definitions/Permission" } } } }, "ValidateConfigRequest": { "type": "object", "properties": { "config": { "type": "object", "additionalProperties": true }, "plugin_id": { "type": "string" } } }, "ValidateConfigResponse": { "type": "object", "properties": { "errors": { "type": "array", "items": { "$ref": "#/definitions/ValidationErrorDetail" } }, "valid": { "type": "boolean" } } }, "ValidateRoleResponse": { "type": "object", "properties": { "problems": { "type": "array", "items": { "$ref": "#/definitions/RoleDocumentProblem" } }, "valid": { "type": "boolean" } } }, "ValidationErrorDetail": { "type": "object", "properties": { "field": { "type": "string" }, "message": { "type": "string" } } }, "ValidationErrorResponse": { "type": "object", "properties": { "error": { "type": "string" }, "fields": { "type": "array", "items": { "$ref": "#/definitions/ValidationErrorDetail" } } } }, "pluginsdk.AssetField": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" }, "type": { "type": "string" } } }, "pluginsdk.AssetSchema": { "type": "object", "properties": { "description": { "type": "string" }, "display_name": { "type": "string" }, "fields": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.AssetField" } }, "struct_name": { "type": "string" } } }, "pluginsdk.ConfigField": { "type": "object", "properties": { "default": {}, "description": { "type": "string" }, "fields": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.ConfigField" } }, "group": { "description": "Group names the section a field belongs to in the UI, such as \"Authentication\" or \"Advanced\"; fields without one are shown first and each group renders as its own collapsed section", "type": "string" }, "hidden": { "type": "boolean" }, "is_array": { "type": "boolean" }, "label": { "type": "string" }, "name": { "type": "string" }, "options": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.FieldOption" } }, "placeholder": { "type": "string" }, "required": { "type": "boolean" }, "sensitive": { "type": "boolean" }, "show_when": { "$ref": "#/definitions/pluginsdk.ShowWhen" }, "type": { "$ref": "#/definitions/pluginsdk.FieldType" }, "validation": { "$ref": "#/definitions/pluginsdk.Validation" } } }, "pluginsdk.FieldOption": { "type": "object", "properties": { "label": { "type": "string" }, "value": { "type": "string" } } }, "pluginsdk.FieldType": { "type": "string", "enum": [ "string", "int", "bool", "select", "multiselect", "password", "object" ], "x-enum-varnames": [ "FieldTypeString", "FieldTypeInt", "FieldTypeBool", "FieldTypeSelect", "FieldTypeMultiselect", "FieldTypePassword", "FieldTypeObject" ] }, "pluginsdk.Meta": { "type": "object", "properties": { "asset_schemas": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.AssetSchema" } }, "category": { "type": "string" }, "config_spec": { "type": "array", "items": { "$ref": "#/definitions/pluginsdk.ConfigField" } }, "description": { "type": "string" }, "features": { "type": "array", "items": { "type": "string" } }, "icon": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "status": { "type": "string" }, "supports_data_preview": { "type": "boolean" }, "supports_query": { "type": "boolean" } } }, "pluginsdk.ShowWhen": { "type": "object", "properties": { "field": { "type": "string" }, "value": { "type": "string" } } }, "pluginsdk.Validation": { "type": "object", "properties": { "max": { "type": "integer" }, "max_len": { "type": "integer" }, "min": { "type": "integer" }, "min_len": { "type": "integer" }, "pattern": { "type": "string" } } }, "pluginserve.EnrolInput": { "type": "object", "properties": { "csr": { "type": "string" }, "sources": { "type": "array", "items": { "$ref": "#/definitions/pluginserve.EnrolSource" } } } }, "pluginserve.EnrolResult": { "type": "object", "properties": { "address": { "description": "Address is the host:port to dial; when empty the serving process uses its Marmot host name with Port.", "type": "string" }, "ca_bundle": { "type": "string" }, "certificate": { "type": "string" }, "enrolment_id": { "type": "string" }, "expires_at": { "type": "string" }, "instance_id": { "type": "string" }, "port": { "type": "string" }, "signing_keys": { "type": "array", "items": { "type": "string" } } } }, "pluginserve.EnrolSource": { "type": "object", "properties": { "config": { "type": "object", "additionalProperties": {} }, "name": { "type": "string" }, "plugin_id": { "type": "string" } } }, "v1_roles.createRoleRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" }, "permission_ids": { "type": "array", "items": { "type": "string" } }, "permission_keys": { "description": "PermissionKeys names permissions as resource_type:action keys, the form a hand-written role document uses.", "type": "array", "items": { "type": "string" } } } }, "v1_roles.replacePermissionsRequest": { "type": "object", "properties": { "permission_ids": { "type": "array", "items": { "type": "string" } }, "permission_keys": { "description": "PermissionKeys names permissions as resource_type:action keys. They are added to PermIDs.", "type": "array", "items": { "type": "string" } } } }, "v1_roles.updateRoleRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" } } } }, "securityDefinitions": { "ApiKeyAuth": { "type": "apiKey", "name": "X-API-Key", "in": "header" }, "BearerAuth": { "description": "Type \"Bearer\" followed by a space and JWT.", "type": "apiKey", "name": "Authorization", "in": "header" } } }