{ "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" }, "basePath": "/api/v1", "paths": { "/api/v1/lineage": { "post": { "description": "Process OpenLineage run events and update assets/lineage accordingly", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Ingest OpenLineage event", "parameters": [ { "description": "OpenLineage run event", "name": "event", "in": "body", "required": true, "schema": { "$ref": "#/definitions/lineage.RunEvent" } } ], "responses": { "200": { "description": "Event processed successfully" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/api/v1/metrics": { "get": { "description": "Get aggregated metrics for dashboard display", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get metrics for UI", "parameters": [ { "type": "string", "example": "2024-01-01T00:00:00Z", "description": "Start time (ISO 8601)", "name": "start", "in": "query", "required": true }, { "type": "string", "example": "2024-01-02T00:00:00Z", "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/metrics.GetMetricsResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/api/v1/metrics/assets/by-owner": { "get": { "description": "Get asset counts grouped by owner", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by owner", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/metrics.AssetsByOwnerResponse" } } } } }, "/api/v1/metrics/assets/by-provider": { "get": { "description": "Get asset counts grouped by provider", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by provider", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/metrics.AssetsByProviderResponse" } } } } }, "/api/v1/metrics/assets/by-type": { "get": { "description": "Get asset counts grouped by type", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets by type", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/metrics.AssetsByTypeResponse" } } } } }, "/api/v1/metrics/assets/total": { "get": { "description": "Get the total number of assets", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get total assets count", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/metrics.TotalAssetsResponse" } } } } }, "/api/v1/metrics/assets/with-schemas": { "get": { "description": "Get the count of assets that have schemas defined", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get assets with schemas count", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/metrics.AssetsWithSchemasResponse" } } } } }, "/api/v1/metrics/top-assets": { "get": { "description": "Get the most viewed assets", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get top viewed assets", "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/metrics.AssetCount" } } } } } }, "/api/v1/metrics/top-queries": { "get": { "description": "Get the most popular search queries", "produces": [ "application/json" ], "tags": [ "metrics" ], "summary": "Get top search queries", "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/metrics.QueryCount" } } } } } }, "/assets": { "post": { "description": "Create a new asset in the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Create a new asset", "parameters": [ { "description": "Asset creation request", "name": "asset", "in": "body", "required": true, "schema": { "$ref": "#/definitions/assets.CreateRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/asset.Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/batch": { "post": { "description": "Create or update multiple assets in a single request", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Batch create assets", "parameters": [ { "description": "Batch creation request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/assets.BatchCreateRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/assets.BatchCreateResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/documentation": { "post": { "description": "Create or update documentation for an asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Create asset documentation", "parameters": [ { "description": "Documentation creation request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/assets.DocumentationCreateRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/assetdocs.Documentation" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/documentation/batch": { "post": { "description": "Create or update documentation for multiple assets", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Batch create documentation", "parameters": [ { "description": "Batch documentation request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/assets.BatchDocumentationRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/assets.BatchDocumentationResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/documentation/{mrn}": { "get": { "description": "Get documentation for a specific asset", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset documentation", "parameters": [ { "type": "string", "format": "url", "description": "Asset MRN", "name": "mrn", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/assetdocs.Documentation" } } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/list": { "get": { "description": "Get a paginated list of assets", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "List assets with pagination", "parameters": [ { "type": "integer", "description": "Offset for pagination", "name": "offset", "in": "query" }, { "type": "integer", "description": "Limit for pagination", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.ListResult" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/lookup/{type}/{name}": { "get": { "description": "Get an asset using its type and name", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Lookup asset by type and name", "parameters": [ { "type": "string", "description": "Asset type", "name": "type", "in": "path", "required": true }, { "type": "string", "description": "Asset name", "name": "name", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/match-pattern": { "get": { "description": "Find assets matching a pattern", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Match asset pattern", "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.Asset" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/qualified-name/{qualifiedName}": { "get": { "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", "parameters": [ { "type": "string", "description": "Asset qualified name", "name": "qualifiedName", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/search": { "get": { "description": "Search for assets using query string and filters", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Search assets", "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/assets.SearchResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/suggestions/metadata/fields": { "get": { "description": "Get suggestions for metadata fields and their types", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get metadata field suggestions", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/asset.MetadataFieldSuggestion" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/suggestions/metadata/values": { "get": { "description": "Get suggestions for values of a specific metadata field", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get metadata value suggestions", "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/asset.MetadataValueSuggestion" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/suggestions/tags": { "get": { "description": "Get suggestions for asset tags", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get tag suggestions", "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/common.ErrorResponse" } } } } }, "/assets/summary": { "get": { "description": "Get the total count of assets by type", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset summary", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/assets.AssetSummaryResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/{id}": { "get": { "description": "Get detailed information about a specific asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get an asset by ID", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "put": { "description": "Update an existing asset's information", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Update an asset", "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/assets.UpdateRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "delete": { "description": "Delete an asset from the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Delete an asset", "parameters": [ { "type": "string", "description": "Asset ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/{id}/run-history": { "get": { "description": "Get paginated run history for a specific asset", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset run history", "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/assets.RunHistoryResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/{id}/run-history/histogram": { "get": { "description": "Get histogram data for asset run history over specified period", "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Get asset run history histogram", "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/assets.HistogramResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/assets/{id}/tags": { "post": { "description": "Add a new tag to an existing asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Add tag to asset", "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/assets.TagRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "delete": { "description": "Remove a tag from an existing asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "assets" ], "summary": "Remove tag from asset", "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/assets.TagRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/asset.Asset" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/auth/config": { "get": { "description": "Returns the enabled auth providers without sensitive data", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Get auth configuration", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/auth.AuthConfig" } } } } }, "/auth/okta/callback": { "get": { "description": "Processes the OAuth callback from Okta", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Handle Okta OAuth callback", "parameters": [ { "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/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/auth/okta/login": { "get": { "description": "Redirects the user to Okta for authentication", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Initiate Okta OAuth login", "responses": { "307": { "description": "Temporary Redirect", "schema": { "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/lineage/assets/{id}": { "get": { "description": "Get upstream and downstream lineage for a specific asset", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Get asset lineage", "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" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/lineage.LineageResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/lineage/batch": { "post": { "description": "Create lineage edges in batch", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Batch create lineage edges", "parameters": [ { "description": "Array of lineage edges to create", "name": "edges", "in": "body", "required": true, "schema": { "type": "array", "items": { "$ref": "#/definitions/lineage.LineageEdge" } } } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/lineage.BatchLineageResult" } } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/lineage/direct": { "post": { "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", "parameters": [ { "description": "Lineage edge to create", "name": "edge", "in": "body", "required": true, "schema": { "$ref": "#/definitions/lineage.LineageEdge" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/lineage.LineageEdge" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/lineage/direct/{id}": { "get": { "description": "Get a specific direct lineage connection by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Get direct lineage by ID", "parameters": [ { "type": "string", "format": "uuid", "description": "Edge ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/lineage.LineageEdge" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "delete": { "description": "Delete a direct lineage connection by its ID", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "lineage" ], "summary": "Delete direct lineage", "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/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users": { "get": { "description": "Get a list of users with optional filtering", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "List users", "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/users.ListUsersResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "post": { "description": "Create a new user in the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Create a new user", "parameters": [ { "description": "User creation request", "name": "user", "in": "body", "required": true, "schema": { "$ref": "#/definitions/user.CreateUserInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/user.User" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "409": { "description": "Conflict", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/apikeys": { "get": { "description": "Get all API keys for a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "List API keys", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/user.APIKey" } } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "post": { "description": "Create a new API key for a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Create API key", "parameters": [ { "description": "API key creation request", "name": "key", "in": "body", "required": true, "schema": { "$ref": "#/definitions/users.CreateAPIKeyRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/user.APIKey" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/apikeys/{id}": { "delete": { "description": "Delete an API key", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Delete API key", "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/common.ErrorResponse" } } } } }, "/users/login": { "post": { "description": "Authenticate a user with username/email and password", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Login user", "parameters": [ { "description": "Login credentials", "name": "credentials", "in": "body", "required": true, "schema": { "$ref": "#/definitions/users.LoginRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/users.TokenResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/me": { "get": { "security": [ { "BearerAuth": [] } ], "description": "Get detailed information about the currently authenticated user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Get current user profile", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/user.User" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/oauth/link": { "post": { "description": "Link an OAuth account to an existing user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Link OAuth account", "parameters": [ { "description": "OAuth account link request", "name": "link", "in": "body", "required": true, "schema": { "$ref": "#/definitions/users.OAuthLinkRequest" } } ], "responses": { "200": { "description": "OK" }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/oauth/unlink/{id}/{provider}": { "delete": { "description": "Unlink an OAuth account from a user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Unlink OAuth account", "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/common.ErrorResponse" } } } } }, "/users/preferences": { "put": { "description": "Update preferences for the current user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update user preferences", "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/common.ErrorResponse" } } } } }, "/users/update-password": { "post": { "description": "Update current user's password", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update user password", "parameters": [ { "description": "Password update request", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/users.UpdatePasswordRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/users.TokenResponse" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "401": { "description": "Unauthorized", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } }, "/users/{id}": { "get": { "description": "Get detailed information about a specific user", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Get a user by ID", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/user.User" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "put": { "description": "Update user information", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Update a user", "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/user.UpdateUserInput" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/user.User" } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } }, "delete": { "description": "Delete a user from the system", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "users" ], "summary": "Delete a user", "parameters": [ { "type": "string", "description": "User ID", "name": "id", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "404": { "description": "Not Found", "schema": { "$ref": "#/definitions/common.ErrorResponse" } }, "500": { "description": "Internal Server Error", "schema": { "$ref": "#/definitions/common.ErrorResponse" } } } } } }, "definitions": { "asset.Asset": { "type": "object", "properties": { "created_at": { "type": "string" }, "created_by": { "type": "string" }, "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/asset.Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/asset.ExternalLink" } }, "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/asset.AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" }, "updated_at": { "type": "string" } } }, "asset.AssetSource": { "type": "object", "properties": { "last_sync_at": { "type": "string" }, "name": { "type": "string" }, "priority": { "type": "integer" }, "properties": { "type": "object", "additionalProperties": true } } }, "asset.AvailableFilters": { "type": "object", "properties": { "providers": { "type": "object", "additionalProperties": { "type": "integer" } }, "tags": { "type": "object", "additionalProperties": { "type": "integer" } }, "types": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "asset.Environment": { "type": "object", "properties": { "metadata": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "path": { "type": "string" } } }, "asset.ExternalLink": { "type": "object", "properties": { "icon": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } }, "asset.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" } } }, "asset.ListResult": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/definitions/asset.Asset" } }, "filters": { "$ref": "#/definitions/asset.AvailableFilters" }, "total": { "type": "integer" } } }, "asset.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" } } } }, "asset.MetadataValueSuggestion": { "type": "object", "properties": { "count": { "type": "integer" }, "example": { "$ref": "#/definitions/asset.Asset" }, "value": { "type": "string" } } }, "asset.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" } } }, "assetdocs.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" } } }, "assets.AssetSummaryResponse": { "type": "object", "properties": { "services": { "type": "object", "additionalProperties": { "type": "integer" } }, "tags": { "type": "object", "additionalProperties": { "type": "integer" } }, "types": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "assets.BatchAssetResult": { "type": "object", "properties": { "asset": { "$ref": "#/definitions/asset.Asset" }, "error": { "type": "string" }, "status": { "type": "string" } } }, "assets.BatchCreateRequest": { "type": "object", "required": [ "assets" ], "properties": { "assets": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/assets.CreateRequest" } }, "config": { "$ref": "#/definitions/plugin.RawPluginConfig" } } }, "assets.BatchCreateResponse": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/definitions/assets.BatchAssetResult" } } } }, "assets.BatchDocumentationRequest": { "type": "object", "required": [ "documentation" ], "properties": { "documentation": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/assetdocs.Documentation" } } } }, "assets.BatchDocumentationResponse": { "type": "object", "properties": { "results": { "type": "array", "items": { "$ref": "#/definitions/assets.BatchDocumentationResult" } } } }, "assets.BatchDocumentationResult": { "type": "object", "properties": { "documentation": { "$ref": "#/definitions/assetdocs.Documentation" }, "error": { "type": "string" }, "status": { "type": "string" } } }, "assets.CreateRequest": { "type": "object", "required": [ "name", "providers", "type" ], "properties": { "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/asset.Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/asset.ExternalLink" } }, "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/asset.AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "assets.DocumentationCreateRequest": { "type": "object", "required": [ "content", "mrn", "source" ], "properties": { "content": { "type": "string" }, "mrn": { "type": "string" }, "source": { "type": "string" } } }, "assets.HistogramResponse": { "type": "object", "properties": { "buckets": { "type": "array", "items": { "$ref": "#/definitions/asset.HistogramBucket" } }, "period": { "type": "string" } } }, "assets.RunHistoryResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "run_history": { "type": "array", "items": { "$ref": "#/definitions/asset.RunHistory" } }, "total": { "type": "integer" } } }, "assets.SearchResponse": { "type": "object", "properties": { "assets": { "type": "array", "items": { "$ref": "#/definitions/asset.Asset" } }, "filters": { "$ref": "#/definitions/asset.AvailableFilters" }, "limit": { "type": "integer" }, "offset": { "type": "integer" }, "total": { "type": "integer" } } }, "assets.TagRequest": { "type": "object", "required": [ "tag" ], "properties": { "tag": { "type": "string" } } }, "assets.UpdateRequest": { "type": "object", "properties": { "description": { "type": "string" }, "environments": { "type": "object", "additionalProperties": { "$ref": "#/definitions/asset.Environment" } }, "external_links": { "type": "array", "items": { "$ref": "#/definitions/asset.ExternalLink" } }, "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/asset.AssetSource" } }, "tags": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string" } } }, "auth.AuthConfig": { "type": "object", "properties": { "enabled_providers": { "type": "array", "items": { "type": "string" } } } }, "common.ErrorResponse": { "type": "object", "properties": { "error": { "type": "string" } } }, "lineage.BatchLineageResult": { "type": "object", "properties": { "edge": { "$ref": "#/definitions/lineage.LineageEdge" }, "status": { "description": "\"created\", \"duplicate\", or \"existing\"", "type": "string" } } }, "lineage.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 } } }, "lineage.Job": { "type": "object", "properties": { "facets": { "type": "object", "additionalProperties": true }, "name": { "type": "string" }, "namespace": { "type": "string" } } }, "lineage.LineageEdge": { "type": "object", "properties": { "id": { "type": "string" }, "job_mrn": { "type": "string" }, "source": { "type": "string" }, "target": { "type": "string" }, "type": { "type": "string" } } }, "lineage.LineageNode": { "type": "object", "properties": { "asset": { "$ref": "#/definitions/asset.Asset" }, "depth": { "type": "integer" }, "id": { "type": "string" }, "type": { "type": "string" } } }, "lineage.LineageResponse": { "type": "object", "properties": { "edges": { "type": "array", "items": { "$ref": "#/definitions/lineage.LineageEdge" } }, "nodes": { "type": "array", "items": { "$ref": "#/definitions/lineage.LineageNode" } } } }, "lineage.Run": { "type": "object", "properties": { "facets": { "type": "object", "additionalProperties": true }, "runId": { "type": "string" } } }, "lineage.RunEvent": { "type": "object", "properties": { "eventTime": { "type": "string" }, "eventType": { "type": "string" }, "inputs": { "type": "array", "items": { "$ref": "#/definitions/lineage.Dataset" } }, "job": { "$ref": "#/definitions/lineage.Job" }, "outputs": { "type": "array", "items": { "$ref": "#/definitions/lineage.Dataset" } }, "producer": { "type": "string" }, "run": { "$ref": "#/definitions/lineage.Run" }, "schemaURL": { "type": "string" } } }, "metrics.AggregatedMetric": { "type": "object", "properties": { "aggregation_type": { "type": "string" }, "bucket_end": { "type": "string" }, "bucket_size": { "$ref": "#/definitions/time.Duration" }, "bucket_start": { "type": "string" }, "labels": { "type": "object", "additionalProperties": { "type": "string" } }, "name": { "type": "string" }, "value": { "type": "number" } } }, "metrics.AssetCount": { "type": "object", "properties": { "asset_id": { "type": "string" }, "asset_name": { "type": "string" }, "asset_provider": { "type": "string" }, "asset_type": { "type": "string" }, "count": { "type": "integer" } } }, "metrics.AssetsByOwnerResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "metrics.AssetsByProviderResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "metrics.AssetsByTypeResponse": { "type": "object", "properties": { "assets": { "type": "object", "additionalProperties": { "type": "integer" } } } }, "metrics.AssetsWithSchemasResponse": { "type": "object", "properties": { "count": { "type": "integer" } } }, "metrics.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" } } }, "metrics.GetMetricsResponse": { "type": "object", "properties": { "metrics": { "type": "array", "items": { "$ref": "#/definitions/metrics.AggregatedMetric" } }, "query": { "$ref": "#/definitions/metrics.GetMetricsRequest" } } }, "metrics.QueryCount": { "type": "object", "properties": { "count": { "type": "integer" }, "query": { "type": "string" }, "query_type": { "type": "string" } } }, "metrics.TotalAssetsResponse": { "type": "object", "properties": { "count": { "type": "integer" } } }, "plugin.RawPluginConfig": { "type": "object", "additionalProperties": true }, "time.Duration": { "type": "integer", "enum": [ -9223372036854775808, 9223372036854775807, 1, 1000, 1000000, 1000000000, 60000000000, 3600000000000, -9223372036854775808, 9223372036854775807, 1, 1000, 1000000, 1000000000, 60000000000, 3600000000000, -9223372036854775808, 9223372036854775807, 1, 1000, 1000000, 1000000000, 60000000000, 3600000000000 ], "x-enum-varnames": [ "minDuration", "maxDuration", "Nanosecond", "Microsecond", "Millisecond", "Second", "Minute", "Hour", "minDuration", "maxDuration", "Nanosecond", "Microsecond", "Millisecond", "Second", "Minute", "Hour", "minDuration", "maxDuration", "Nanosecond", "Microsecond", "Millisecond", "Second", "Minute", "Hour" ] }, "user.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" } } }, "user.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 }, "role_names": { "type": "array", "minItems": 1, "items": { "type": "string" } }, "username": { "type": "string", "maxLength": 255, "minLength": 3 } } }, "user.Permission": { "type": "object", "properties": { "action": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "resource_type": { "type": "string" } } }, "user.Role": { "type": "object", "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "permissions": { "type": "array", "items": { "$ref": "#/definitions/user.Permission" } } } }, "user.UpdateUserInput": { "type": "object", "properties": { "active": { "type": "boolean" }, "email": { "type": "string" }, "name": { "type": "string" }, "password": { "type": "string", "minLength": 8 }, "preferences": { "type": "object", "additionalProperties": true }, "role_names": { "type": "array", "minItems": 1, "items": { "type": "string" } } } }, "user.User": { "type": "object", "properties": { "active": { "type": "boolean" }, "created_at": { "type": "string" }, "id": { "type": "string" }, "must_change_password": { "type": "boolean" }, "name": { "type": "string" }, "preferences": { "type": "object", "additionalProperties": true }, "roles": { "type": "array", "items": { "$ref": "#/definitions/user.Role" } }, "updated_at": { "type": "string" }, "username": { "type": "string" } } }, "users.CreateAPIKeyRequest": { "type": "object", "required": [ "name" ], "properties": { "expires_in_days": { "type": "integer" }, "name": { "type": "string" } } }, "users.ListUsersResponse": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "total": { "type": "integer" }, "users": { "type": "array", "items": { "$ref": "#/definitions/user.User" } } } }, "users.LoginRequest": { "type": "object", "required": [ "password", "username" ], "properties": { "password": { "type": "string" }, "username": { "type": "string" } } }, "users.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 } } }, "users.TokenResponse": { "type": "object", "properties": { "access_token": { "type": "string" }, "expires_in": { "type": "integer" }, "requires_password_change": { "type": "boolean" }, "token_type": { "type": "string" } } }, "users.UpdatePasswordRequest": { "type": "object", "required": [ "new_password" ], "properties": { "new_password": { "type": "string", "minLength": 8 } } } } }